From d23fcd6bdb15ad56c551647a525bad990298bca3 Mon Sep 17 00:00:00 2001 From: le king fu Date: Thu, 5 Mar 2026 14:58:54 -0500 Subject: [PATCH] Add bilingual changelog page and file-based release notes - Create CHANGELOG.fr.md with full French translation of all versions - Add ChangelogPage (/changelog) accessible from Settings - Replace hardcoded i18n release notes with file-based approach: loads CHANGELOG.md or CHANGELOG.fr.md based on user language - CI copies changelogs to public/ during release build - Update CLAUDE.md with bilingual changelog deployment process (fixes #10) Co-Authored-By: Claude Opus 4.6 --- .forgejo/workflows/release.yml | 5 + CHANGELOG.fr.md | 205 ++++++++++++++++++++++++++++++++ CHANGELOG.md | 8 ++ CLAUDE.md | 9 +- public/CHANGELOG.fr.md | 205 ++++++++++++++++++++++++++++++++ public/CHANGELOG.md | 206 +++++++++++++++++++++++++++++++++ src/App.tsx | 2 + src/i18n/locales/en.json | 14 +-- src/i18n/locales/fr.json | 14 +-- src/pages/ChangelogPage.tsx | 107 +++++++++++++++++ src/pages/SettingsPage.tsx | 59 +++++++++- 11 files changed, 810 insertions(+), 24 deletions(-) create mode 100644 CHANGELOG.fr.md create mode 100644 public/CHANGELOG.fr.md create mode 100644 public/CHANGELOG.md create mode 100644 src/pages/ChangelogPage.tsx diff --git a/.forgejo/workflows/release.yml b/.forgejo/workflows/release.yml index 4a3c329..82618ae 100644 --- a/.forgejo/workflows/release.yml +++ b/.forgejo/workflows/release.yml @@ -67,6 +67,11 @@ jobs: cp src-tauri/target/x86_64-pc-windows-msvc/release/bundle/nsis/*.exe.sig release-assets/ 2>/dev/null || true ls -la release-assets/ + - name: Copy changelogs to public + run: | + cp CHANGELOG.md public/CHANGELOG.md + cp CHANGELOG.fr.md public/CHANGELOG.fr.md + - name: Extract changelog id: changelog run: | diff --git a/CHANGELOG.fr.md b/CHANGELOG.fr.md new file mode 100644 index 0000000..746e13f --- /dev/null +++ b/CHANGELOG.fr.md @@ -0,0 +1,205 @@ +# Journal des modifications + +## [Non publié] + +### Ajouté +- Page historique des versions : historique complet accessible depuis les Paramètres à tout moment +- Changelog bilingue : les notes de version s'affichent dans la langue choisie par l'utilisateur (FR/EN) + +### Corrigé +- Visibilité des labels de graphiques : les montants sur les barres empilées utilisent maintenant du texte noir avec contour blanc pour un meilleur contraste (#8) +- Tableau de budget : les cellules éditables affichent maintenant un fond au survol, un curseur pointeur et une info-bulle pour clarifier l'interaction (#9) + +## [0.6.0] + +### Ajouté +- Rapports : bascule entre vue tableau et graphique pour les onglets Tendances, Par catégorie et Évolution +- Rapports : option « Afficher les montants » pour afficher les valeurs directement sur les barres et courbes +- Rapports : panneau de filtres avec cases à cocher par catégorie (recherche, tout sélectionner/désélectionner) et filtre par source +- Rapports : le filtre source s'applique au niveau SQL pour des totaux filtrés précis +- Rapports : en-têtes de tableau fixes sur tous les tableaux de rapports (Rapport dynamique, Budget vs Réel) +- Rapports : survol interactif — barres non survolées estompées, info-bulle filtrée sur la catégorie survolée +- Rapports : le survol de la légende met en évidence la catégorie sur tous les mois (graphique Évolution) + +### Corrigé +- Tableau des transactions : l'icône de commentaire devient orange (comme l'icône de ventilation) quand une note est présente (#7) + +## [0.5.0] + +### Ajouté +- Gestion d'erreurs : intercepte les plantages React et affiche une page d'erreur au lieu d'un écran blanc +- Délai de démarrage (10 s) sur la connexion à la base de données — affiche une page d'erreur au lieu d'un indicateur de chargement infini +- Page d'erreur avec « Rafraîchir », « Vérifier les mises à jour » et liens de contact +- Visionneuse de journaux dans les paramètres — capture la sortie console, filtrable par niveau, copiable, persiste entre les rafraîchissements +- Licence GPL-3.0 — le projet est maintenant open source + +### Modifié +- Modale détail de rapport : colonnes triables — cliquez sur les en-têtes pour trier par date, description ou montant (#1) +- Modale détail de rapport : bascule pour afficher/masquer la colonne des montants (#3) +- Tableau de budget : les en-têtes de colonnes restent fixes lors du défilement vertical (#2) + +### Corrigé +- Mise à jour automatique sur Linux : le champ version de `latest.json` n'a plus le préfixe `v`, téléversement au registre de paquets plus robuste +- Nouvelle tentative au démarrage : la connexion BD réessaie jusqu'à 3 fois avant d'afficher la page d'erreur (corrige l'échec au premier lancement sur Windows) +- Somme de contrôle de migration : répare automatiquement la somme de contrôle obsolète de la migration 1 au démarrage + +## [0.4.4] + +### Corrigé +- Le binaire Linux est maintenant compatible avec glibc 2.35+ (Ubuntu 22.04 / Pop!_OS) — le CI compile dans un conteneur Ubuntu 22.04 + +## [0.4.3] + +### Corrigé +- Le point de terminaison de mise à jour automatique utilise maintenant le registre de paquets Forgejo pour une URL stable +- Les signatures Linux (.AppImage.sig) sont maintenant correctement collectées dans le CI +- Toutes les signatures de plateforme (.deb.sig, .rpm.sig) sont maintenant incluses dans les assets de la release + +## [0.4.2] + +### Modifié +- La mise à jour automatique pointe maintenant vers l'instance Forgejo auto-hébergée +- Les builds Windows sont maintenant compilés en croisé via cargo-xwin + +## [0.4.1] + +### Corrigé +- Application bloquée sur un indicateur de chargement infini après mise à jour depuis v0.3.x (somme de contrôle de migration incompatible sur seed_categories.sql) +- Les erreurs de connexion BD sont maintenant journalisées dans la console au lieu d'échouer silencieusement + +## [0.4.0] + +### Ajouté +- Catégories : support de 3 niveaux de hiérarchie (ex : Dépenses récurrentes → Assurances → Assurance-auto) +- Rapport dynamique : nouveau champ « Catégorie (Niveau 3) » +- Budget : sous-totaux intermédiaires et indentation 3 niveaux pour les catégories imbriquées +- Catégories : gestion automatique de `is_inputable` à la création/suppression de sous-catégories +- Catégories : la validation de profondeur empêche la création d'un 4e niveau +- Données initiales : Assurances divisées en Assurance-auto, Assurance-habitation, Assurance-vie + +### Corrigé +- Auto-catégorisation : les mots-clés commençant/finissant par des caractères spéciaux (`[`, `]`, `(`, `)`, `-`, etc.) sont maintenant reconnus +- Auto-catégorisation : pré-compilation des regex pour de meilleures performances en lot + +## [0.3.11] + +### Ajouté +- Rapport dynamique : support de plusieurs dimensions en colonnes (clés composites) + +### Corrigé +- Rapport dynamique : n'est plus affecté par les filtres de date globaux — utilise uniquement ses propres filtres du panneau + +## [0.3.10] + +### Ajouté +- Rapport dynamique : les champs peuvent maintenant être utilisés dans plusieurs zones simultanément (lignes + filtres, colonnes + filtres) +- Rapport dynamique : clic-droit sur une valeur de filtre pour l'exclure (affiché barré en rouge) +- Option de période « Cette année » dans les rapports et le tableau de bord (du 1er janvier à aujourd'hui) + +## [0.3.9] + +### Ajouté +- Rapport dynamique (tableau croisé) : composez des rapports personnalisés en assignant des dimensions aux lignes, colonnes, filtres et mesures aux valeurs +- Suppression de mots-clés depuis la vue « Tous les mots-clés » + +## [0.3.8] + +### Ajouté +- Sélecteur de plage de dates personnalisée pour les rapports et le tableau de bord +- Bascule pour positionner les sous-totaux au-dessus ou en dessous des lignes de détail +- Affichage des notes de version du CHANGELOG dans les releases et le système de mise à jour + +## [0.3.7] + +### Corrigé +- Suppression du bundle MSI pour éviter le conflit de chemin d'installation du système de mise à jour +- Changement du mode d'installation Windows à basicUi +- Amélioration de la visibilité de l'indicateur de ventilation et de la mise en page des ajustements + +## 0.3.2 + +### Nouvelles fonctionnalités +- **Support Linux** : ajout des builds Linux (`.deb`, `.rpm`, `.AppImage`) au workflow de release +- **Ventilations sur la page Ajustements** : visualisez les ajustements de ventilation des transactions dans une section dédiée + +### Corrigé +- Correction de cas limites de détection automatique CSV +- Suppression de l'accent dans productName pour la compatibilité `.deb` Linux + +## 0.3.1 + +### Corrigé +- Toujours afficher le sélecteur de profil dans la barre latérale (#2) + +## 0.3.0 + +### Nouvelles fonctionnalités +- **Profils multiples** : créez plusieurs profils avec des bases de données séparées, des noms et couleurs personnalisés +- **Protection par NIP** : protégez les profils avec un NIP numérique optionnel +- **Sélecteur de profil** : changement rapide de profil depuis la barre latérale +- **Glisser-déposer les catégories** : réordonnez les catégories ou changez le parent par glisser-déposer dans l'arborescence +- **Ventilation des transactions** : ventilez une transaction sur plusieurs catégories avec des montants ajustables + +## 0.2.10 + +### Nouvelles fonctionnalités +- **Sélection rapide de période** : boutons de filtre rapide (Ce mois, Mois dernier, etc.) sur la page Transactions +- **Rapport Budget vs Réel** : tableau comparatif mensuel et cumulatif annuel dans les Rapports +- **Sous-totaux de catégories parentes** : la page Budget affiche les sous-totaux agrégés pour les catégories parentes +- **Guide utilisateur** : documentation complète accessible depuis les Paramètres, imprimable en PDF + +### Améliorations +- Persistance de la sélection de modèle et ajout du bouton Mettre à jour le modèle +- Ne plus pré-sélectionner les fichiers déjà importés à l'entrée de la configuration source +- Rendre les imports de données de paramètres visibles dans l'historique d'import +- Remplacer les boutons de suppression par modèle par un seul bouton sur la sélection +- Remplacer l'icône de rafraîchissement par une icône de sauvegarde sur le bouton de mise à jour du modèle +- Ajout de la convention de signe à la page budget + +## 0.2.9 + +### Corrigé +- Permettre les fichiers à contenu identique avec des noms différents (#1) + +## 0.2.8 + +### Nouvelles fonctionnalités +- **Export/import de données** : exportez et importez vos données (transactions, catégories, ou les deux) avec chiffrement AES-256-GCM optionnel (#3) + +### Corrigé +- Détection de doublons inter-fichiers et suivi d'import par fichier + +## 0.2.5 + +### Nouvelles fonctionnalités +- **Modèles de configuration d'import** : sauvegardez et chargez les configurations de source d'import comme modèles réutilisables +- **Grille de budget 12 mois** : vue budgétaire annuelle complète avec cellules mensuelles et totaux annuels + +### Corrigé +- Corrections du budget et des catégories +- Problème de somme de contrôle de migration (schema.sql ne doit pas être modifié après la release initiale) + +## 0.2.3 + +### Nouvelles fonctionnalités +- **Motifs de graphiques** : ajout de motifs de remplissage SVG (lignes diagonales, points, hachures, etc.) pour différencier les catégories dans les graphiques au-delà de la couleur +- **Menu contextuel des graphiques** : clic-droit sur une catégorie dans un graphique pour la masquer ou voir ses transactions dans une fenêtre de détail +- **Catégories masquées** : les catégories masquées apparaissent comme des puces au-dessus des graphiques avec un bouton « Tout afficher » +- **Modale de détail des transactions** : visualisez toutes les transactions composant le total d'une catégorie directement depuis n'importe quel graphique +- **Aperçu d'import en popup** : l'aperçu des données est maintenant une modale popup au lieu d'une étape séparée de l'assistant +- **Vérification directe des doublons** : nouveau bouton « Vérifier les doublons » sur la page de configuration d'import + +### Améliorations +- Flux de l'assistant d'import simplifié : configuration source → vérification des doublons (l'aperçu est optionnel via popup) +- Le bouton retour de la vérification des doublons retourne maintenant à la configuration source + +## 0.2.2 + +- Mise à jour de version + +## 0.2.1 + +- Ajout de la vue « Tous les mots-clés » sur la page Catégories +- Ajout du mode sombre avec palette de gris chauds +- Correction des catégories orphelines, persistance de has_header pour les imports, ajout de la réinitialisation +- Ajout des pages Budget et Ajustements diff --git a/CHANGELOG.md b/CHANGELOG.md index 4320f2d..02a99e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ ## [Unreleased] +### Added +- Changelog page: full version history accessible from Settings at any time +- Bilingual changelog: release notes displayed in the user's selected language (EN/FR) + +### Fixed +- Chart label visibility: amount labels on stacked bar charts now use black text with white outline for better contrast (#8) +- Budget table: editable cells now show hover background, pointer cursor, and tooltip hint for clearer affordance (#9) + ## [0.6.0] ### Added diff --git a/CLAUDE.md b/CLAUDE.md index 2e3dbaf..9d6435b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -135,9 +135,12 @@ La documentation technique est centralisée dans `docs/` : - Décision technique structurante (choix de librairie, pattern architectural, changement de stratégie) → créer un nouvel ADR dans `docs/adr/` - Changement affectant l'utilisation de l'app → mettre à jour `docs/guide-utilisateur.md` et les traductions i18n correspondantes (`src/i18n/locales/fr.json`, `src/i18n/locales/en.json`, clés sous `docs.*`) -**Règle CHANGELOG :** tout changement affectant le comportement utilisateur → ajouter une entrée sous `## [Unreleased]` dans `CHANGELOG.md` -- Catégories : Added, Changed, Fixed, Removed -- Format [Keep a Changelog](https://keepachangelog.com/). Le contenu est extrait automatiquement par le CI pour les release notes GitHub et affiché dans l'app. +**Règle CHANGELOG :** tout changement affectant le comportement utilisateur → ajouter une entrée sous `## [Unreleased]` dans **les deux fichiers** : +- `CHANGELOG.md` (anglais) — source principale +- `CHANGELOG.fr.md` (français) — traduction +- Catégories : Added/Ajouté, Changed/Modifié, Fixed/Corrigé, Removed/Supprimé +- Format [Keep a Changelog](https://keepachangelog.com/). Le contenu est extrait automatiquement par le CI pour les release notes et affiché dans l'app selon la langue de l'utilisateur. +- Les deux fichiers sont copiés dans `public/` par le CI (`release.yml`). En dev, synchroniser manuellement : `cp CHANGELOG*.md public/` --- diff --git a/public/CHANGELOG.fr.md b/public/CHANGELOG.fr.md new file mode 100644 index 0000000..746e13f --- /dev/null +++ b/public/CHANGELOG.fr.md @@ -0,0 +1,205 @@ +# Journal des modifications + +## [Non publié] + +### Ajouté +- Page historique des versions : historique complet accessible depuis les Paramètres à tout moment +- Changelog bilingue : les notes de version s'affichent dans la langue choisie par l'utilisateur (FR/EN) + +### Corrigé +- Visibilité des labels de graphiques : les montants sur les barres empilées utilisent maintenant du texte noir avec contour blanc pour un meilleur contraste (#8) +- Tableau de budget : les cellules éditables affichent maintenant un fond au survol, un curseur pointeur et une info-bulle pour clarifier l'interaction (#9) + +## [0.6.0] + +### Ajouté +- Rapports : bascule entre vue tableau et graphique pour les onglets Tendances, Par catégorie et Évolution +- Rapports : option « Afficher les montants » pour afficher les valeurs directement sur les barres et courbes +- Rapports : panneau de filtres avec cases à cocher par catégorie (recherche, tout sélectionner/désélectionner) et filtre par source +- Rapports : le filtre source s'applique au niveau SQL pour des totaux filtrés précis +- Rapports : en-têtes de tableau fixes sur tous les tableaux de rapports (Rapport dynamique, Budget vs Réel) +- Rapports : survol interactif — barres non survolées estompées, info-bulle filtrée sur la catégorie survolée +- Rapports : le survol de la légende met en évidence la catégorie sur tous les mois (graphique Évolution) + +### Corrigé +- Tableau des transactions : l'icône de commentaire devient orange (comme l'icône de ventilation) quand une note est présente (#7) + +## [0.5.0] + +### Ajouté +- Gestion d'erreurs : intercepte les plantages React et affiche une page d'erreur au lieu d'un écran blanc +- Délai de démarrage (10 s) sur la connexion à la base de données — affiche une page d'erreur au lieu d'un indicateur de chargement infini +- Page d'erreur avec « Rafraîchir », « Vérifier les mises à jour » et liens de contact +- Visionneuse de journaux dans les paramètres — capture la sortie console, filtrable par niveau, copiable, persiste entre les rafraîchissements +- Licence GPL-3.0 — le projet est maintenant open source + +### Modifié +- Modale détail de rapport : colonnes triables — cliquez sur les en-têtes pour trier par date, description ou montant (#1) +- Modale détail de rapport : bascule pour afficher/masquer la colonne des montants (#3) +- Tableau de budget : les en-têtes de colonnes restent fixes lors du défilement vertical (#2) + +### Corrigé +- Mise à jour automatique sur Linux : le champ version de `latest.json` n'a plus le préfixe `v`, téléversement au registre de paquets plus robuste +- Nouvelle tentative au démarrage : la connexion BD réessaie jusqu'à 3 fois avant d'afficher la page d'erreur (corrige l'échec au premier lancement sur Windows) +- Somme de contrôle de migration : répare automatiquement la somme de contrôle obsolète de la migration 1 au démarrage + +## [0.4.4] + +### Corrigé +- Le binaire Linux est maintenant compatible avec glibc 2.35+ (Ubuntu 22.04 / Pop!_OS) — le CI compile dans un conteneur Ubuntu 22.04 + +## [0.4.3] + +### Corrigé +- Le point de terminaison de mise à jour automatique utilise maintenant le registre de paquets Forgejo pour une URL stable +- Les signatures Linux (.AppImage.sig) sont maintenant correctement collectées dans le CI +- Toutes les signatures de plateforme (.deb.sig, .rpm.sig) sont maintenant incluses dans les assets de la release + +## [0.4.2] + +### Modifié +- La mise à jour automatique pointe maintenant vers l'instance Forgejo auto-hébergée +- Les builds Windows sont maintenant compilés en croisé via cargo-xwin + +## [0.4.1] + +### Corrigé +- Application bloquée sur un indicateur de chargement infini après mise à jour depuis v0.3.x (somme de contrôle de migration incompatible sur seed_categories.sql) +- Les erreurs de connexion BD sont maintenant journalisées dans la console au lieu d'échouer silencieusement + +## [0.4.0] + +### Ajouté +- Catégories : support de 3 niveaux de hiérarchie (ex : Dépenses récurrentes → Assurances → Assurance-auto) +- Rapport dynamique : nouveau champ « Catégorie (Niveau 3) » +- Budget : sous-totaux intermédiaires et indentation 3 niveaux pour les catégories imbriquées +- Catégories : gestion automatique de `is_inputable` à la création/suppression de sous-catégories +- Catégories : la validation de profondeur empêche la création d'un 4e niveau +- Données initiales : Assurances divisées en Assurance-auto, Assurance-habitation, Assurance-vie + +### Corrigé +- Auto-catégorisation : les mots-clés commençant/finissant par des caractères spéciaux (`[`, `]`, `(`, `)`, `-`, etc.) sont maintenant reconnus +- Auto-catégorisation : pré-compilation des regex pour de meilleures performances en lot + +## [0.3.11] + +### Ajouté +- Rapport dynamique : support de plusieurs dimensions en colonnes (clés composites) + +### Corrigé +- Rapport dynamique : n'est plus affecté par les filtres de date globaux — utilise uniquement ses propres filtres du panneau + +## [0.3.10] + +### Ajouté +- Rapport dynamique : les champs peuvent maintenant être utilisés dans plusieurs zones simultanément (lignes + filtres, colonnes + filtres) +- Rapport dynamique : clic-droit sur une valeur de filtre pour l'exclure (affiché barré en rouge) +- Option de période « Cette année » dans les rapports et le tableau de bord (du 1er janvier à aujourd'hui) + +## [0.3.9] + +### Ajouté +- Rapport dynamique (tableau croisé) : composez des rapports personnalisés en assignant des dimensions aux lignes, colonnes, filtres et mesures aux valeurs +- Suppression de mots-clés depuis la vue « Tous les mots-clés » + +## [0.3.8] + +### Ajouté +- Sélecteur de plage de dates personnalisée pour les rapports et le tableau de bord +- Bascule pour positionner les sous-totaux au-dessus ou en dessous des lignes de détail +- Affichage des notes de version du CHANGELOG dans les releases et le système de mise à jour + +## [0.3.7] + +### Corrigé +- Suppression du bundle MSI pour éviter le conflit de chemin d'installation du système de mise à jour +- Changement du mode d'installation Windows à basicUi +- Amélioration de la visibilité de l'indicateur de ventilation et de la mise en page des ajustements + +## 0.3.2 + +### Nouvelles fonctionnalités +- **Support Linux** : ajout des builds Linux (`.deb`, `.rpm`, `.AppImage`) au workflow de release +- **Ventilations sur la page Ajustements** : visualisez les ajustements de ventilation des transactions dans une section dédiée + +### Corrigé +- Correction de cas limites de détection automatique CSV +- Suppression de l'accent dans productName pour la compatibilité `.deb` Linux + +## 0.3.1 + +### Corrigé +- Toujours afficher le sélecteur de profil dans la barre latérale (#2) + +## 0.3.0 + +### Nouvelles fonctionnalités +- **Profils multiples** : créez plusieurs profils avec des bases de données séparées, des noms et couleurs personnalisés +- **Protection par NIP** : protégez les profils avec un NIP numérique optionnel +- **Sélecteur de profil** : changement rapide de profil depuis la barre latérale +- **Glisser-déposer les catégories** : réordonnez les catégories ou changez le parent par glisser-déposer dans l'arborescence +- **Ventilation des transactions** : ventilez une transaction sur plusieurs catégories avec des montants ajustables + +## 0.2.10 + +### Nouvelles fonctionnalités +- **Sélection rapide de période** : boutons de filtre rapide (Ce mois, Mois dernier, etc.) sur la page Transactions +- **Rapport Budget vs Réel** : tableau comparatif mensuel et cumulatif annuel dans les Rapports +- **Sous-totaux de catégories parentes** : la page Budget affiche les sous-totaux agrégés pour les catégories parentes +- **Guide utilisateur** : documentation complète accessible depuis les Paramètres, imprimable en PDF + +### Améliorations +- Persistance de la sélection de modèle et ajout du bouton Mettre à jour le modèle +- Ne plus pré-sélectionner les fichiers déjà importés à l'entrée de la configuration source +- Rendre les imports de données de paramètres visibles dans l'historique d'import +- Remplacer les boutons de suppression par modèle par un seul bouton sur la sélection +- Remplacer l'icône de rafraîchissement par une icône de sauvegarde sur le bouton de mise à jour du modèle +- Ajout de la convention de signe à la page budget + +## 0.2.9 + +### Corrigé +- Permettre les fichiers à contenu identique avec des noms différents (#1) + +## 0.2.8 + +### Nouvelles fonctionnalités +- **Export/import de données** : exportez et importez vos données (transactions, catégories, ou les deux) avec chiffrement AES-256-GCM optionnel (#3) + +### Corrigé +- Détection de doublons inter-fichiers et suivi d'import par fichier + +## 0.2.5 + +### Nouvelles fonctionnalités +- **Modèles de configuration d'import** : sauvegardez et chargez les configurations de source d'import comme modèles réutilisables +- **Grille de budget 12 mois** : vue budgétaire annuelle complète avec cellules mensuelles et totaux annuels + +### Corrigé +- Corrections du budget et des catégories +- Problème de somme de contrôle de migration (schema.sql ne doit pas être modifié après la release initiale) + +## 0.2.3 + +### Nouvelles fonctionnalités +- **Motifs de graphiques** : ajout de motifs de remplissage SVG (lignes diagonales, points, hachures, etc.) pour différencier les catégories dans les graphiques au-delà de la couleur +- **Menu contextuel des graphiques** : clic-droit sur une catégorie dans un graphique pour la masquer ou voir ses transactions dans une fenêtre de détail +- **Catégories masquées** : les catégories masquées apparaissent comme des puces au-dessus des graphiques avec un bouton « Tout afficher » +- **Modale de détail des transactions** : visualisez toutes les transactions composant le total d'une catégorie directement depuis n'importe quel graphique +- **Aperçu d'import en popup** : l'aperçu des données est maintenant une modale popup au lieu d'une étape séparée de l'assistant +- **Vérification directe des doublons** : nouveau bouton « Vérifier les doublons » sur la page de configuration d'import + +### Améliorations +- Flux de l'assistant d'import simplifié : configuration source → vérification des doublons (l'aperçu est optionnel via popup) +- Le bouton retour de la vérification des doublons retourne maintenant à la configuration source + +## 0.2.2 + +- Mise à jour de version + +## 0.2.1 + +- Ajout de la vue « Tous les mots-clés » sur la page Catégories +- Ajout du mode sombre avec palette de gris chauds +- Correction des catégories orphelines, persistance de has_header pour les imports, ajout de la réinitialisation +- Ajout des pages Budget et Ajustements diff --git a/public/CHANGELOG.md b/public/CHANGELOG.md new file mode 100644 index 0000000..02a99e1 --- /dev/null +++ b/public/CHANGELOG.md @@ -0,0 +1,206 @@ +# Changelog + +## [Unreleased] + +### Added +- Changelog page: full version history accessible from Settings at any time +- Bilingual changelog: release notes displayed in the user's selected language (EN/FR) + +### Fixed +- Chart label visibility: amount labels on stacked bar charts now use black text with white outline for better contrast (#8) +- Budget table: editable cells now show hover background, pointer cursor, and tooltip hint for clearer affordance (#9) + +## [0.6.0] + +### Added +- Reports: toggle between table and chart view for Trends, By Category, and Over Time tabs +- Reports: "Show amounts" toggle displays values directly on chart bars and area curves +- Reports: filter panel with category checkboxes (search, select all/none) and source dropdown +- Reports: source filter applies at SQL level for accurate filtered totals +- Reports: sticky table headers on all report tables (Dynamic Report, Budget vs Actual) +- Reports: interactive hover — dimmed non-hovered bars, tooltip filtered to hovered category +- Reports: legend hover highlights category across all months (Over Time chart) + +### Fixed +- Transaction table: comment icon now turns orange (like split icon) when a note is present (#7) + +## [0.5.0] + +### Added +- Error boundary catches React crashes and displays an error page instead of a white screen +- Startup timeout (10s) on database connection — shows error page instead of infinite spinner +- Error page with "Refresh", "Check for updates", and contact/issue links +- Log viewer in settings page — captures console output, filterable by level, copyable, persists across refresh +- GPL-3.0 license — project is now open source + +### Changed +- Report detail modal: sortable columns — click headers to sort by date, description, or amount (#1) +- Report detail modal: toggle to show/hide amounts column (#3) +- Budget table: column headers stay fixed when scrolling vertically (#2) + +### Fixed +- Auto-updater on Linux: `latest.json` version field no longer has `v` prefix, package registry upload is more robust +- Startup retry: DB connection retries up to 3 times before showing error page (fixes first-launch failure on Windows) +- Migration checksum mismatch: automatically repairs stale migration 1 checksum on startup + +## [0.4.4] + +### Fixed +- Linux binary now compatible with glibc 2.35+ (Ubuntu 22.04 / Pop!_OS) — CI builds in Ubuntu 22.04 container + +## [0.4.3] + +### Fixed +- Auto-updater endpoint now uses Forgejo package registry for stable URL +- Linux updater signatures (.AppImage.sig) now correctly collected in CI +- All platform signatures (.deb.sig, .rpm.sig) now included in release assets + +## [0.4.2] + +### Changed +- Auto-updater now points to self-hosted Forgejo instance +- Windows builds now cross-compiled via cargo-xwin + +## [0.4.1] + +### Fixed +- App stuck on infinite spinner after updating from v0.3.x (migration checksum mismatch on seed_categories.sql) +- DB connection errors now logged to console instead of silently failing + +## [0.4.0] + +### Added +- Categories: support for 3 levels of hierarchy (e.g., Dépenses récurrentes → Assurances → Assurance-auto) +- Dynamic Report: new "Category (Level 3)" pivot field +- Budget: intermediate subtotals and 3-level indentation for nested categories +- Categories: automatic `is_inputable` management when creating/deleting subcategories +- Categories: depth validation prevents creating a 4th level +- Seed data: Assurances split into Assurance-auto, Assurance-habitation, Assurance-vie + +### Fixed +- Auto-categorization: keywords starting/ending with special characters (`[`, `]`, `(`, `)`, `-`, etc.) now match correctly +- Auto-categorization: pre-compile regex patterns for better batch performance + +## [0.3.11] + +### Added +- Dynamic Report: support multiple column dimensions (composite column keys) + +### Fixed +- Dynamic Report: no longer affected by global page date filters — uses only its own panel filters + +## [0.3.10] + +### Added +- Dynamic Report: fields can now be used in multiple zones simultaneously (rows + filters, columns + filters) +- Dynamic Report: right-click on a filter value to exclude it (shown with strikethrough in red) +- "This year" period option in reports and dashboard (Jan 1 to today) + +## [0.3.9] + +### Added +- Dynamic Report (pivot table): compose custom reports by assigning dimensions to rows, columns, filters and measures to values +- Delete keywords from the "All Keywords" view + +## [0.3.8] + +### Added +- Custom date range picker for reports and dashboard +- Toggle to position subtotals above or below detail rows +- Display release notes from CHANGELOG in GitHub releases and in-app updater + +## [0.3.7] + +### Fixes +- Remove MSI bundle to prevent updater install path conflict +- Change Windows updater installMode to basicUi +- Improve split indicator visibility and adjustments layout + +## 0.3.2 + +### New Features +- **Linux support**: Add Linux build (`.deb`, `.rpm`, `.AppImage`) to release workflow +- **Transaction splits on Adjustments page**: View transaction split adjustments in a dedicated section on the Adjustments page + +### Fixes +- Fix CSV auto-detect edge cases +- Remove accent from productName for Linux `.deb` compatibility + +## 0.3.1 + +### Fixes +- Always show profile switcher in sidebar (#2) + +## 0.3.0 + +### New Features +- **Multiple profiles**: Create multiple profiles with separate databases, custom names, and colors +- **PIN protection**: Protect profiles with an optional numeric PIN +- **Profile switcher**: Quick profile switching from the sidebar +- **Drag-and-drop categories**: Reorder categories or change parent via drag-and-drop in the category tree +- **Transaction splits**: Split a transaction across multiple categories with adjustable amounts + +## 0.2.10 + +### New Features +- **Period quick-select**: Add quick period filter buttons (This month, Last month, etc.) on the Transactions page +- **Budget vs Actual report**: Monthly and year-to-date comparison table in Reports +- **Parent category subtotals**: Budget page shows aggregated subtotals for parent categories +- **User guide**: Complete documentation page accessible from Settings, printable to PDF + +### Improvements +- Persist template selection and add Update template button +- Don't pre-select already-imported files when entering source config +- Make settings data imports visible in Import History +- Replace per-template delete buttons with single delete on selection +- Replace refresh icon with save icon on update template button +- Add sign convention to budget page + +## 0.2.9 + +### Fixes +- Allow duplicate-content files with different names (#1) + +## 0.2.8 + +### New Features +- **Data export/import**: Export and import your data (transactions, categories, or both) with optional AES-256-GCM encryption (#3) + +### Fixes +- Cross-file duplicate detection and per-file import tracking + +## 0.2.5 + +### New Features +- **Import config templates**: Save and load import source configurations as reusable templates +- **12-month budget grid**: Full year budget view with monthly cells and annual totals + +### Fixes +- Budget and category fixes +- Migration checksum issue (schema.sql must not be modified after initial release) + +## 0.2.3 + +### New Features +- **Chart patterns**: Added SVG fill patterns (diagonal lines, dots, crosshatch, etc.) to differentiate categories in bar charts, pie chart, and stacked bar charts beyond just color +- **Chart context menu**: Right-click any category in a chart to hide it or view its transactions in a detail popup +- **Hidden categories**: Hidden categories appear as dismissible chips above charts with a "Show all" button to restore them +- **Transaction detail modal**: View all transactions composing a category's total directly from any chart +- **Import preview popup**: The data preview is now a popup modal instead of a separate wizard step, allowing quick inspection without leaving the configuration page +- **Direct duplicate check**: New "Check Duplicates" button on the import configuration page skips directly to duplicate validation without requiring a preview first + +### Improvements +- Import wizard flow simplified: source-config → duplicate-check (preview is optional via popup) +- Duplicate-check back button now returns to source configuration instead of the removed preview step +- Added `categoryIds` map to `CategoryOverTimeData` for proper category resolution in the over-time chart + +## 0.2.2 + +- Bump version + +## 0.2.1 + +- Add "All Keywords" view on Categories page +- Add dark mode with warm gray palette +- Fix orphan categories, persist has_header for imports, add re-initialize +- Add Budget and Adjustments pages diff --git a/src/App.tsx b/src/App.tsx index 03fd839..3288074 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -12,6 +12,7 @@ import BudgetPage from "./pages/BudgetPage"; import ReportsPage from "./pages/ReportsPage"; import SettingsPage from "./pages/SettingsPage"; import DocsPage from "./pages/DocsPage"; +import ChangelogPage from "./pages/ChangelogPage"; import ProfileSelectionPage from "./pages/ProfileSelectionPage"; import ErrorPage from "./components/shared/ErrorPage"; @@ -102,6 +103,7 @@ export default function App() { } /> } /> } /> + } /> diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 7108e35..69ef0c1 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -2,6 +2,11 @@ "app": { "name": "Simpl'Result" }, + "changelog": { + "title": "Version History", + "description": "View what's new and fixed in each version", + "empty": "No entries available" + }, "nav": { "dashboard": "Dashboard", "import": "Import", @@ -423,14 +428,7 @@ "installing": "Installing...", "error": "Update failed", "retryButton": "Retry", - "releaseNotes": "What's New", - "notes": { - "0.4.0": "### Added\n- Categories: support for 3 levels of hierarchy (e.g., Recurring Expenses → Insurance → Car Insurance)\n- Dynamic Report: new \"Category (Level 3)\" pivot field\n- Budget: intermediate subtotals and 3-level indentation for nested categories\n- Categories: automatic `is_inputable` management when creating/deleting subcategories\n- Categories: depth validation prevents creating a 4th level\n\n### Fixed\n- Auto-categorization: keywords starting/ending with special characters (`[`, `]`, `(`, `)`, `-`, etc.) now match correctly\n- Auto-categorization: pre-compile regex patterns for better batch performance", - "0.3.11": "### Added\n- Dynamic Report: support multiple column dimensions (composite column keys)\n\n### Fixed\n- Dynamic Report: no longer affected by global page date filters — uses only its own panel filters", - "0.3.10": "### Added\n- Dynamic Report: fields can now be used in multiple zones simultaneously (rows + filters, columns + filters)\n- Dynamic Report: right-click on a filter value to exclude it (shown with strikethrough in red)\n- \"This year\" period option in reports and dashboard (Jan 1 to today)", - "0.3.9": "### Added\n- Dynamic Report (pivot table): compose custom reports by assigning dimensions to rows, columns, filters and measures to values\n- Delete keywords from the \"All Keywords\" view", - "0.3.8": "### Added\n- Custom date range picker for reports and dashboard\n- Toggle to position subtotals above or below detail rows\n- Display release notes from CHANGELOG in GitHub releases and in-app updater" - } + "releaseNotes": "What's New" }, "dataManagement": { "title": "Data Management", diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json index cd3d3f6..f819d88 100644 --- a/src/i18n/locales/fr.json +++ b/src/i18n/locales/fr.json @@ -2,6 +2,11 @@ "app": { "name": "Simpl'Résultat" }, + "changelog": { + "title": "Historique des versions", + "description": "Consultez les nouveautés et corrections de chaque version", + "empty": "Aucune entrée disponible" + }, "nav": { "dashboard": "Tableau de bord", "import": "Importer", @@ -423,14 +428,7 @@ "installing": "Installation en cours...", "error": "Erreur lors de la mise à jour", "retryButton": "Réessayer", - "releaseNotes": "Nouveautés", - "notes": { - "0.4.0": "### Ajouté\n- Catégories : support de 3 niveaux de hiérarchie (ex : Dépenses récurrentes → Assurances → Assurance-auto)\n- Rapport dynamique : nouveau champ « Catégorie (Niveau 3) »\n- Budget : sous-totaux intermédiaires et indentation 3 niveaux\n- Catégories : gestion automatique de `is_inputable` à la création/suppression de sous-catégories\n- Catégories : validation de profondeur empêche la création d'un 4e niveau\n\n### Corrigé\n- Auto-catégorisation : les mots-clés commençant/finissant par des caractères spéciaux (`[`, `]`, `(`, `)`, `-`, etc.) sont maintenant reconnus\n- Auto-catégorisation : pré-compilation des regex pour de meilleures performances en lot", - "0.3.11": "### Ajouté\n- Rapport dynamique : support de plusieurs dimensions en colonnes (clés composites)\n\n### Corrigé\n- Rapport dynamique : n'est plus affecté par les filtres de date globaux — utilise uniquement ses propres filtres du panneau", - "0.3.10": "### Ajouté\n- Rapport dynamique : les champs peuvent maintenant être utilisés dans plusieurs zones simultanément (lignes + filtres, colonnes + filtres)\n- Rapport dynamique : clic-droit sur une valeur de filtre pour l'exclure (affiché barré en rouge)\n- Option de période « Cette année » dans les rapports et le tableau de bord (du 1er janvier à aujourd'hui)", - "0.3.9": "### Ajouté\n- Rapport dynamique (tableau croisé) : composez des rapports personnalisés en assignant des dimensions aux lignes, colonnes, filtres et mesures aux valeurs\n- Suppression de mots-clés depuis la vue « Tous les mots-clés »", - "0.3.8": "### Ajouté\n- Sélecteur de plage de dates personnalisée pour les rapports et le tableau de bord\n- Bascule pour positionner les sous-totaux au-dessus ou en dessous des lignes de détail\n- Affichage des notes de version du CHANGELOG dans les releases GitHub et le système de mise à jour" - } + "releaseNotes": "Nouveautés" }, "dataManagement": { "title": "Gestion des données", diff --git a/src/pages/ChangelogPage.tsx b/src/pages/ChangelogPage.tsx new file mode 100644 index 0000000..1e5ee25 --- /dev/null +++ b/src/pages/ChangelogPage.tsx @@ -0,0 +1,107 @@ +import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { Link } from "react-router-dom"; +import { ArrowLeft } from "lucide-react"; + +interface ChangelogEntry { + version: string; + sections: { heading: string; items: string[] }[]; +} + +function parseChangelog(markdown: string): ChangelogEntry[] { + const entries: ChangelogEntry[] = []; + let current: ChangelogEntry | null = null; + let currentSection: { heading: string; items: string[] } | null = null; + + for (const line of markdown.split("\n")) { + const trimmed = line.trim(); + + // Version heading: ## [0.6.0] or ## 0.6.0 + const versionMatch = trimmed.match(/^## \[?([^\]]+)\]?/); + if (versionMatch) { + if (currentSection && current) current.sections.push(currentSection); + if (current) entries.push(current); + current = { version: versionMatch[1], sections: [] }; + currentSection = null; + continue; + } + + // Section heading: ### Added, ### Corrigé, etc. + const sectionMatch = trimmed.match(/^### (.+)/); + if (sectionMatch && current) { + if (currentSection) current.sections.push(currentSection); + currentSection = { heading: sectionMatch[1], items: [] }; + continue; + } + + // List item + if (trimmed.startsWith("- ") && currentSection) { + currentSection.items.push(trimmed.slice(2)); + } + } + + if (currentSection && current) current.sections.push(currentSection); + if (current) entries.push(current); + + return entries; +} + +export default function ChangelogPage() { + const { t, i18n } = useTranslation(); + const [entries, setEntries] = useState([]); + + useEffect(() => { + const file = i18n.language === "fr" ? "/CHANGELOG.fr.md" : "/CHANGELOG.md"; + fetch(file) + .then((r) => r.text()) + .then((text) => setEntries(parseChangelog(text))) + .catch(() => setEntries([])); + }, [i18n.language]); + + return ( +
+
+ + + +

{t("changelog.title")}

+
+ + {entries.length === 0 ? ( +

{t("changelog.empty")}

+ ) : ( +
+ {entries.map((entry) => ( +
+

{entry.version}

+ {entry.sections.map((section, si) => ( +
+

+ {section.heading} +

+
    + {section.items.map((item, ii) => ( +
  • + {"\u2022 "} + {item.replace(/\*\*(.+?)\*\*/g, "$1")} +
  • + ))} +
+
+ ))} +
+ ))} +
+ )} +
+ ); +} diff --git a/src/pages/SettingsPage.tsx b/src/pages/SettingsPage.tsx index a8d1a12..6e56b16 100644 --- a/src/pages/SettingsPage.tsx +++ b/src/pages/SettingsPage.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from "react"; +import { useEffect, useState, useCallback } from "react"; import { useTranslation } from "react-i18next"; import { Info, @@ -11,6 +11,7 @@ import { ShieldCheck, BookOpen, ChevronRight, + FileText, } from "lucide-react"; import { getVersion } from "@tauri-apps/api/app"; import { useUpdater } from "../hooks/useUpdater"; @@ -21,15 +22,44 @@ import DataManagementCard from "../components/settings/DataManagementCard"; import LogViewerCard from "../components/settings/LogViewerCard"; export default function SettingsPage() { - const { t } = useTranslation(); + const { t, i18n } = useTranslation(); const { state, checkForUpdate, downloadAndInstall, installAndRestart } = useUpdater(); const [version, setVersion] = useState(""); + const [releaseNotes, setReleaseNotes] = useState(null); + + const fetchReleaseNotes = useCallback( + (targetVersion: string) => { + const file = + i18n.language === "fr" ? "/CHANGELOG.fr.md" : "/CHANGELOG.md"; + fetch(file) + .then((r) => r.text()) + .then((text) => { + const escaped = targetVersion.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const re = new RegExp( + `^## \\[?${escaped}\\]?.*$\\n([\\s\\S]*?)(?=^## |$(?!\\n))`, + "m", + ); + const match = text.match(re); + setReleaseNotes( + match ? match[1].trim() : null, + ); + }) + .catch(() => setReleaseNotes(null)); + }, + [i18n.language], + ); useEffect(() => { getVersion().then(setVersion); }, []); + useEffect(() => { + if (state.status === "available" && state.version) { + fetchReleaseNotes(state.version); + } + }, [state.status, state.version, fetchReleaseNotes]); + const progressPercent = state.contentLength && state.contentLength > 0 ? Math.round((state.progress / state.contentLength) * 100) @@ -78,6 +108,27 @@ export default function SettingsPage() { + {/* Changelog card */} + +
+
+
+ +
+
+

{t("changelog.title")}

+

+ {t("changelog.description")} +

+
+
+ +
+ + {/* Update card */}

@@ -127,9 +178,7 @@ export default function SettingsPage() { {t("settings.updates.available", { version: state.version })}

{(() => { - const notesKey = `settings.updates.notes.${state.version}`; - const i18nNotes = t(notesKey, { defaultValue: "" }); - const notes = i18nNotes || state.body; + const notes = releaseNotes || state.body; if (!notes) return null; return (