-
Notifications
You must be signed in to change notification settings - Fork 2
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
Be kun om måned der vi ikke trenger nøyaktig dato #1172
base: main
Are you sure you want to change the base?
The head ref may contain hidden characters: "feat/be-kun-om-m\u00E5ned-ikke-dato"
Changes from 17 commits
8069d4a
8c21db0
b992c5a
9278a15
2d1b51c
004dd1e
c05a453
d4e8607
0f89e49
1b6079b
277eadb
6cf275b
a3fe899
44351b3
388731b
1a2f879
10f32c9
c3d3f5c
22576b4
1e88f10
4e55827
053be5b
0bce5d9
3a6d3b7
2ec5973
7084b47
05d4b1a
cafa352
864b7e8
524ecad
b31038c
75125f7
c9c800b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
import React, { useEffect, useState } from 'react'; | ||
|
||
import { formatISO } from 'date-fns'; | ||
|
||
import { MonthPicker, useMonthpicker } from '@navikt/ds-react'; | ||
import { Felt } from '@navikt/familie-skjema'; | ||
|
||
import { useApp } from '../../../context/AppContext'; | ||
import { useSpråk } from '../../../context/SpråkContext'; | ||
import { ISODateString } from '../../../typer/common'; | ||
import { ESanitySteg } from '../../../typer/sanity/sanity'; | ||
import { formaterDatoKunMåned } from '../../../utils/dato'; | ||
|
||
interface IProps { | ||
tidligsteValgbareMåned?: Date; | ||
senesteValgbareMåned?: Date; | ||
label: React.ReactNode; | ||
felt: Felt<ISODateString>; | ||
visFeilmeldinger?: boolean; | ||
} | ||
|
||
/* TODO | ||
- vurder å lagre som Date og gjøre parsing/format mot mellomlagring og innsending - i neste runde | ||
- legge feilmeldinger i sanity slik at vi får i18n: støtte flettefelt i fellestekst i formateringsfeilmeldinger, gjøres i familie-baks-soknad-sanity | ||
*/ | ||
|
||
export enum Feilmelding { | ||
FØR_MIN_DATO = 'FØR_MIN_DATO', | ||
ETTER_MAKS_DATO = 'ETTER_MAKS_DATO', | ||
UGYLDIG_DATO = 'UGYLDIG_DATO', | ||
} | ||
|
||
export const MånedÅrVelger: React.FC<IProps> = ({ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Jeg liker navnet |
||
tidligsteValgbareMåned, | ||
senesteValgbareMåned, | ||
label, | ||
felt, | ||
visFeilmeldinger = false, | ||
}) => { | ||
const { valgtLocale } = useSpråk(); | ||
const { tekster, plainTekst } = useApp(); | ||
const [error, setError] = useState<Feilmelding | undefined>(undefined); | ||
|
||
const nullstillOgSettFeilmelding = (feilmelding: Feilmelding) => { | ||
if (error !== feilmelding) { | ||
setError(feilmelding); | ||
felt.nullstill(); | ||
} | ||
}; | ||
|
||
const feilmeldingForDatoFørMinDato = () => { | ||
// TODO må få i18n | ||
if (tidligsteValgbareMåned) { | ||
return plainTekst( | ||
tekster()[ESanitySteg.FELLES].formateringsfeilmeldinger | ||
.tilDatoKanIkkeVaereFoerFraDato | ||
); | ||
} | ||
return plainTekst(tekster()[ESanitySteg.FELLES].formateringsfeilmeldinger.ugyldigManed); | ||
}; | ||
|
||
const feilmeldingForDatoEtterMaksDato = () => { | ||
// TODO må få i18n | ||
if (senesteValgbareMåned) { | ||
return `Du kan ikke velge en dato etter ${formaterDatoKunMåned(senesteValgbareMåned, valgtLocale)}`; | ||
} | ||
return plainTekst(tekster()[ESanitySteg.FELLES].formateringsfeilmeldinger.ugyldigManed); | ||
}; | ||
|
||
const feilmeldinger: Record<Feilmelding, string> = { | ||
UGYLDIG_DATO: 'Du må velge en gyldig dato', // TODO må få i18n | ||
FØR_MIN_DATO: feilmeldingForDatoFørMinDato(), | ||
ETTER_MAKS_DATO: feilmeldingForDatoEtterMaksDato(), | ||
}; | ||
|
||
const { monthpickerProps, inputProps, reset, selectedMonth } = useMonthpicker({ | ||
fromDate: tidligsteValgbareMåned, | ||
toDate: senesteValgbareMåned, | ||
locale: valgtLocale, | ||
onMonthChange: (dato: Date | undefined): void => { | ||
if (dato === undefined) { | ||
felt.nullstill(); | ||
} else { | ||
felt.validerOgSettFelt(formatISO(dato, { representation: 'date' })); | ||
} | ||
}, | ||
onValidate: val => { | ||
if (val.isBefore) { | ||
nullstillOgSettFeilmelding(Feilmelding.FØR_MIN_DATO); | ||
} else if (val.isAfter) { | ||
nullstillOgSettFeilmelding(Feilmelding.ETTER_MAKS_DATO); | ||
} else if (val.isEmpty || val.isDisabled || !val.isValidMonth) { | ||
nullstillOgSettFeilmelding(Feilmelding.UGYLDIG_DATO); | ||
} else { | ||
setError(undefined); | ||
} | ||
}, | ||
}); | ||
|
||
useEffect(() => { | ||
if (selectedMonth) { | ||
if ( | ||
(!!tidligsteValgbareMåned && tidligsteValgbareMåned > selectedMonth) || | ||
(!!senesteValgbareMåned && senesteValgbareMåned < selectedMonth) | ||
) { | ||
reset(); | ||
} | ||
} | ||
}, [tidligsteValgbareMåned, senesteValgbareMåned]); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Logikken for å resette et felt basert på et annet felt funker kun hvis man velger datoer ved å klikke i månedsvelgeren. Jeg får lov til å skrive inn en ugyldig dato manuelt, og det kan virke som det underliggende skjemafeltet som holder på verdien ikke blir satt, noe som gjør at feilmeldingen bruker får er litt rar 🙃 Lurer på om vi kan få en del gratis her hvis vi lager en implementasjon av Månedvelgeren som kombinerer sånn det er gjort for Månedvelger i ba-sak-frontend og for Datovelgeren her i ba-soknad. Syns eeegentlig det smudeste hadde vært å skrive om sånn at skjemafeltet ikke holdt på en ISOString, men heller et Date-objekt (sånn som vi har skrevet om i ba-sak og ks-sak) - men da må man i så fall også sørge for at det blir gjort om til isostring før man sender det til backend (og her også kanskje noe greier med mellomlagring, men er ikke så kjent med koblingen mellom skjemafeltene og det som mellomlagres) Mye greier å skrive, så kanskje like greit å ta en muntlig prat i morgen i stedet 😆 |
||
|
||
return ( | ||
<MonthPicker {...monthpickerProps}> | ||
<MonthPicker.Input | ||
{...inputProps} | ||
label={label} | ||
error={ | ||
error && visFeilmeldinger | ||
? feilmeldinger[error] | ||
: felt.hentNavBaseSkjemaProps(visFeilmeldinger).error | ||
} | ||
/> | ||
</MonthPicker> | ||
); | ||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,11 @@ | ||
import React from 'react'; | ||
|
||
import { parseISO } from 'date-fns'; | ||
|
||
import { ESvar } from '@navikt/familie-form-elements'; | ||
|
||
import { useFeatureToggles } from '../../../context/FeatureToggleContext'; | ||
import { EFeatureToggle } from '../../../typer/feature-toggles'; | ||
import { IPensjonsperiode } from '../../../typer/perioder'; | ||
import { PersonType } from '../../../typer/personType'; | ||
import { dagensDato, gårsdagensDato } from '../../../utils/dato'; | ||
|
@@ -10,6 +14,7 @@ import Datovelger from '../Datovelger/Datovelger'; | |
import { LandDropdown } from '../Dropdowns/LandDropdown'; | ||
import JaNeiSpm from '../JaNeiSpm/JaNeiSpm'; | ||
import KomponentGruppe from '../KomponentGruppe/KomponentGruppe'; | ||
import { MånedÅrVelger } from '../MånedÅrVelger/MånedÅrVelger'; | ||
import { SkjemaFeiloppsummering } from '../SkjemaFeiloppsummering/SkjemaFeiloppsummering'; | ||
import SkjemaModal from '../SkjemaModal/SkjemaModal'; | ||
import SpråkTekst from '../SpråkTekst/SpråkTekst'; | ||
|
@@ -42,6 +47,8 @@ export const PensjonModal: React.FC<Props> = ({ | |
erDød, | ||
}); | ||
|
||
const { toggles } = useFeatureToggles(); | ||
|
||
const { mottarPensjonNå, pensjonTilDato, pensjonFraDato, pensjonsland } = skjema.felter; | ||
|
||
const onLeggTil = () => { | ||
|
@@ -119,34 +126,75 @@ export const PensjonModal: React.FC<Props> = ({ | |
/> | ||
)} | ||
|
||
{pensjonFraDato.erSynlig && ( | ||
<Datovelger | ||
felt={pensjonFraDato} | ||
label={ | ||
<SpråkTekst | ||
id={hentSpørsmålTekstId(PensjonsperiodeSpørsmålId.fraDatoPensjon)} | ||
values={{ ...(barn && { barn: barn.navn }) }} | ||
/> | ||
} | ||
skjema={skjema} | ||
avgrensMaxDato={periodenErAvsluttet ? gårsdagensDato() : dagensDato()} | ||
/> | ||
)} | ||
{pensjonTilDato.erSynlig && ( | ||
<Datovelger | ||
felt={pensjonTilDato} | ||
label={ | ||
<SpråkTekst | ||
id={hentSpørsmålTekstId(PensjonsperiodeSpørsmålId.tilDatoPensjon)} | ||
values={{ ...(barn && { barn: barn.navn }) }} | ||
/> | ||
} | ||
skjema={skjema} | ||
avgrensMaxDato={dagensDato()} | ||
tilhørendeFraOgMedFelt={pensjonFraDato} | ||
dynamisk | ||
/> | ||
)} | ||
{pensjonFraDato.erSynlig && | ||
(toggles[EFeatureToggle.BE_OM_MÅNED_IKKE_DATO] ? ( | ||
<MånedÅrVelger | ||
label={ | ||
<SpråkTekst | ||
id={hentSpørsmålTekstId( | ||
PensjonsperiodeSpørsmålId.fraDatoPensjon | ||
)} | ||
values={{ ...(barn && { barn: barn.navn }) }} | ||
/> | ||
} | ||
senesteValgbareMåned={ | ||
periodenErAvsluttet ? gårsdagensDato() : dagensDato() | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Blir dette fortsatt riktig nå med månedvelger? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ja, det tror jeg. Men det kan hende det er noe jeg overser? Det enkle caset: Caset rundt månedsskifter: Er det noe annet jeg ikke har tenkt på her? 🤔 |
||
felt={pensjonFraDato} | ||
visFeilmeldinger={skjema.visFeilmeldinger} | ||
/> | ||
) : ( | ||
<Datovelger | ||
felt={pensjonFraDato} | ||
label={ | ||
<SpråkTekst | ||
id={hentSpørsmålTekstId( | ||
PensjonsperiodeSpørsmålId.fraDatoPensjon | ||
)} | ||
values={{ ...(barn && { barn: barn.navn }) }} | ||
/> | ||
} | ||
skjema={skjema} | ||
avgrensMaxDato={periodenErAvsluttet ? gårsdagensDato() : dagensDato()} | ||
/> | ||
))} | ||
{pensjonTilDato.erSynlig && | ||
(toggles[EFeatureToggle.BE_OM_MÅNED_IKKE_DATO] ? ( | ||
<MånedÅrVelger | ||
label={ | ||
<SpråkTekst | ||
id={hentSpørsmålTekstId( | ||
PensjonsperiodeSpørsmålId.tilDatoPensjon | ||
)} | ||
values={{ ...(barn && { barn: barn.navn }) }} | ||
/> | ||
} | ||
tidligsteValgbareMåned={ | ||
pensjonFraDato.verdi !== '' | ||
? parseISO(pensjonFraDato.verdi) | ||
: undefined | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Dette kunne evt ha blitt gjort med å lage en funksjon som isoStringTilDate som du finner i dato.ts-filen i ba-sak-frontend |
||
senesteValgbareMåned={dagensDato()} | ||
felt={pensjonTilDato} | ||
visFeilmeldinger={skjema.visFeilmeldinger} | ||
/> | ||
) : ( | ||
<Datovelger | ||
felt={pensjonTilDato} | ||
label={ | ||
<SpråkTekst | ||
id={hentSpørsmålTekstId( | ||
PensjonsperiodeSpørsmålId.tilDatoPensjon | ||
)} | ||
values={{ ...(barn && { barn: barn.navn }) }} | ||
/> | ||
} | ||
skjema={skjema} | ||
avgrensMaxDato={dagensDato()} | ||
tilhørendeFraOgMedFelt={pensjonFraDato} | ||
dynamisk | ||
/> | ||
))} | ||
</KomponentGruppe> | ||
{visFeiloppsummering(skjema) && <SkjemaFeiloppsummering skjema={skjema} />} | ||
</SkjemaModal> | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Brukes kun til test og i byggesteget