From 3b9badb7267473381fbb35bc523eeef00c856d21 Mon Sep 17 00:00:00 2001 From: le king fu Date: Sun, 3 May 2026 16:19:20 -0400 Subject: [PATCH] fix(ui): apply WebKitGTK date picker workaround to remaining 7 inputs (#188) Extends PR #189's fix (one input on /balance/snapshot) to the 7 remaining native fields across 4 components: - transactions/TransactionFilterBar.tsx (dateFrom + dateTo) - adjustments/AdjustmentForm.tsx (form.date) - balance/LinkTransfersModal.tsx (from + to) - dashboard/PeriodSelector.tsx (localFrom + localTo) Each onChange handler now calls e.currentTarget.blur() after the state update to dismiss the native date popup on Linux Tauri WebView. The call is a no-op on Windows WebView2 / macOS WKWebView, where the picker already auto-closes. No automated test added: this is a WebKitGTK-specific WebView quirk that cannot be reproduced in jsdom/vitest. Manual smoke test on Linux Tauri dev was the validation, mirroring PR #189's approach. Co-Authored-By: Claude Opus 4.7 (1M context) --- CHANGELOG.fr.md | 1 + CHANGELOG.md | 1 + src/components/adjustments/AdjustmentForm.tsx | 6 +++++- src/components/balance/LinkTransfersModal.tsx | 12 ++++++++++-- src/components/dashboard/PeriodSelector.tsx | 12 ++++++++++-- .../transactions/TransactionFilterBar.tsx | 16 ++++++++++------ 6 files changed, 37 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.fr.md b/CHANGELOG.fr.md index f27b231..fc828f1 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). ## [0.9.0] - 2026-04-29 diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ecf293..4f066ec 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). ## [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)]" /> -- 2.45.2