Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
getAttendeeQueuePosition,
getUnreservedAttendeeCount,
getMembershipTypeName,
getGenderName,
} from "@dotkomonline/types"
import { getCurrentUTC, getStudyGrade } from "@dotkomonline/utils"
import { Button, Flex, Group, Image, Stack, Text, Title, useComputedColorScheme } from "@mantine/core"
Expand Down Expand Up @@ -186,7 +187,7 @@ const UserBox = ({ user, isMobile }: UserBoxProps) => {
<Title order={4}>{user.name}</Title>
<Text size="sm">{membership ? `Medlemskap: ${membershipType}` : "Ingen aktivt medlemskap"}</Text>
<Text size="sm">{membership ? (grade ? `Klasse: ${grade}` : "Ingen klassetrinn") : "-"}</Text>
<Text size="sm">Kjønn: {user.gender || "Ikke oppgitt"}</Text>
<Text size="sm">Kjønn: {getGenderName(user.gender)}</Text>
<Text size="sm">Kostholdsrestriksjoner: {user.dietaryRestrictions || "Ingen"}</Text>
</Stack>
</Flex>
Expand Down
15 changes: 8 additions & 7 deletions apps/dashboard/src/app/(internal)/brukere/[id]/edit-form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,13 @@ import { useFormBuilder } from "@/components/forms/Form"
import { createImageInput } from "@/components/forms/ImageInput"
import { createSelectInput } from "@/components/forms/SelectInput"
import { createTextInput } from "@/components/forms/TextInput"
import { USER_IMAGE_MAX_SIZE_KIB, type UserWrite, UserWriteSchema } from "@dotkomonline/types"
import {
GenderSchema,
getGenderName,
USER_IMAGE_MAX_SIZE_KIB,
type UserWrite,
UserWriteSchema,
} from "@dotkomonline/types"
import { createTextareaInput } from "@/components/forms/TextareaInput"
import { useIsAdminQuery } from "../queries"

Expand Down Expand Up @@ -43,12 +49,7 @@ export const useUserProfileEditForm = ({ defaultValues, onSubmit, label = "Bruke
}),
gender: createSelectInput({
label: "Kjønn",
data: [
{ label: "Mann", value: "Mann" },
{ label: "Kvinne", value: "Kvinne" },
{ label: "Annet", value: "Annet" },
{ label: "Ikke oppgitt", value: "Ikke oppgitt" },
],
data: GenderSchema.options.map((option) => ({ label: getGenderName(option), value: option })),
}),
biography: createTextareaInput({
label: "Biografi",
Expand Down
4 changes: 2 additions & 2 deletions apps/rpc/src/mock.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import type { CompanyWrite, JobListingWrite, UserWrite } from "@dotkomonline/types"
import { GenderSchema, type CompanyWrite, type JobListingWrite, type UserWrite } from "@dotkomonline/types"
import { addWeeks, addYears } from "date-fns"

export const getUserMock = (defaults?: Partial<UserWrite>): UserWrite => ({
email: "test-mail-that-does-not-exist6123123@gmail.com",
imageUrl: null,
name: "Test Test",
dietaryRestrictions: null,
gender: "other",
gender: GenderSchema.enum.UNKNOWN,
phone: null,
biography: null,
username: "test-test",
Expand Down
2 changes: 2 additions & 0 deletions apps/rpc/src/modules/user/user-repository.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { randomUUID } from "node:crypto"
import type { DBHandle, Prisma } from "@dotkomonline/db"
import {
GenderSchema,
type MembershipId,
type MembershipWrite,
type User,
Expand Down Expand Up @@ -48,6 +49,7 @@ export function getUserRepository(): UserRepository {
create: {
id: subject,
username: randomUUID(),
gender: GenderSchema.enum.UNKNOWN,
},
include: {
memberships: true,
Expand Down
4 changes: 2 additions & 2 deletions apps/rpc/src/modules/user/user-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
type UserWrite,
UserWriteSchema,
findActiveMembership,
GenderSchema,
} from "@dotkomonline/types"
import { createS3PresignedPost, slugify, getNextSemesterStart, getCurrentSemesterStart } from "@dotkomonline/utils"
import { trace } from "@opentelemetry/api"
Expand Down Expand Up @@ -385,8 +386,7 @@ export function getUserService(
phone: response.data.app_metadata?.phone || null,
// This field was called `allergies` in OnlineWeb 4, but today it's called `dietaryRestrictions`.
dietaryRestrictions: response.data.app_metadata?.allergies || null,
// Gender is a standard OIDC claim, so we fall back to it if the app_metadata does not contain it.
gender: response.data.app_metadata?.gender || response.data.gender || null,
gender: GenderSchema.enum.UNKNOWN,
workspaceUserId: null,
}

Expand Down
20 changes: 14 additions & 6 deletions apps/web/src/app/innstillinger/profil/form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,14 @@

import { useUserFileUploadMutation } from "@/app/innstillinger/mutations"
import { useTRPC } from "@/utils/trpc/client"
import { USER_IMAGE_MAX_SIZE_KIB, type User, type UserWrite, UserWriteSchema } from "@dotkomonline/types"
import {
GenderSchema,
USER_IMAGE_MAX_SIZE_KIB,
type User,
type UserWrite,
UserWriteSchema,
getGenderName,
} from "@dotkomonline/types"
import {
Button,
Label,
Expand Down Expand Up @@ -45,7 +52,7 @@ export function ProfileForm({ user, onSubmit, isSaving, saveSuccess, saveError,
imageUrl: user.imageUrl ?? null,
biography: user.biography ?? null,
phone: user.phone ?? null,
gender: user.gender ?? null,
gender: user.gender,
dietaryRestrictions: user.dietaryRestrictions ?? null,
}

Expand Down Expand Up @@ -260,10 +267,11 @@ export function ProfileForm({ user, onSubmit, isSaving, saveSuccess, saveError,
<SelectContent>
<SelectGroup>
<SelectLabel>Kjønn</SelectLabel>
<SelectItem value="Mann">Mann</SelectItem>
<SelectItem value="Kvinne">Kvinne</SelectItem>
<SelectItem value="Annet">Annet</SelectItem>
<SelectItem value="Ikke oppgitt">Ikke oppgitt</SelectItem>
{GenderSchema.options.map((option) => (
<SelectItem key={option} value={option}>
{getGenderName(option)}
</SelectItem>
))}
</SelectGroup>
</SelectContent>
</Select>
Expand Down
3 changes: 2 additions & 1 deletion apps/web/src/app/profil/[username]/ProfilePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
type VisiblePersonalMarkDetails,
createGroupPageUrl,
findActiveMembership,
getGenderName,
getMembershipTypeName,
getSpecializationName,
} from "@dotkomonline/types"
Expand Down Expand Up @@ -364,7 +365,7 @@ export function ProfilePage() {
<div className="grid grid-cols-[auto_1fr] items-start gap-3 overflow-x-scroll sm:overflow-hidden text-sm sm:text-base">
<UserProp label="Brukernavn" value={user.username} icon={IconUser} />
<UserProp label="E-post" value={user.email} icon={IconMail} />
<UserProp label="Kjønn" value={user.gender || "Ikke oppgitt"} icon={IconGenderBigender} />
<UserProp label="Kjønn" value={getGenderName(user.gender)} icon={IconGenderBigender} />
<UserProp label="Telefon" value={user.phone} icon={IconPhone} />
<UserProp
label="Kostholdsrestriksjoner"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
-- CreateEnum
CREATE TYPE "gender" AS ENUM ('MALE', 'FEMALE', 'NON_BINARY', 'OTHER', 'UNKNOWN');

-- AlterTable
ALTER TABLE "ow_user"
ALTER COLUMN "gender" DROP DEFAULT,
ALTER COLUMN "gender" TYPE "gender"
USING (
CASE
WHEN "gender" IS NULL THEN 'UNKNOWN'::"gender"
WHEN "gender" = 'Mann' THEN 'MALE'::"gender"
WHEN "gender" = 'Kvinne' THEN 'FEMALE'::"gender"
WHEN "gender" = 'Annet' THEN 'OTHER'::"gender"
WHEN "gender" = 'Ikke oppgitt' THEN 'UNKNOWN'::"gender"
ELSE 'UNKNOWN'::"gender"
END
),
ALTER COLUMN "gender" SET NOT NULL,
ALTER COLUMN "gender" SET DEFAULT 'UNKNOWN'::"gender";
12 changes: 11 additions & 1 deletion packages/db/prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,16 @@ model Membership {
@@map("membership")
}

enum Gender {
MALE @map("MALE")
FEMALE @map("FEMALE")
NON_BINARY @map("NON_BINARY")
OTHER @map("OTHER")
UNKNOWN @map("UNKNOWN")

@@map("gender")
}

model User {
/// OpenID Connect Subject claim - for this reason there is no @default(uuid()) here.
id String @id
Expand All @@ -82,7 +92,7 @@ model User {
imageUrl String? @map("image_url")
biography String?
phone String?
gender String?
gender Gender @default(UNKNOWN)
dietaryRestrictions String? @map("dietary_restrictions")
ntnuUsername String? @map("ntnu_username")
flags String[]
Expand Down
7 changes: 4 additions & 3 deletions packages/db/src/fixtures/user.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { Prisma } from "@prisma/client"
import { GenderSchema } from "../schemas/index"

export const getUserFixtures = () =>
[
Expand All @@ -10,7 +11,7 @@ export const getUserFixtures = () =>
imageUrl: null,
biography: "Anders And er en and som liker å bade i penger og spise maiskolber.",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
biography: "Anders And er en and som liker å bade i penger og spise maiskolber.",
biography: "Anders Robstad er en and som liker å bade i penger og spise maiskolber.",

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Backer det her

phone: null,
gender: "Mann",
gender: GenderSchema.enum.MALE,
dietaryRestrictions: "Vegetarianer",
ntnuUsername: null,
flags: [],
Expand All @@ -25,7 +26,7 @@ export const getUserFixtures = () =>
imageUrl: null,
biography: null,
phone: null,
gender: "Kvinne",
gender: GenderSchema.enum.FEMALE,
dietaryRestrictions: null,
ntnuUsername: null,
flags: [],
Expand All @@ -40,7 +41,7 @@ export const getUserFixtures = () =>
imageUrl: null,
biography: "Help me I'm under da water",
phone: null,
gender: null,
gender: GenderSchema.enum.UNKNOWN,
dietaryRestrictions: "Har dårlig reaksjon mot gluten",
flags: [],
privacyPermissionsId: null,
Expand Down
20 changes: 19 additions & 1 deletion packages/types/src/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,13 @@ export const NAME_REGEX = /^[\p{L}\p{M}\s'-]+$/u
export const PHONE_REGEX = /^[0-9-+\s]*$/
export const PROFILE_SLUG_REGEX = /^[a-z0-9-]+$/

export const GenderSchema = schemas.GenderSchema
export type Gender = z.infer<typeof GenderSchema>

// These max and min values are arbitrary
export const UserWriteSchema = UserSchema.pick({
workspaceUserId: true,
gender: true,
}).extend({
username: z
.string()
Expand Down Expand Up @@ -66,7 +70,6 @@ export const UserWriteSchema = UserSchema.pick({
.nullable(),
imageUrl: z.string().url("Ugyldig URL").max(500, "Bildelenken kan ikke være lengre enn 500 tegn").nullable(),
biography: z.string().max(2000, "Biografien kan ikke være lengre enn 2000 tegn").nullable(),
gender: z.string().nullable(),
dietaryRestrictions: z.string().max(200, "Kostholdsrestriksjoner kan ikke være lengre enn 200 tegn").nullable(),
})
export type UserWrite = z.infer<typeof UserWriteSchema>
Expand Down Expand Up @@ -159,4 +162,19 @@ export function getSpecializationName(specialization: MembershipSpecialization)
}
}

export function getGenderName(gender: Gender) {
switch (gender) {
case "MALE":
return "Mann"
case "FEMALE":
return "Kvinne"
case "NON_BINARY":
return "Ikke-binær"
case "OTHER":
return "Annet"
case "UNKNOWN":
return "Ikke oppgitt"
}
}

export const USER_IMAGE_MAX_SIZE_KIB = 512
Loading