feat(account): accept a third gender value

Add "OTHER" to the accepted gender values (the column is a free String, so no
migration) and surface it in the account selector. This lets a non-binary or
trans user record their gender and opt into the cycle-tracking surface through
the per-user enable flag, rather than being gated out by a binary field.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Marc-André BombeckandClaude Opus 4.8 committed 2026-06-06 10:40:01 +02:00
1 parent 55f40df0ac
commit 3e398295a3
9 files changed
+15 -8

No files matched your search

+2 -1
View File
@@ -3877,7 +3877,8 @@
"statusRevoked": "Widerrufen",
"statusExpired": "Abgelaufen",
"inactiveTitle": "Widerrufen und abgelaufen ({count})"
}
},
"genderOther": "Divers"
},
"admin": {
"title": "Administration",
+2 -1
View File
@@ -3877,7 +3877,8 @@
"statusRevoked": "Revoked",
"statusExpired": "Expired",
"inactiveTitle": "Revoked and expired ({count})"
}
},
"genderOther": "Other"
},
"admin": {
"title": "Administration",
+2 -1
View File
@@ -3877,7 +3877,8 @@
"statusRevoked": "Revocado",
"statusExpired": "Caducado",
"inactiveTitle": "Revocados y caducados ({count})"
}
},
"genderOther": "Otro"
},
"admin": {
"title": "Administration",
+2 -1
View File
@@ -3877,7 +3877,8 @@
"statusRevoked": "Révoqué",
"statusExpired": "Expiré",
"inactiveTitle": "Révoqués et expirés ({count})"
}
},
"genderOther": "Autre"
},
"admin": {
"title": "Administration",
+2 -1
View File
@@ -3877,7 +3877,8 @@
"statusRevoked": "Revocato",
"statusExpired": "Scaduto",
"inactiveTitle": "Revocati e scaduti ({count})"
}
},
"genderOther": "Altro"
},
"admin": {
"title": "Administration",
+2 -1
View File
@@ -3877,7 +3877,8 @@
"statusRevoked": "Unieważniony",
"statusExpired": "Wygasły",
"inactiveTitle": "Unieważnione i wygasłe ({count})"
}
},
"genderOther": "Inna"
},
"admin": {
"title": "Administracja",
+1 -1
View File
@@ -48,7 +48,7 @@ model User {
// Profile
heightCm Float? @map("height_cm")
dateOfBirth DateTime? @map("date_of_birth")
gender String? @map("gender") // "MALE" | "FEMALE" | null = keine Angabe
gender String? @map("gender") // "MALE" | "FEMALE" | "OTHER" | null = keine Angabe
timezone String @default("Europe/Berlin")
// Codex OAuth (ChatGPT subscription)
@@ -448,6 +448,7 @@ export function AccountSection() {
<option value="">{t("settings.genderNone")}</option>
<option value="MALE">{t("settings.genderMale")}</option>
<option value="FEMALE">{t("settings.genderFemale")}</option>
<option value="OTHER">{t("settings.genderOther")}</option>
</NativeSelect>
<p className="text-muted-foreground text-xs">
{t("settings.genderHint")}
+1 -1
View File
@@ -38,7 +38,7 @@ export const profileSchema = z.object({
email: z.email("Invalid email address").nullable().optional(),
heightCm: z.number().min(50).max(300).nullable().optional(),
dateOfBirth: z.string().nullable().optional(), // ISO date string
gender: z.enum(["MALE", "FEMALE"]).nullable().optional(),
gender: z.enum(["MALE", "FEMALE", "OTHER"]).nullable().optional(),
// v1.7.0 — optional patient-identity fields for the health-record
// export cover + FHIR Patient resource. All optional, never required.
fullName: z.string().trim().max(120).nullable().optional(),