diff --git a/messages/de.json b/messages/de.json index 925dd1686..b15ed4084 100644 --- a/messages/de.json +++ b/messages/de.json @@ -7239,6 +7239,11 @@ "title": "Datenschutz-Einstellung", "description": "Steuere, wie viele deiner Daten an KI-Funktionen weitergegeben werden.", "openAi": "KI-Datenschutzmodus" + }, + "sessions": { + "title": "Sitzungen und Geräte", + "description": "Wo du angemeldet bist, welche Geräte den zweiten Faktor überspringen, und die Sicherheitsaktivität deines Kontos.", + "open": "Sicherheit öffnen" } }, "mcp": { diff --git a/messages/en.json b/messages/en.json index 275e51c39..288b95b00 100644 --- a/messages/en.json +++ b/messages/en.json @@ -7239,6 +7239,11 @@ "title": "Privacy posture", "description": "Control how much of your data is shared with AI features.", "openAi": "AI privacy mode" + }, + "sessions": { + "title": "Sessions and devices", + "description": "Where you are signed in, the devices that skip the second factor, and the security activity of your account.", + "open": "Open security" } }, "mcp": { diff --git a/messages/es.json b/messages/es.json index 2b08e49a8..3fc3cfcab 100644 --- a/messages/es.json +++ b/messages/es.json @@ -7239,6 +7239,11 @@ "title": "Configuración de privacidad", "description": "Controla cuántos de tus datos se comparten con las funciones de IA.", "openAi": "Modo de privacidad de IA" + }, + "sessions": { + "title": "Sesiones y dispositivos", + "description": "Dónde tienes la sesión iniciada, qué dispositivos omiten el segundo factor y la actividad de seguridad de tu cuenta.", + "open": "Abrir seguridad" } }, "mcp": { diff --git a/messages/fr.json b/messages/fr.json index 7df4a74fe..3121be5a9 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -7239,6 +7239,11 @@ "title": "Posture de confidentialité", "description": "Contrôlez la quantité de données partagées avec les fonctions d'IA.", "openAi": "Mode confidentialité IA" + }, + "sessions": { + "title": "Sessions et appareils", + "description": "Où tu es connecté, les appareils qui sautent le second facteur et l'activité de sécurité de ton compte.", + "open": "Ouvrir la sécurité" } }, "mcp": { diff --git a/messages/it.json b/messages/it.json index 6dd7ff8a7..aa59f96eb 100644 --- a/messages/it.json +++ b/messages/it.json @@ -7239,6 +7239,11 @@ "title": "Impostazione privacy", "description": "Controlla quanti dei tuoi dati vengono condivisi con le funzioni di IA.", "openAi": "Modalità privacy IA" + }, + "sessions": { + "title": "Sessioni e dispositivi", + "description": "Dove hai effettuato l'accesso, i dispositivi che saltano il secondo fattore e l'attività di sicurezza del tuo account.", + "open": "Apri sicurezza" } }, "mcp": { diff --git a/messages/ko.json b/messages/ko.json index 5b88aee4e..3356413fa 100644 --- a/messages/ko.json +++ b/messages/ko.json @@ -7239,6 +7239,11 @@ "title": "개인정보 보호 수준", "description": "AI 기능에 데이터를 어디까지 공유할지 정해요.", "openAi": "AI 개인정보 모드" + }, + "sessions": { + "title": "세션 및 기기", + "description": "로그인된 위치, 2단계 인증을 건너뛰는 기기, 계정의 보안 활동을 확인해요.", + "open": "보안 열기" } }, "mcp": { diff --git a/messages/nl.json b/messages/nl.json index 72dc4a3d4..8f8e2aaee 100644 --- a/messages/nl.json +++ b/messages/nl.json @@ -7239,6 +7239,11 @@ "title": "Privacyniveau", "description": "Bepaal hoeveel van je gegevens met AI-functies wordt gedeeld.", "openAi": "AI-privacymodus" + }, + "sessions": { + "title": "Sessies en apparaten", + "description": "Waar je bent ingelogd, welke apparaten de tweede factor overslaan en de beveiligingsactiviteit van je account.", + "open": "Beveiliging openen" } }, "mcp": { diff --git a/messages/pl.json b/messages/pl.json index f1b04e0bc..2e6a1501f 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -7239,6 +7239,11 @@ "title": "Ustawienia prywatności", "description": "Kontroluj, ile Twoich danych jest udostępnianych funkcjom AI.", "openAi": "Tryb prywatności AI" + }, + "sessions": { + "title": "Sesje i urządzenia", + "description": "Gdzie jesteś zalogowany, które urządzenia pomijają drugi składnik i aktywność zabezpieczeń twojego konta.", + "open": "Otwórz zabezpieczenia" } }, "mcp": { diff --git a/src/components/measurement-reminders/__tests__/vorsorge-section.test.tsx b/src/components/measurement-reminders/__tests__/vorsorge-section.test.tsx index 72d5004fa..cd520529c 100644 --- a/src/components/measurement-reminders/__tests__/vorsorge-section.test.tsx +++ b/src/components/measurement-reminders/__tests__/vorsorge-section.test.tsx @@ -114,6 +114,16 @@ describe(" loading + empty", () => { expect(html).not.toContain('data-slot="vorsorge-loading"'); }); + it("links the checkups page to the reminder and screening settings that moved", () => { + remindersMock.mockReturnValue({ data: [], isLoading: false }); + const page = render(); + expect(page).toContain('href="/settings/notifications#vorsorge-reminders"'); + expect(page).toContain('href="/settings/anamnesis#screening-hints"'); + // The embedded settings card is already in Settings and carries no links. + const embedded = render(); + expect(embedded).not.toContain('data-slot="vorsorge-settings-links"'); + }); + it("renders reminder cards once data lands", () => { const reminder: MeasurementReminder = { id: "r1", diff --git a/src/components/measurement-reminders/vorsorge-section.tsx b/src/components/measurement-reminders/vorsorge-section.tsx index d813ebbcd..654cc6f9d 100644 --- a/src/components/measurement-reminders/vorsorge-section.tsx +++ b/src/components/measurement-reminders/vorsorge-section.tsx @@ -465,7 +465,38 @@ export function VorsorgeSection({ } /> - ) : ( + ) : null} + {variant === "page" && !inSharedRecord ? ( + // The reminder switches and the screening hints moved out of the + // checkups settings in v1.44 (Notifications, Health profile); both + // stay one tap away from the page they are about. +
+ + +
+ ) : null} + {variant === "page" ? null : ( — assembled Data & Privacy dashboard", () => { expect(html).not.toContain("settings-security-sessions-card"); expect(html).not.toContain("settings-trusted-devices-card"); expect(html).not.toContain('href="/settings/export"'); + // ...but stay one tap away from here, where people looked for them. + expect(html).toContain('href="/settings/security#sessions"'); }); it("shows a loading placeholder for the retention block before the summary resolves", () => { diff --git a/src/components/settings/privacy-section.tsx b/src/components/settings/privacy-section.tsx index c0653da6a..852dbb4ce 100644 --- a/src/components/settings/privacy-section.tsx +++ b/src/components/settings/privacy-section.tsx @@ -23,6 +23,7 @@ import { Clock, Sparkles, Info, + MonitorSmartphone, } from "lucide-react"; import { Button } from "@/components/ui/button"; @@ -180,6 +181,25 @@ export function PrivacySection() { )} + {/* Sessions, trusted devices and the security activity live under + Security since v1.44; the row keeps them reachable from here, where + people looked for them before. */} + + + + + + + {/* Delete / reset — with the honest backup lag disclosure */}