diff --git a/CHANGELOG.fr.md b/CHANGELOG.fr.md index 6de2ad2..dfc2827 100644 --- a/CHANGELOG.fr.md +++ b/CHANGELOG.fr.md @@ -18,6 +18,7 @@ - Bilan : la sauvegarde d'un snapshot utilise désormais une transaction atomique BEGIN/COMMIT et valide toutes les lignes avant toute écriture en BDD, empêchant les snapshots orphelins lorsque la validation échoue. La migration v11 nettoie les orphelins existants (#176). - Bilan : le sélecteur de date sur `/balance/snapshot` se ferme maintenant après la sélection sur Linux (WebKitGTK) au lieu de rester ouvert jusqu'à ce que l'utilisateur appuie sur Échap. Le contournement appelle `blur()` sur le champ après chaque changement — sans effet sur Windows WebView2 / macOS WKWebView, où le sélecteur se ferme déjà automatiquement (#177). - Mise à jour de la dépendance `postcss` (8.5.6 → 8.5.13) pour corriger l'avis de sécurité de sévérité modérée GHSA-qx2v-qp2m-jg93 (XSS via `` non échappé dans le stringifier CSS). Transitive via vite, build-time uniquement — aucun impact runtime sur le binaire Tauri livré (#180). +- Contournement du sélecteur de date WebKitGTK étendu aux 7 autres champs `` natifs répartis sur 4 composants (barre de filtres Transactions, formulaire Ajustements, modal de Liaison de transferts, sélecteur de période). Chaque handler onChange appelle désormais `e.currentTarget.blur()` pour fermer le popup natif sur Linux Tauri WebView — sans effet sur Windows WebView2 / macOS WKWebView. Même approche que #177 (#188). - Bilan : nettoyage post-merge des suggestions issues des reviews des PR #182-#185. Six corrections groupées : (1) `getStarterCollisions` filtre désormais `archived_at IS NULL`, donc recréer un compte starter volontairement archivé n'est plus bloqué ; (2) `proposeStarterAccounts` re-vérifie chaque collision (nom, catégorie) en transaction avant l'INSERT en défense-in-depth (saut silencieux si déjà présent, aucune contrainte UNIQUE ajoutée) ; (3) les nouveaux profils reçoivent désormais `balance_starter_proposed` pré-seedé dans `consolidated_schema.sql` pour que le StarterAccountsModal ne s'ouvre jamais brièvement avec uniquement des collisions à la première visite de /balance ; (4) `/balance` cache maintenant le sélecteur de période, le graphique d'évolution et le tableau des comptes tant que la carte d'onboarding vide est affichée (évite trois messages vides empilés) ; (5) `BalanceOnboardingCard.Step` appelle directement `useTranslation()` au lieu de recevoir `t` en prop ; (6) le bloc de doc de la formule Modified Dietz dans `return_calculator.rs` est maintenant entouré d'une fence `text` pour que `cargo test --doc` n'essaie plus de compiler la pseudo-math comme du Rust (#187). ## [0.9.0] - 2026-04-29 diff --git a/CHANGELOG.md b/CHANGELOG.md index bf0e508..9f88bb5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ - Bilan: snapshot save now uses atomic BEGIN/COMMIT and validates all lines before any DB write, preventing orphan snapshot rows when validation fails. Migration v11 cleans existing orphans (#176). - Bilan: snapshot date picker on `/balance/snapshot` now closes after a date is selected on Linux (WebKitGTK), instead of staying open until the user pressed Esc. Workaround calls `blur()` on the input after each change — no-op on Windows WebView2 / macOS WKWebView, where the picker already auto-closes (#177). - Updated `postcss` dependency (8.5.6 → 8.5.13) to address moderate severity advisory GHSA-qx2v-qp2m-jg93 (XSS via unescaped `` in CSS stringifier). Transitive via vite, build-time only — no runtime impact on the shipped Tauri binary (#180). +- WebKitGTK date picker workaround extended to the remaining 7 native `` fields across 4 components (Transactions filter bar, Adjustments form, Link Transfers modal, Period selector). Each onChange handler now calls `e.currentTarget.blur()` to dismiss the native popup on Linux Tauri WebView — no-op on Windows WebView2 / macOS WKWebView. Same approach as #177 (#188). - Bilan: post-merge cleanup of suggestions raised in the #182-#185 reviews. Six fixes bundled: (1) `getStarterCollisions` now filters `archived_at IS NULL` so re-creating a voluntarily archived starter is no longer blocked; (2) `proposeStarterAccounts` re-checks each (name, category) collision in-transaction before INSERT as defense-in-depth (skips silently on hit, no UNIQUE constraint added); (3) brand-new profiles now get `balance_starter_proposed` pre-seeded in `consolidated_schema.sql` so the StarterAccountsModal never briefly opens with all-collisions on first /balance visit; (4) `/balance` now hides the period selector, evolution chart and accounts table while the empty-state onboarding card is shown (avoids three stacked empty messages); (5) `BalanceOnboardingCard.Step` now calls `useTranslation()` directly instead of receiving `t` as a prop; (6) `return_calculator.rs` Modified Dietz formula doc block is wrapped in a `text` fence so `cargo test --doc` no longer fails to compile pseudo-math as Rust (#187). ## [0.9.0] - 2026-04-29 diff --git a/src/components/adjustments/AdjustmentForm.tsx b/src/components/adjustments/AdjustmentForm.tsx index 251f236..ab052f1 100644 --- a/src/components/adjustments/AdjustmentForm.tsx +++ b/src/components/adjustments/AdjustmentForm.tsx @@ -71,7 +71,11 @@ export default function AdjustmentForm({ setForm({ ...form, date: e.target.value })} + onChange={(e) => { + setForm({ ...form, date: e.target.value }); + // Close native date popup on WebKitGTK (#177) + e.currentTarget.blur(); + }} className="w-full px-3 py-2 rounded-lg border border-[var(--border)] bg-[var(--card)] text-sm focus:outline-none focus:ring-1 focus:ring-[var(--primary)]" /> diff --git a/src/components/balance/LinkTransfersModal.tsx b/src/components/balance/LinkTransfersModal.tsx index 4a89f19..3a74b86 100644 --- a/src/components/balance/LinkTransfersModal.tsx +++ b/src/components/balance/LinkTransfersModal.tsx @@ -229,7 +229,11 @@ export default function LinkTransfersModal({ setFrom(e.target.value)} + onChange={(e) => { + setFrom(e.target.value); + // Close native date popup on WebKitGTK (#177) + e.currentTarget.blur(); + }} className="w-full px-2 py-1.5 bg-[var(--background)] border border-[var(--border)] rounded text-sm" /> @@ -240,7 +244,11 @@ export default function LinkTransfersModal({ setTo(e.target.value)} + onChange={(e) => { + setTo(e.target.value); + // Close native date popup on WebKitGTK (#177) + e.currentTarget.blur(); + }} className="w-full px-2 py-1.5 bg-[var(--background)] border border-[var(--border)] rounded text-sm" /> diff --git a/src/components/dashboard/PeriodSelector.tsx b/src/components/dashboard/PeriodSelector.tsx index 329af2d..6b709bd 100644 --- a/src/components/dashboard/PeriodSelector.tsx +++ b/src/components/dashboard/PeriodSelector.tsx @@ -94,7 +94,11 @@ export default function PeriodSelector({ setLocalFrom(e.target.value)} + onChange={(e) => { + setLocalFrom(e.target.value); + // Close native date popup on WebKitGTK (#177) + e.currentTarget.blur(); + }} className="px-3 py-1.5 rounded-lg text-sm border border-[var(--border)] bg-[var(--background)] text-[var(--foreground)]" /> @@ -105,7 +109,11 @@ export default function PeriodSelector({ setLocalTo(e.target.value)} + onChange={(e) => { + setLocalTo(e.target.value); + // Close native date popup on WebKitGTK (#177) + e.currentTarget.blur(); + }} className="px-3 py-1.5 rounded-lg text-sm border border-[var(--border)] bg-[var(--background)] text-[var(--foreground)]" /> diff --git a/src/components/transactions/TransactionFilterBar.tsx b/src/components/transactions/TransactionFilterBar.tsx index baaf002..aa1d505 100644 --- a/src/components/transactions/TransactionFilterBar.tsx +++ b/src/components/transactions/TransactionFilterBar.tsx @@ -167,9 +167,11 @@ export default function TransactionFilterBar({ - onFilterChange("dateFrom", e.target.value || null) - } + onChange={(e) => { + onFilterChange("dateFrom", e.target.value || null); + // Close native date popup on WebKitGTK (#177) + e.currentTarget.blur(); + }} placeholder={t("transactions.filters.dateFrom")} className="px-3 py-2 text-sm rounded-lg border border-[var(--border)] bg-[var(--background)] text-[var(--foreground)] focus:outline-none focus:ring-1 focus:ring-[var(--primary)]" /> @@ -177,9 +179,11 @@ export default function TransactionFilterBar({ - onFilterChange("dateTo", e.target.value || null) - } + onChange={(e) => { + onFilterChange("dateTo", e.target.value || null); + // Close native date popup on WebKitGTK (#177) + e.currentTarget.blur(); + }} placeholder={t("transactions.filters.dateTo")} className="px-3 py-2 text-sm rounded-lg border border-[var(--border)] bg-[var(--background)] text-[var(--foreground)] focus:outline-none focus:ring-1 focus:ring-[var(--primary)]" />