Skip to content

Orkestrator barn opplysning #166

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 60 commits into from
Apr 3, 2025
Merged
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
ae55e4a
Legg til msw mock data. Utvide logikk for Regelsett komponent.
nattaphongklinjan Feb 20, 2025
752dfd7
Legge til readonly tabell, oppdatere mock data, legge til dummy input…
nattaphongklinjan Mar 3, 2025
9d39d39
Kommenter ut github deploy
nattaphongklinjan Mar 3, 2025
9ad3265
Oppdatere endepunk filnavn, Justere styling på tabellen, oppdatere mocks
nattaphongklinjan Mar 6, 2025
80cbd68
Rydde opp endringer som ikke relevant med branchen
nattaphongklinjan Mar 6, 2025
3d80cd4
Rydd opp i feil rebase
nattaphongklinjan Mar 6, 2025
c37f495
Rydd opp i feil rebase
nattaphongklinjan Mar 6, 2025
01ee56f
Rydd opp i feil rebase
nattaphongklinjan Mar 6, 2025
586be6a
Bytte ut oppgaveId med søknadId for å hente ut barnOpplysnig
nattaphongklinjan Mar 6, 2025
06173e5
Barn opplysning uten generalisering, hardkordet lister med opplysninger
nattaphongklinjan Mar 7, 2025
7e0a227
Legge til datepicker, select for landvelger, hente landListe fra orke…
nattaphongklinjan Mar 7, 2025
b8e67e8
Fjerne orkestrator dato input komponent
nattaphongklinjan Mar 7, 2025
3bb6188
Endre datamodellen, refakturere kompponenter
nattaphongklinjan Mar 10, 2025
e3c98c9
Refakturere komponenter
nattaphongklinjan Mar 10, 2025
a1be963
Oppdatert opplysningkomponenter, action filer, validering
nattaphongklinjan Mar 12, 2025
89c5973
Refakturere html og css
nattaphongklinjan Mar 12, 2025
5a19ae3
Refakturere komponenter og util funksjoner
nattaphongklinjan Mar 12, 2025
ec8cbe8
Oppdatere msw for oppdatering av barn, fjerne uncontrolled for inputs…
nattaphongklinjan Mar 12, 2025
855ae9a
Revert endring i OpplysningBoolean.tsx
nattaphongklinjan Mar 12, 2025
300f10d
Refactor
nattaphongklinjan Mar 12, 2025
70f1831
Legge til Alert og automatisk lukke modal når opplysninger er lagret
nattaphongklinjan Mar 13, 2025
8ca771e
Fikse varsling når barn er oppdatert
nattaphongklinjan Mar 13, 2025
4eb51af
Legg tilbake gha deployment
nattaphongklinjan Mar 13, 2025
da20c26
Revert endringer i deploy.yml
nattaphongklinjan Mar 13, 2025
38da56e
Fjene readonly fra OpplysningLand
nattaphongklinjan Mar 13, 2025
5781390
Fikse små feil etter PR review
nattaphongklinjan Mar 13, 2025
f57fe51
Update app/components/regelsett/Regelsett.tsx
nattaphongklinjan Mar 17, 2025
a449c08
Fikser små ting etter kommentarer i PR
nattaphongklinjan Mar 17, 2025
87f7650
Erstatt #FFFFFF med --a-white
nattaphongklinjan Mar 17, 2025
9966a9a
Merge branch 'main' into orkestrator-barn-opplysning-enkelt
nattaphongklinjan Mar 20, 2025
e55338e
Bytte ut rvf/remix til react-router
nattaphongklinjan Mar 20, 2025
603a9c7
Merge branch 'main' into orkestrator-barn-opplysning-enkelt
nattaphongklinjan Mar 27, 2025
25ccfb1
Begynne å ta i bruk open api types gen struktur
nattaphongklinjan Mar 27, 2025
c4d125a
Oppdaterre redocly, oppdate endepunkt til riktig types, setter types …
nattaphongklinjan Mar 27, 2025
3d578ff
Merge branch 'main' into orkestrator-barn-opplysning-enkelt
nattaphongklinjan Mar 28, 2025
6931f08
Legge til dp-soknad-orkestrator_url i nais env
nattaphongklinjan Mar 28, 2025
46bcaad
Debug orkestrator fetch error
nattaphongklinjan Mar 28, 2025
31c4047
Legge til dp-soknad-orkestrator i outbound
nattaphongklinjan Mar 28, 2025
4cdf330
Logg ut barn og land liste
nattaphongklinjan Mar 28, 2025
5688aaa
Merge branch 'main' into orkestrator-barn-opplysning-enkelt
nattaphongklinjan Mar 31, 2025
04f16af
Fjerne kommentar, legge til fallback label for orkestrator keys
nattaphongklinjan Mar 31, 2025
edaf4bb
Fikse bug i hentOrkestratorBarnOpplysningLabel, filtrere bort endretA…
nattaphongklinjan Mar 31, 2025
0206a78
Oppdatere mock
nattaphongklinjan Mar 31, 2025
0d9b5a0
Filtrere bort endretAv opplysning
nattaphongklinjan Mar 31, 2025
29d4626
Debug oppdaterOrkestratorBarnAction
nattaphongklinjan Mar 31, 2025
6f95d55
Oppdatere validering for orkestrator barn validering
nattaphongklinjan Mar 31, 2025
b0f51b7
Debug oppdater orkestrator barn action
nattaphongklinjan Mar 31, 2025
239c5a8
Spreader ut oppdater barn request body
nattaphongklinjan Apr 1, 2025
352d78f
Parse dato før det sendes tilbake til backend
nattaphongklinjan Apr 1, 2025
8c227f3
Debug oppdatert barn body
nattaphongklinjan Apr 1, 2025
a933be8
Debug oppdatert barn body
nattaphongklinjan Apr 1, 2025
1314e8a
Debug oppdatert barn body
nattaphongklinjan Apr 1, 2025
7d6c748
Parse foedselsdato
nattaphongklinjan Apr 1, 2025
d20d535
Fjerne console.log fra debug
nattaphongklinjan Apr 1, 2025
251601c
Oppdatere måten vi parse boolean verdi før vi sende tilbake til backend
nattaphongklinjan Apr 2, 2025
eeae314
Logge Error og data for oppdaterOrkestratorBarn
nattaphongklinjan Apr 2, 2025
7af7655
Logge ut response
nattaphongklinjan Apr 2, 2025
0bac6b4
Merge branch 'main' into orkestrator-barn-opplysning-enkelt
nattaphongklinjan Apr 3, 2025
52b043b
Små typo fiks på valideringsmeldinger
nattaphongklinjan Apr 3, 2025
d11dd82
Legge til muligheter for å kunne skjule sensitive informasjon om barn
nattaphongklinjan Apr 3, 2025
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
1 change: 0 additions & 1 deletion .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -149,4 +149,3 @@ jobs:
RESOURCE: .nais/nais.yaml,.nais/unleash-apitoken.yaml
VARS: .nais/vars-prod.yaml
PRINT_PAYLOAD: true

44 changes: 44 additions & 0 deletions app/components/orkestrator-barn/OrkestratorBarn.module.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
.orkestratorBarn {
margin-top: var(--a-spacing-8);
}

.opplysningBarnHeader {
margin-left: var(--a-spacing-3);
}

.orkestratorOpplysning {
padding: var(--a-spacing-2);
}

.orkestratorOpplysningsLinje {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
border-top: 1px solid var(--a-border-divider);
padding: var(--a-spacing-2);
}

.korrigering {
grid-template-columns: 1fr 0.1fr 1fr;
}

.bakgrunn:nth-child(odd) {
background-color: #f8f9fc;
}

.bakgrunn:nth-child(even) {
background-color: #ffffff;
}

.alightRight {
display: flex;
justify-content: end;
align-items: baseline;
}

.endreKnapp {
margin: var(--a-spacing-4) 0 0 var(--a-spacing-3);
}

.modal {
min-width: 600px;
}
162 changes: 162 additions & 0 deletions app/components/orkestrator-barn/OrkestratorBarn.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
import { PencilWritingIcon } from "@navikt/aksel-icons";
import { Button, Heading, Modal } from "@navikt/ds-react";
import { useActionData, useNavigation } from "@remix-run/react";
import { useForm } from "@rvf/remix";
import { withZod } from "@rvf/zod";
import classNames from "classnames";
import { useEffect, useRef } from "react";
import { z } from "zod";

import { useTypedRouteLoaderData } from "~/hooks/useTypedRouteLoaderData";
import { IOrkestratorBarn } from "~/models/orkestrator-opplysning.server";
import { action } from "~/routes/oppgave.$oppgaveId.behandle";

import styles from "./OrkestratorBarn.module.css";
import { OrkestratorOpplysninLinje } from "./OrkestratorOpplysningLinje";

interface IProps {
barnNummer: number;
barn: IOrkestratorBarn;
}

const validator = withZod(
z.object({
fornavnOgMellomnavn: z.string().min(1, { message: "Du må skrive fornavn" }),
etternavn: z.string().min(1, { message: "Du må skrive etternavn" }),
fødselsdato: z.string().regex(
new RegExp("^(0[1-9]|[12][0-9]|3[01])[\\.-](0[1-9]|1[012])[\\.-](19|20|)\\d\\d$"), // Regex for å matche norsk dato format, eks. 01.02.2023
"Ugyldig dato. Gylige datoformat er dd.mm.åååå",
),
oppholdssted: z.string().min(1, { message: "Du må velge et land" }),
forsørgerBarnet: z.enum(["true", "false"], {
required_error: "Du må velge et svar",
invalid_type_error: "Ugyldig svar",
}),
kvalifisererTilBarnetillegg: z.enum(["true", "false"], {
required_error: "Du må velge et svar",
invalid_type_error: "Ugyldig svar",
}),
barnetilleggFom: z
.string()
.regex(
new RegExp("^(0[1-9]|[12][0-9]|3[01])[\\.-](0[1-9]|1[012])[\\.-](19|20|)\\d\\d$"),
"Ugyldig dato. Gylige datoformat er dd.mm.åååå",
),
barnetilleggTom: z
.string()
.regex(
new RegExp("^(0[1-9]|[12][0-9]|3[01])[\\.-](0[1-9]|1[012])[\\.-](19|20|)\\d\\d$"),
"Ugyldig dato. Gylige datoformat er dd.mm.åååå",
),
begrunnelse: z.string().min(1, { message: "Du må skrive begrunnelse" }),
}),
);

export function OrkestratorBarn({ barnNummer, barn }: IProps) {
const ref = useRef<HTMLDialogElement>(null);
const actionData = useActionData<typeof action>();
const { state } = useNavigation();
const { oppgave } = useTypedRouteLoaderData("routes/oppgave.$oppgaveId");

useEffect(() => {
if (actionData) {
ref.current?.close();
}
}, [actionData]);

const defaultValues = barn.opplysninger.reduce(
(acc, { id, verdi }) => {
acc[id] = verdi;
return acc;
},
{} as Record<string, string>,
);

const orkestratorBarnForm = useForm({
validator: validator,
method: "put",
defaultValues: defaultValues,
});

function avbryt() {
orkestratorBarnForm.resetForm();
ref.current?.close();
}

// Todo: Ikke lagre til backend dersom ingenting er endret i formen
return (
<div className={styles.orkestratorBarn}>
<>
<Heading level="4" size="xsmall" className={styles.opplysningBarnHeader} spacing>
Barn {barnNummer}
</Heading>
<div className={styles.orkestratorOpplysning}>
<>
{barn.opplysninger.map((opplysning, index) => (
<OrkestratorOpplysninLinje
key={index}
opplysning={opplysning}
formScope={orkestratorBarnForm.scope(opplysning.id)}
readOnly
/>
))}
</>
</div>
</>
<Button
variant="secondary"
size="small"
className={styles.endreKnapp}
icon={<PencilWritingIcon />}
onClick={() => ref.current?.showModal()}
>
Endre
</Button>

<Modal
ref={ref}
header={{ heading: `Barn ${barnNummer}` }}
closeOnBackdropClick
className={styles.modal}
>
<form {...orkestratorBarnForm.getFormProps()}>
<Modal.Body>
<div className={classNames(styles.orkestratorOpplysning)}>
<input
hidden={true}
readOnly={true}
name="_action"
value="oppdater-orkestrator-barn"
/>
<input hidden={true} readOnly={true} name="soknadId" value={oppgave.soknadId} />
<input hidden={true} readOnly={true} name="barnId" value={barn.barnId} />
{barn.opplysninger.map((opplysning, index) => (
<OrkestratorOpplysninLinje
key={index}
opplysning={opplysning}
formScope={orkestratorBarnForm.scope(opplysning.id as string)}
/>
))}
</div>
</Modal.Body>
<Modal.Footer>
<Button
type="button"
variant="tertiary"
size="small"
onClick={() => ref.current?.close()}
>
Lukk
</Button>
<Button type="button" variant="secondary" size="small" onClick={avbryt}>
Avbryt
</Button>
<Button type="submit" size="small" loading={state !== "idle"}>
Lagre endringer
</Button>
</Modal.Footer>
</form>
</Modal>
</div>
);
}
42 changes: 42 additions & 0 deletions app/components/orkestrator-barn/OrkestratorOpplysningLinje.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { FormScope } from "@rvf/remix";
import { IOrkestratorBarnOpplysning } from "~/models/orkestrator-opplysning.server";
import {
formatterOrkestratorOpplysningVerdi,
hentOrkestratorBarnOpplysningLabel,
} from "~/utils/orkestrator-opplysninger.utils";
import { OrkestratorOpplysning } from "../orkestrator-opplysning/OrkestratorOpplysning";
import styles from "./OrkestratorBarn.module.css";
import { OrkestratorTag } from "./OrkestratorTag";
import classNames from "classnames";

interface IProps {
opplysning: IOrkestratorBarnOpplysning;
readOnly?: boolean;
formScope: FormScope<string>;
}

export function OrkestratorOpplysninLinje({ opplysning, readOnly, formScope }: IProps) {
if (readOnly) {
return (
<div className={classNames(styles.orkestratorOpplysningsLinje, styles.bakgrunn)}>
<div>{hentOrkestratorBarnOpplysningLabel(opplysning.id)}</div>
<div>{formatterOrkestratorOpplysningVerdi(opplysning)}</div>
<div className={styles.alightRight}>
<OrkestratorTag kilde={opplysning.kilde} />
</div>
</div>
);
}

return (
<div className={classNames(styles.orkestratorOpplysningsLinje, styles.korrigering)}>
<div>
<OrkestratorOpplysning opplysning={opplysning} formScope={formScope} />
</div>
<div />
<div className={styles.alightRight}>
<OrkestratorTag kilde={opplysning.kilde} />
</div>
</div>
);
}
18 changes: 18 additions & 0 deletions app/components/orkestrator-barn/OrkestratorTag.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { Tag } from "@navikt/ds-react";
import { IOrkestratorKilde } from "~/models/orkestrator-opplysning.server";

interface IProps {
kilde?: IOrkestratorKilde;
}

export function OrkestratorTag({ kilde }: IProps) {
if (kilde === undefined) {
return null;
}

return (
<Tag variant={kilde === "register" ? "alt1" : "warning"} size="small">
{kilde === "register" ? "Register" : "Søknad"}
</Tag>
);
}
37 changes: 37 additions & 0 deletions app/components/orkestrator-opplysning/OrkestratorOpplysning.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { IOrkestratorBarnOpplysning } from "~/models/orkestrator-opplysning.server";
import { OrkestratorOpplysningTekst } from "./OrkestratorOpplysningTekst";
import { OrkestratorOpplysningLand } from "./OrkestratorOpplysningLand";
import { OrkestratorOpplysningBoolsk } from "./OrkestratorOpplysningBoolsk";
import { OrkestratorOpplysningDato } from "./OrkestratorOpplysningDato";
import { FormScope } from "@rvf/remix";
import { logger } from "~/utils/logger.utils";

interface IProps {
opplysning: IOrkestratorBarnOpplysning;
formScope: FormScope<string>;
}

export function OrkestratorOpplysning({ opplysning, formScope }: IProps) {
switch (opplysning.datatype) {
case "tekst":
return <OrkestratorOpplysningTekst opplysning={opplysning} formScope={formScope} />;

case "land":
return <OrkestratorOpplysningLand opplysning={opplysning} formScope={formScope} />;

case "boolsk":
return <OrkestratorOpplysningBoolsk opplysning={opplysning} formScope={formScope} />;

case "dato":
return <OrkestratorOpplysningDato opplysning={opplysning} formScope={formScope} />;

default:
logger.error(`Ukjent orkestrator datatype ${opplysning.datatype}`);

return (
<>
{opplysning.id}: {opplysning.verdi}
</>
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { Radio, RadioGroup, Stack } from "@navikt/ds-react";
import { FormScope, useField } from "@rvf/remix";
import { IOrkestratorBarnOpplysning } from "~/models/orkestrator-opplysning.server";
import { hentOrkestratorBarnOpplysningLabel } from "~/utils/orkestrator-opplysninger.utils";

interface IProps {
opplysning: IOrkestratorBarnOpplysning;
formScope: FormScope<string>;
}

export function OrkestratorOpplysningBoolsk({ opplysning, formScope }: IProps) {
const field = useField(formScope);

return (
<RadioGroup
{...field.getInputProps()}
legend={hentOrkestratorBarnOpplysningLabel(opplysning.id)}
size="small"
error={field.error()}
readOnly={opplysning.kilde === "register"}
>
<Stack gap="0 6" direction={{ xs: "column", sm: "row" }} wrap={false}>
<Radio value="true">Ja</Radio>
<Radio value="false">Nei</Radio>
</Stack>
</RadioGroup>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { DatePicker, useDatepicker } from "@navikt/ds-react";
import { FormScope, useField } from "@rvf/remix";
import { addYears, formatISO, subYears } from "date-fns";

import { IOrkestratorBarnOpplysning } from "~/models/orkestrator-opplysning.server";
import { formaterNorskDato } from "~/utils/dato.utils";
import { hentOrkestratorBarnOpplysningLabel } from "~/utils/orkestrator-opplysninger.utils";

interface IProps {
opplysning: IOrkestratorBarnOpplysning;
formScope: FormScope<string>;
}

export function OrkestratorOpplysningDato({ opplysning, formScope }: IProps) {
const field = useField(formScope);

const { datepickerProps, inputProps } = useDatepicker({
defaultSelected: new Date(opplysning.verdi),
toDate: addYears(new Date(), 100),
fromDate: subYears(new Date(), 100),
locale: "nb",
inputFormat: "dd.MM.yyyy",
onDateChange: (date) => {
if (date) {
field.clearError();

const datoBackendFormat = formatISO(date, { representation: "date" });
field.setValue(formaterNorskDato(datoBackendFormat));
if (datoBackendFormat !== opplysning.verdi) {
field.setDirty(true);
} else {
field.setDirty(false);
}
}
},
});

return (
<DatePicker {...datepickerProps}>
<DatePicker.Input
size="small"
{...inputProps}
label={hentOrkestratorBarnOpplysningLabel(opplysning.id)}
form={field.getInputProps().form}
name={field.getInputProps().name}
error={field.error()}
readOnly={opplysning.kilde === "register"}
/>
</DatePicker>
);
}
Loading
Loading