Skip to content

Commit 82fdd4f

Browse files
Legger til MånedÅrVelger komponent
1 parent a16ab02 commit 82fdd4f

File tree

2 files changed

+126
-0
lines changed

2 files changed

+126
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
import React, { useState } from 'react';
2+
3+
import { formatISO, lastDayOfMonth } from 'date-fns';
4+
5+
import { MonthPicker, useMonthpicker } from '@navikt/ds-react';
6+
import type { Felt } from '@navikt/familie-skjema';
7+
8+
import { useApp } from '../../../context/AppContext';
9+
import { useSpråk } from '../../../context/SpråkContext';
10+
import { ISODateString } from '../../../typer/common';
11+
import { ESanitySteg } from '../../../typer/sanity/sanity';
12+
13+
interface MånedÅrVelgerProps {
14+
tidligsteValgbareMåned?: Date;
15+
senesteValgbareMåned?: Date;
16+
label: React.ReactNode;
17+
felt: Felt<ISODateString>;
18+
visFeilmeldinger?: boolean;
19+
disabled?: boolean;
20+
dagIMåneden: DagIMåneden;
21+
kanIkkeVæreFortid?: boolean;
22+
kanIkkeVæreFremtid?: boolean;
23+
}
24+
25+
/* TODO
26+
- vurder å lagre som Date og gjøre parsing/format mot mellomlagring og innsending - i neste runde
27+
*/
28+
29+
export enum Feilmelding {
30+
FØR_MIN_DATO = 'FØR_MIN_DATO',
31+
ETTER_MAKS_DATO = 'ETTER_MAKS_DATO',
32+
UGYLDIG_DATO = 'UGYLDIG_DATO',
33+
DATO_IKKE_I_FORTID = 'DATO_IKKE_I_FORTID',
34+
DATO_IKKE_I_FREMTID = 'DATO_IKKE_I_FREMTID',
35+
}
36+
37+
export enum DagIMåneden {
38+
FØRSTE_DAG = 'FØRSTE_DAG',
39+
SISTE_DAG = 'SISTE_DAG',
40+
}
41+
42+
export const MånedÅrVelger: React.FC<MånedÅrVelgerProps> = ({
43+
tidligsteValgbareMåned,
44+
senesteValgbareMåned,
45+
label,
46+
felt,
47+
visFeilmeldinger = false,
48+
disabled = false,
49+
dagIMåneden = DagIMåneden.FØRSTE_DAG,
50+
kanIkkeVæreFortid,
51+
kanIkkeVæreFremtid,
52+
}) => {
53+
const { valgtLocale } = useSpråk();
54+
const { tekster, plainTekst } = useApp();
55+
const [error, setError] = useState<Feilmelding | undefined>(undefined);
56+
const formateringsfeilmeldinger = tekster()[ESanitySteg.FELLES].formateringsfeilmeldinger;
57+
58+
const nullstillOgSettFeilmelding = (feilmelding: Feilmelding) => {
59+
if (error !== feilmelding) {
60+
setError(feilmelding);
61+
felt.nullstill();
62+
}
63+
};
64+
65+
const feilmeldinger: Record<Feilmelding, string> = {
66+
UGYLDIG_DATO: plainTekst(formateringsfeilmeldinger.ugyldigManed),
67+
FØR_MIN_DATO: plainTekst(formateringsfeilmeldinger.datoErForForsteGyldigeTidspunkt),
68+
ETTER_MAKS_DATO: plainTekst(formateringsfeilmeldinger.datoErEtterSisteGyldigeTidspunkt),
69+
DATO_IKKE_I_FORTID: plainTekst(formateringsfeilmeldinger.datoKanIkkeVareIFortid),
70+
DATO_IKKE_I_FREMTID: plainTekst(formateringsfeilmeldinger.datoKanIkkeVareIFremtid),
71+
};
72+
73+
const { monthpickerProps, inputProps } = useMonthpicker({
74+
fromDate: tidligsteValgbareMåned,
75+
toDate: senesteValgbareMåned,
76+
locale: valgtLocale,
77+
onMonthChange: (dato: Date | undefined): void => {
78+
if (dato === undefined) {
79+
felt.nullstill();
80+
} else {
81+
if (dagIMåneden === DagIMåneden.FØRSTE_DAG) {
82+
felt.validerOgSettFelt(formatISO(dato, { representation: 'date' }));
83+
} else {
84+
felt.validerOgSettFelt(
85+
formatISO(lastDayOfMonth(dato), { representation: 'date' })
86+
);
87+
}
88+
}
89+
},
90+
onValidate: val => {
91+
if (val.isBefore && kanIkkeVæreFortid) {
92+
nullstillOgSettFeilmelding(Feilmelding.DATO_IKKE_I_FORTID);
93+
} else if (val.isAfter && kanIkkeVæreFremtid) {
94+
nullstillOgSettFeilmelding(Feilmelding.DATO_IKKE_I_FREMTID);
95+
} else if (val.isBefore) {
96+
nullstillOgSettFeilmelding(Feilmelding.FØR_MIN_DATO);
97+
} else if (val.isAfter) {
98+
nullstillOgSettFeilmelding(Feilmelding.ETTER_MAKS_DATO);
99+
} else if (val.isEmpty || val.isDisabled || !val.isValidMonth) {
100+
nullstillOgSettFeilmelding(Feilmelding.UGYLDIG_DATO);
101+
} else {
102+
setError(undefined);
103+
}
104+
},
105+
});
106+
107+
return (
108+
<MonthPicker {...monthpickerProps}>
109+
<MonthPicker.Input
110+
{...inputProps}
111+
label={label}
112+
disabled={disabled}
113+
error={
114+
error && visFeilmeldinger
115+
? feilmeldinger[error]
116+
: felt.hentNavBaseSkjemaProps(visFeilmeldinger).error
117+
}
118+
/>
119+
</MonthPicker>
120+
);
121+
};

src/frontend/typer/sanity/tekstInnhold.ts

+5
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ export interface IFormateringsfeilmeldingerTekstinnhold {
115115
periodeAvsluttesForTidlig: LocaleRecordString;
116116
datoKanIkkeVaereTilbakeITid: LocaleRecordString;
117117
datoKanIkkeVaere12MndTilbake: LocaleRecordString;
118+
ugyldigManed: LocaleRecordString;
119+
datoErForForsteGyldigeTidspunkt: LocaleRecordString;
120+
datoErEtterSisteGyldigeTidspunkt: LocaleRecordString;
121+
datoKanIkkeVareIFortid: LocaleRecordString;
122+
datoKanIkkeVareIFremtid: LocaleRecordString;
118123
}
119124

120125
export interface IModalerTekstinnhold {

0 commit comments

Comments
 (0)