From 132f8ccec242cc28d2d1a07fa91fb06dca003f6d Mon Sep 17 00:00:00 2001 From: Manus Date: Sun, 12 Apr 2026 15:27:19 -0400 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20isSubscription=20appliqu=C3=A9=20?= =?UTF-8?q?lors=20des=20imports.=20Seuil=20de=20confiance=20persist=C3=A9?= =?UTF-8?q?=20en=20base=20(champ=20learningConfidenceThreshold=20dans=20us?= =?UTF-8?q?erSettings).=20LearningSettings.tsx=20charge=20et=20sauvegarde?= =?UTF-8?q?=20le=20seuil=20via=20settings.get/upsert.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/pages/LearningSettings.tsx | 43 +- drizzle/0019_smooth_lord_hawal.sql | 1 + drizzle/meta/0019_snapshot.json | 1702 +++++++++++++++++++++++++ drizzle/meta/_journal.json | 7 + drizzle/schema.ts | 2 + server/routers.ts | 6 + 6 files changed, 1752 insertions(+), 9 deletions(-) create mode 100644 drizzle/0019_smooth_lord_hawal.sql create mode 100644 drizzle/meta/0019_snapshot.json diff --git a/client/src/pages/LearningSettings.tsx b/client/src/pages/LearningSettings.tsx index 7d3f863..f76456c 100644 --- a/client/src/pages/LearningSettings.tsx +++ b/client/src/pages/LearningSettings.tsx @@ -1,4 +1,4 @@ -import { useState } from "react"; +import { useState, useEffect } from "react"; import DashboardLayout from "@/components/DashboardLayout"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; @@ -34,14 +34,31 @@ const FIELD_COLORS: Record = { isSubscription: "bg-orange-100 text-orange-800", }; -const DEFAULT_CONFIDENCE_THRESHOLD = 2; +const DEFAULT_THRESHOLD = 2; export default function LearningSettings() { const utils = trpc.useUtils(); const { data: learnings, isLoading } = trpc.learnings.list.useQuery(); - const [confidenceThreshold, setConfidenceThreshold] = useState(DEFAULT_CONFIDENCE_THRESHOLD); + const { data: settings, isLoading: settingsLoading } = trpc.settings.get.useQuery(); + + const [confidenceThreshold, setConfidenceThreshold] = useState(DEFAULT_THRESHOLD); const [editingThreshold, setEditingThreshold] = useState(false); - const [thresholdInput, setThresholdInput] = useState(String(DEFAULT_CONFIDENCE_THRESHOLD)); + const [thresholdInput, setThresholdInput] = useState(String(DEFAULT_THRESHOLD)); + + // Sync threshold from DB when settings load + useEffect(() => { + if (settings?.learningConfidenceThreshold != null) { + setConfidenceThreshold(settings.learningConfidenceThreshold); + setThresholdInput(String(settings.learningConfidenceThreshold)); + } + }, [settings?.learningConfidenceThreshold]); + + const upsertSettingsMutation = trpc.settings.upsert.useMutation({ + onSuccess: () => { + utils.settings.get.invalidate(); + }, + onError: () => toast.error("Erreur lors de la sauvegarde du seuil"), + }); const deleteMutation = trpc.learnings.delete.useMutation({ onSuccess: () => { @@ -97,6 +114,7 @@ export default function LearningSettings() { } setConfidenceThreshold(val); setEditingThreshold(false); + upsertSettingsMutation.mutate({ learningConfidenceThreshold: val }); toast.success(`Seuil de confiance mis à jour : ${val} application(s)`); }; @@ -184,10 +202,15 @@ export default function LearningSettings() { Un apprentissage est marqué Confirmé quand il a été appliqué au moins{" "} {confidenceThreshold} fois. En dessous, il est En observation. + Ce réglage est sauvegardé et partagé entre toutes vos sessions. - {editingThreshold ? ( + {settingsLoading ? ( +
+ Chargement... +
+ ) : editingThreshold ? (