From 23c23c717e561e37b354084bf95387a14dae7616 Mon Sep 17 00:00:00 2001 From: Hallvard Andreas Stark <57254397+hallvardastark@users.noreply.github.com> Date: Wed, 21 Aug 2024 12:48:31 +0200 Subject: [PATCH] =?UTF-8?q?TSFF-633=20-=20fikser=20typing=20og=20skriver?= =?UTF-8?q?=20bort=20redux-form=20i=20prosess-s=C3=B8knadsfrist=20(#6349)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * TSFF-633 - fikser typing og skriver bort redux-form Legger til knapp som muligjør endring av vurdering * Fikser i stories * Gjenoppretter story * La til tester Fikset resetting av form Skrevet bort siste rest av redux-form * Retter tester * Justerer css * Sjekker på om begrunnelse finnes før man kan redigere den * Flytter avbrytknapp til mer logisk sted Liten oppdatering av story * Fjerner bruk av react-intl, må beholde RawIntlProvider pga felleskomponenter som trenger * Fikser paneltittel * Fikser visning av løst aksjonspunkt * prettier av package.json --- package.json | 10 +- .../SoknadsfristPanelDef.tsx | 10 +- .../SoknadsfristPanelDef.tsx | 10 +- .../SoknadsfristPanelDef.tsx | 10 +- .../SoknadsfristPanelDef.tsx | 10 +- .../form/src/hook-form/RadioGroupPanel.tsx | 55 ++- .../i18n/nb_NO.json | 106 ---- .../prosess-vilkar-soknadsfrist/package.json | 10 +- .../SoknadsfristVilkarProsessIndex.spec.tsx | 122 ++++- ...SoknadsfristVilkarProsessIndex.stories.tsx | 430 +++++++++-------- .../src/SoknadsfristVilkarProsessIndex.tsx | 42 +- .../src/components/FormState.ts | 11 + .../OverstyrBekreftKnappPanel.spec.tsx | 10 +- .../components/OverstyrBekreftKnappPanel.tsx | 3 +- .../SoknadsfristVilkarDokument.module.css | 7 + .../components/SoknadsfristVilkarDokument.tsx | 126 ++--- .../SoknadsfristVilkarForm.spec.tsx | 14 +- .../src/components/SoknadsfristVilkarForm.tsx | 452 +++++++++--------- .../SoknadsfristVilkarHeader.spec.tsx | 35 +- .../components/SoknadsfristVilkarHeader.tsx | 40 +- .../prosess-vilkar-soknadsfrist/src/utils.ts | 9 +- packages/shared-components/src/EditedIcon.tsx | 23 +- packages/utils/src/date-utils/initialize.ts | 6 +- yarn.lock | 60 ++- 24 files changed, 811 insertions(+), 800 deletions(-) delete mode 100644 packages/prosess-vilkar-soknadsfrist/i18n/nb_NO.json create mode 100644 packages/prosess-vilkar-soknadsfrist/src/components/FormState.ts diff --git a/package.json b/package.json index 7f64253ca3..3b36ebe458 100644 --- a/package.json +++ b/package.json @@ -129,8 +129,14 @@ "workerDirectory": "public" }, "lint-staged": { - "packages/**/!(*.module.d.css).(ts|tsx|js|jsx)": ["eslint --cache --fix", "prettier --write"], - "packages/**/*.css": ["stylelint --fix", "prettier --write"] + "packages/**/!(*.module.d.css).(ts|tsx|js|jsx)": [ + "eslint --cache --fix", + "prettier --write" + ], + "packages/**/*.css": [ + "stylelint --fix", + "prettier --write" + ] }, "packageManager": "yarn@3.4.1" } diff --git a/packages/behandling-omsorgspenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/SoknadsfristPanelDef.tsx b/packages/behandling-omsorgspenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/SoknadsfristPanelDef.tsx index 3174d43f25..ef6d686c95 100644 --- a/packages/behandling-omsorgspenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/SoknadsfristPanelDef.tsx +++ b/packages/behandling-omsorgspenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/SoknadsfristPanelDef.tsx @@ -1,16 +1,14 @@ -import React from 'react'; - -import vilkarType from '@fpsak-frontend/kodeverk/src/vilkarType'; -import kodeverkTyper from '@fpsak-frontend/kodeverk/src/kodeverkTyper'; import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; -import SoknadsfristVilkarProsessIndex from '@k9-sak-web/prosess-vilkar-soknadsfrist'; +import kodeverkTyper from '@fpsak-frontend/kodeverk/src/kodeverkTyper'; +import vilkarType from '@fpsak-frontend/kodeverk/src/vilkarType'; import { ProsessStegPanelDef } from '@k9-sak-web/behandling-felles'; +import SoknadsfristVilkarProsessIndex from '@k9-sak-web/prosess-vilkar-soknadsfrist'; import { OmsorgspengerBehandlingApiKeys } from '../../../data/omsorgspengerBehandlingApi'; class SoknadsfristPanelDef extends ProsessStegPanelDef { getId = () => 'SOKNADSFRIST'; - getTekstKode = () => 'Inngangsvilkar.Soknadsfrist'; + getTekstKode = () => 'Søknadsfrist'; getKomponent = props => ; diff --git a/packages/behandling-opplaeringspenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/SoknadsfristPanelDef.tsx b/packages/behandling-opplaeringspenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/SoknadsfristPanelDef.tsx index e2d55ce098..33ce22cca1 100644 --- a/packages/behandling-opplaeringspenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/SoknadsfristPanelDef.tsx +++ b/packages/behandling-opplaeringspenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/SoknadsfristPanelDef.tsx @@ -1,16 +1,14 @@ -import React from 'react'; - -import vilkarType from '@fpsak-frontend/kodeverk/src/vilkarType'; -import kodeverkTyper from '@fpsak-frontend/kodeverk/src/kodeverkTyper'; import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; -import SoknadsfristVilkarProsessIndex from '@k9-sak-web/prosess-vilkar-soknadsfrist'; +import kodeverkTyper from '@fpsak-frontend/kodeverk/src/kodeverkTyper'; +import vilkarType from '@fpsak-frontend/kodeverk/src/vilkarType'; import { ProsessStegPanelDef } from '@k9-sak-web/behandling-felles'; +import SoknadsfristVilkarProsessIndex from '@k9-sak-web/prosess-vilkar-soknadsfrist'; import { OpplaeringspengerBehandlingApiKeys } from '../../../data/opplaeringspengerBehandlingApi'; class SoknadsfristPanelDef extends ProsessStegPanelDef { getId = () => 'SOKNADSFRIST'; - getTekstKode = () => 'Inngangsvilkar.Soknadsfrist'; + getTekstKode = () => 'Søknadsfrist'; getKomponent = props => ; diff --git a/packages/behandling-pleiepenger-sluttfase/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/SoknadsfristPanelDef.tsx b/packages/behandling-pleiepenger-sluttfase/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/SoknadsfristPanelDef.tsx index 2ac5f37b3d..368c7c425c 100644 --- a/packages/behandling-pleiepenger-sluttfase/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/SoknadsfristPanelDef.tsx +++ b/packages/behandling-pleiepenger-sluttfase/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/SoknadsfristPanelDef.tsx @@ -1,16 +1,14 @@ -import React from 'react'; - -import vilkarType from '@fpsak-frontend/kodeverk/src/vilkarType'; -import kodeverkTyper from '@fpsak-frontend/kodeverk/src/kodeverkTyper'; import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; -import SoknadsfristVilkarProsessIndex from '@k9-sak-web/prosess-vilkar-soknadsfrist'; +import kodeverkTyper from '@fpsak-frontend/kodeverk/src/kodeverkTyper'; +import vilkarType from '@fpsak-frontend/kodeverk/src/vilkarType'; import { ProsessStegPanelDef } from '@k9-sak-web/behandling-felles'; +import SoknadsfristVilkarProsessIndex from '@k9-sak-web/prosess-vilkar-soknadsfrist'; import { PleiepengerSluttfaseBehandlingApiKeys } from '../../../data/pleiepengerSluttfaseBehandlingApi'; class SoknadsfristPanelDef extends ProsessStegPanelDef { getId = () => 'SOKNADSFRIST'; - getTekstKode = () => 'Inngangsvilkar.Soknadsfrist'; + getTekstKode = () => 'Søknadsfrist'; getKomponent = props => ; diff --git a/packages/behandling-pleiepenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/SoknadsfristPanelDef.tsx b/packages/behandling-pleiepenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/SoknadsfristPanelDef.tsx index faf38103bf..2255d81f45 100644 --- a/packages/behandling-pleiepenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/SoknadsfristPanelDef.tsx +++ b/packages/behandling-pleiepenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/SoknadsfristPanelDef.tsx @@ -1,16 +1,14 @@ -import React from 'react'; - -import vilkarType from '@fpsak-frontend/kodeverk/src/vilkarType'; -import kodeverkTyper from '@fpsak-frontend/kodeverk/src/kodeverkTyper'; import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; -import SoknadsfristVilkarProsessIndex from '@k9-sak-web/prosess-vilkar-soknadsfrist'; +import kodeverkTyper from '@fpsak-frontend/kodeverk/src/kodeverkTyper'; +import vilkarType from '@fpsak-frontend/kodeverk/src/vilkarType'; import { ProsessStegPanelDef } from '@k9-sak-web/behandling-felles'; +import SoknadsfristVilkarProsessIndex from '@k9-sak-web/prosess-vilkar-soknadsfrist'; import { PleiepengerBehandlingApiKeys } from '../../../data/pleiepengerBehandlingApi'; class SoknadsfristPanelDef extends ProsessStegPanelDef { getId = () => 'SOKNADSFRIST'; - getTekstKode = () => 'Inngangsvilkar.Soknadsfrist'; + getTekstKode = () => 'Søknadsfrist'; getKomponent = props => ; diff --git a/packages/form/src/hook-form/RadioGroupPanel.tsx b/packages/form/src/hook-form/RadioGroupPanel.tsx index 3f13ba97a3..8f2eeed435 100644 --- a/packages/form/src/hook-form/RadioGroupPanel.tsx +++ b/packages/form/src/hook-form/RadioGroupPanel.tsx @@ -1,6 +1,6 @@ import { ErrorMessage } from '@hookform/error-message'; import { Radio, RadioGroup } from '@navikt/ds-react'; -import React from 'react'; +import React, { ReactElement } from 'react'; import { Controller, useFormContext } from 'react-hook-form'; import { getError } from './formUtils'; @@ -8,6 +8,7 @@ interface RadioProps { value: string; label: React.ReactNode; id?: string; + element?: ReactElement; } interface RadioGroupPanelProps { @@ -17,47 +18,59 @@ interface RadioGroupPanelProps { validators?: { [key: string]: (v: any) => string | boolean | undefined }; onChange?: (value) => void; disabled?: boolean; + readOnly?: boolean; } -const RadioGroupPanel = ({ question, name, validators, radios, onChange, disabled }: RadioGroupPanelProps) => { +const RadioGroupPanel = ({ + question, + name, + validators, + radios, + onChange, + disabled, + readOnly, +}: RadioGroupPanelProps) => { const { control, formState } = useFormContext(); const { errors } = formState; const customOnChange = onChange; return ( { - const reactHookFormOnChange = props.field.onChange; + render={({ field }) => { + const reactHookFormOnChange = field.onChange; + const valueToString = `${field.value}`; return ( } size="small" + readOnly={readOnly} + value={valueToString} > {radios.map(radio => ( - { - if (customOnChange) { - customOnChange(radio.value); - } - reactHookFormOnChange(radio.value); - }} - checked={radio.value === props.field.value} - disabled={disabled} - value={radio.value} - > - {radio.label} - + + { + if (customOnChange) { + customOnChange(radio.value); + } + reactHookFormOnChange(radio.value); + }} + disabled={disabled} + value={radio.value} + > + {radio.label} + + {radio.value === field.value && radio.element} + ))} ); diff --git a/packages/prosess-vilkar-soknadsfrist/i18n/nb_NO.json b/packages/prosess-vilkar-soknadsfrist/i18n/nb_NO.json deleted file mode 100644 index 28261db43a..0000000000 --- a/packages/prosess-vilkar-soknadsfrist/i18n/nb_NO.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "SoknadsfristVilkarForm.ErOppfylt": "Vilkåret er oppfylt for hele perioden", - "SoknadsfristVilkarForm.ErIkkeOppfylt": "Vilkåret er avslått", - "SoknadsfristVilkarForm.ErDelvisOppfylt": "Vilkåret er oppfylt for deler av perioden", - "SoknadsfristVilkarForm.IkkeBehandlet": "Ikke behandlet", - "SoknadsfristVilkarForm.Endret": "Endret av saksbehandler", - "SoknadsfristVilkarForm.AutomatiskVurdering": "Manuell overstyring av automatisk vurdering", - "SoknadsfristVilkarForm.AvklarVurdering": "Vurder om søknadsfristvilkåret er oppfylt", - "SoknadsfristVilkarForm.Avbryt": "Avbryt", - "SoknadsfristVilkarForm.Unntakstilfeller": "Overstyring skal kun gjøres i unntakstilfeller", - "SoknadsfristVilkarForm.VilkarIkkeOppfylt": "Vilkåret er ikke oppfylt for denne perioden", - "SoknadsfristVilkarForm.IngenDokumenter": "Det finnes ingen dokumenter knyttet til denne behandlingen", - - "SoknadsfristVilkarForm.Dato": "Oppgi dato søknadsfristvilkåret er oppfylt fra", - "SoknadsfristVilkarForm.ConfirmInformation": "Bekreft og gå videre", - - "OverstyrVurderingVelger.OverstyrBeregning": "Overstyr beregning", - "OverstyrVurderingVelger.OverstyrtBeregning": "Overstyrt beregning", - "OverstyrVurderingVelger.OverstyrAutomatiskVurdering": "Overstyr automatisk vurdering", - "OverstyrVurderingVelger.OverstyrtAutomatiskVurdering": "Overstyrt automatisk vurdering", - "OverstyrBekreftKnappPanel.ConfirmInformation": "Bekreft overstyring", - "VilkarBegrunnelse.Vilkar": "Vurder om det har vært fristavbrytende kontakt", - "VilkarResultPicker.Arsak": "Avslagsårsak", - "VilkarResultPicker.SelectArsak": "Velg årsak", - "VilkarResultPicker.VilkarOppfylt": "Vilkåret er oppfylt", - "VilkarResultPicker.VilkarIkkeOppfylt": "Vilkåret er ikke oppfylt", - "VilkarResultPanel.VilkarOppfylt": "Vilkåret er oppfylt", - "VilkarResultPanel.VilkarIkkeOppfylt": "Vilkåret er ikke oppfylt", - "VilkarResultPicker.VilkarOppfyltRevurderingFom": "Vilkåret er oppfylt f.o.m. {fom}", - "VilkarResultPicker.VilkarIkkeOppfyltRevurderingFom": "Vilkåret er ikke oppfylt f.o.m. {fom}", - - "Inngangsvilkar.Soknadsfrist": "Søknadsfrist", - - "VilkarBegrunnelse.BegrunnVurdering": "Begrunn vurderingen din", - "VilkarResultPicker.VilkarDato": "Dato", - "ValidationMessage.NotEmpty": "Feltet må fylles ut", - "ValidationMessage.MinLength": "Du må skrive minst {length} tegn", - "ValidationMessage.MaxLength": "Du kan skrive maksimalt {length} tegn", - "ValidationMessage.MinValue": "Feltet må være større eller lik {length}", - "ValidationMessage.MaxValue": "Feltet må være mindre eller lik {length}", - "ValidationMessage.InvalidDate": "Dato må skrives slik : dd.mm.åååå", - "ValidationMessage.DateNotBeforeOrEqual": "Dato må være før eller lik {limit}", - "ValidationMessage.DateNotAfterOrEqual": "Dato må være etter eller lik {limit}", - "ValidationMessage.DateRangesOverlapping": "Perioder kan ikke overlappe i tid", - "ValidationMessage.DateRangesOverlappingPeriodTypes": "Perioder kan ikke overlappe i tid (uttak, utsettelse, gradering, overforing, opphold)", - "ValidationMessage.DatesNotEqual": "Dato må være lik {value}", - "ValidationMessage.InvalidInteger": "Tallet kan ikke ha desimaler", - "ValidationMessage.InvalidDecimal": "Tallet kan ikke inneholde mer enn to desimaler", - "ValidationMessage.InvalidDatesInPeriod": "Periode må skrives slik : dd.mm.åååå - dd.mm.åååå", - "ValidationMessage.InvalidPeriod": "Startdato må være før eller lik sluttdato", - "ValidationMessage.InvalidPeriodRange": "Periode er utenfor opptjeningsperioden", - "ValidationMessage.InvalidNumber": "Feltet kan kun inneholde tall", - "ValidationMessage.utbetalingsgradErMerSamtidigUttaksprosent": "Feltet kan ikke være høyere enn samtidig uttaksprosent", - "ValidationMessage.maxLengthOrFodselsnr": "Du kan skrive maksimalt {length} tegn eller et fødselsnummer (11 siffer)", - "ValidationMessage.Registrering.TerminEllerFoedselMessage": "Fyll ut informasjon om termindato eller fødselsdato", - "ValidationMessage.InvalidFodselsnummerFormat": "Feltet må være et fødselsnummer (11 siffer)", - "ValidationMessage.InvalidFodselsnummer": "Ugyldig fødselsnummer", - "ValidationMessage.SammeFodselsnummerSomSoker": "Fødselsnummer til den andre forelderen kan ikke være det samme som søker.", - "ValidationMessage.InvalidText": "Feltet inneholder ugyldige tegn: {text}", - "ValidationMessage.InvalidValue": "Feltet inneholder en ugyldig verdi: {value}", - "ValidationMessage.ArrayMinLength": "Listen må ha lengde større enn: {length}", - "ValidationMessage.InvalidSaksnummerOrFodselsnummerFormat": "Ugyldig saksnummer eller fødselsnummer", - "ValidationMessage.InvalidTrekkAntallDagerUttakForm": "Antall dager i {periode} kan ikke være høyere enn {maxDays}", - "ValidationMessage.InvalidTrekkDagerFlerbarnsdager": "Antall dager med flerbarnsdager kan ikke være høyere enn {maxDays}", - "ValidationMessage.NegativeSaldo": "Antall dager kan ikke overstige dagene som gjenstår på {periode}. Det er oppgitt {days} dager for mye.", - "ValidationMessage.InvalidStonadskonto": "Stønadskonto {konto} er ikke tilgjengelig", - "ValidationMessage.MinstEnPeriodeRequired": "Minst en av følgende perioder må være utfylt: fullt uttak, overføring av kvote, utsettelse eller gradering", - "ValidationMessage.trekkdagerErMerEnnNullUtsettelse": "Ingen trekkdager for utsettelse", - "ValidationMessage.utbetalingMerEnnNullUtsettelse": "Ingen utbetalingsgrad for utsettelse", - "ValidationMessage.ukerOgDagerVidNullUtbetalningsgradMessage": "Trekk minst en dag når utbetalingsgraden er høyre enn 0%", - "ValidationMessage.UtsettelseUtenFullArbeid": "Søker har ikke 100% stilling, vurder om perioden kan utsettes.", - "ValidationMessage.MerEn100Prosent": "Samlet utbetalingsgrad og andel i arbeid bør ikke overskride 100%.", - "ValidationMessage.MerEn100ProsentOgOgyldigUtsettlse": "Samlet utbetalingsgrad og andel i arbeid bør ikke overskride 100%. Søker har ikke 100% stilling, vurder om perioden kan utsettes.", - "ValidationMessage.InvalidOrganisasjonsnummer": "Ugyldig organisasjonsnummer.", - "Calendar.Day.0": "søndag", - "Calendar.Day.1": "mandag", - "Calendar.Day.2": "tirsdag", - "Calendar.Day.3": "onsdag", - "Calendar.Day.4": "torsdag", - "Calendar.Day.5": "fredag", - "Calendar.Day.6": "lørdag", - "Calendar.Day.Short.0": "søn", - "Calendar.Day.Short.1": "man", - "Calendar.Day.Short.2": "tir", - "Calendar.Day.Short.3": "ons", - "Calendar.Day.Short.4": "tor", - "Calendar.Day.Short.5": "fre", - "Calendar.Day.Short.6": "lør", - "Calendar.Month.0": "Januar", - "Calendar.Month.1": "Februar", - "Calendar.Month.2": "Mars", - "Calendar.Month.3": "April", - "Calendar.Month.4": "Mai", - "Calendar.Month.5": "Juni", - "Calendar.Month.6": "Juli", - "Calendar.Month.7": "August", - "Calendar.Month.8": "September", - "Calendar.Month.9": "Oktober", - "Calendar.Month.10": "November", - "Calendar.Month.11": "Desember", - "Behandling.EditedField": "Saksbehandler har endret feltets verdi", - - "Sidemeny.Perioder": "Perioder", - - "HelpText.Aksjonspunkt": "Aksjonspunkt" -} diff --git a/packages/prosess-vilkar-soknadsfrist/package.json b/packages/prosess-vilkar-soknadsfrist/package.json index 6f17e2ceb3..dd604fd197 100644 --- a/packages/prosess-vilkar-soknadsfrist/package.json +++ b/packages/prosess-vilkar-soknadsfrist/package.json @@ -12,16 +12,14 @@ "@fpsak-frontend/utils": "1.0.0", "@k9-sak-web/sak-app": "1.0.0", "@k9-sak-web/types": "1.0.0", + "@navikt/ft-form-hooks": "4.4.19", + "@navikt/ft-form-validators": "2.3.17", "@navikt/ft-plattform-komponenter": "3.0.4", "classnames": "2.5.1", - "moment": "2.30.1", "object-hash": "3.0.0", "react": "18.3.1", - "react-intl": "6.6.8", - "react-redux": "9.1.2", - "redux": "5.0.1", - "redux-form": "8.3.10", - "reselect": "5.1.1" + "react-hook-form": "7.52.2", + "react-intl": "6.6.8" }, "devDependencies": { "@fpsak-frontend/utils-test": "1.0.0" diff --git a/packages/prosess-vilkar-soknadsfrist/src/SoknadsfristVilkarProsessIndex.spec.tsx b/packages/prosess-vilkar-soknadsfrist/src/SoknadsfristVilkarProsessIndex.spec.tsx index 0ddf40e649..0adec9b7b5 100644 --- a/packages/prosess-vilkar-soknadsfrist/src/SoknadsfristVilkarProsessIndex.spec.tsx +++ b/packages/prosess-vilkar-soknadsfrist/src/SoknadsfristVilkarProsessIndex.spec.tsx @@ -1,9 +1,12 @@ -import { renderWithIntlAndReduxForm } from '@fpsak-frontend/utils-test/test-utils'; import { Behandling } from '@k9-sak-web/types'; -import { screen } from '@testing-library/react'; +import { composeStories } from '@storybook/react'; +import { userEvent, waitFor } from '@storybook/test'; +import { act, render, screen } from '@testing-library/react'; import React from 'react'; import SoknadsfristVilkarProsessIndex from './SoknadsfristVilkarProsessIndex'; -import messages from '../i18n/nb_NO.json'; +import * as stories from './SoknadsfristVilkarProsessIndex.stories'; + +const { VisSoknadsfristAksjonspunkt5077 } = composeStories(stories); const soknadsfristStatus = { dokumentStatus: [], @@ -11,7 +14,7 @@ const soknadsfristStatus = { describe('', () => { it('skal rendre tabs dersom bare en periode', () => { - renderWithIntlAndReduxForm( + render( ', () => { toggleOverstyring={vi.fn()} submitCallback={vi.fn()} aksjonspunkter={[]} - panelTittelKode="Inngangsvilkar.Soknadsfrist" + panelTittelKode="Søknadsfrist" erOverstyrt={false} overrideReadOnly={false} vilkar={[ @@ -57,14 +60,13 @@ describe('', () => { soknadsfristStatus={soknadsfristStatus} visAllePerioder={false} />, - { messages }, ); expect(screen.getByText('Perioder')).toBeInTheDocument(); expect(screen.getByRole('button', { name: '01.03.2020 - 01.04.2020' })).toBeInTheDocument(); }); it('skal rendre tabs med aksjonspunkt dersom bare en periode og statusperiode er inneholdt i vilkårsperiode', () => { - renderWithIntlAndReduxForm( + render( ', () => { vurderPaNyttArsaker: null, }, ]} - panelTittelKode="Inngangsvilkar.Soknadsfrist" + panelTittelKode="Søknadsfrist" erOverstyrt={false} overrideReadOnly={false} vilkar={[ @@ -164,7 +166,6 @@ describe('', () => { }} visAllePerioder={false} />, - { messages }, ); expect(screen.getByText('Perioder')).toBeInTheDocument(); expect(screen.getByRole('button', { name: '01.02.2023 - 01.04.2024 Aksjonspunkt' })).toBeInTheDocument(); @@ -172,4 +173,107 @@ describe('', () => { expect(screen.getByRole('radio', { name: 'Vilkåret er oppfylt for deler av perioden' })).toBeInTheDocument(); expect(screen.getByRole('radio', { name: 'Vilkåret er ikke oppfylt for denne perioden' })).toBeInTheDocument(); }); + + it('skal formatere data ved innsending ved oppfylt vilkår', async () => { + const lagre = vi.fn(); + render(); + await act(async () => { + await userEvent.click(screen.getByText('Vilkåret er oppfylt for hele perioden')); + await userEvent.type( + screen.getByLabelText('Vurder om det har vært fristavbrytende kontakt'), + 'Dette er en begrunnelse', + ); + await userEvent.click(screen.getByText('Bekreft og gå videre')); + }); + await waitFor(() => expect(lagre).toHaveBeenCalledTimes(1)); + expect(lagre).toHaveBeenNthCalledWith(1, [ + { + avklarteKrav: [ + { + begrunnelse: 'Dette er en begrunnelse', + erVilkarOk: true, + fraDato: '2021-04-27', + godkjent: true, + journalpostId: '510536417', + }, + ], + begrunnelse: 'Dette er en begrunnelse', + erVilkarOk: true, + kode: '5077', + periode: { + fom: '2021-04-28', + tom: '2021-04-30', + }, + }, + ]); + }); + + it('skal formatere data ved innsending ved delvis oppfylt vilkår', async () => { + const lagre = vi.fn(); + render(); + await act(async () => { + await userEvent.click(screen.getByText('Vilkåret er oppfylt for deler av perioden')); + await userEvent.type( + screen.getByLabelText('Vurder om det har vært fristavbrytende kontakt'), + 'Dette er en begrunnelse', + ); + await userEvent.type(screen.getByLabelText('Oppgi dato søknadsfristvilkåret er oppfylt fra'), '03.05.2021'); + await userEvent.click(screen.getByText('Bekreft og gå videre')); + }); + await waitFor(() => expect(lagre).toHaveBeenCalledTimes(1)); + expect(lagre).toHaveBeenNthCalledWith(1, [ + { + avklarteKrav: [ + { + begrunnelse: 'Dette er en begrunnelse', + erVilkarOk: true, + fraDato: '2021-05-02', + godkjent: true, + journalpostId: '510536417', + }, + ], + begrunnelse: 'Dette er en begrunnelse', + erVilkarOk: true, + kode: '5077', + periode: { + fom: '2021-04-28', + tom: '2021-04-30', + }, + }, + ]); + }); + + it('skal formatere data ved innsending ved ikke oppfylt vilkår', async () => { + const lagre = vi.fn(); + render(); + await act(async () => { + await userEvent.click(screen.getByLabelText('ikke', { exact: false })); + await userEvent.type( + screen.getByLabelText('Vurder om det har vært fristavbrytende kontakt'), + 'Dette er en begrunnelse', + ); + await userEvent.click(screen.getByText('Bekreft og gå videre')); + }); + await waitFor(() => expect(lagre).toHaveBeenCalledTimes(1)); + expect(lagre).toHaveBeenNthCalledWith(1, [ + { + avklarteKrav: [ + { + begrunnelse: 'Dette er en begrunnelse', + erVilkarOk: false, + fraDato: '2021-04-30', + godkjent: false, + journalpostId: '510536417', + }, + ], + begrunnelse: 'Dette er en begrunnelse', + erVilkarOk: false, + kode: '5077', + periode: { + fom: '2021-04-28', + tom: '2021-04-30', + }, + }, + ]); + }); }); diff --git a/packages/prosess-vilkar-soknadsfrist/src/SoknadsfristVilkarProsessIndex.stories.tsx b/packages/prosess-vilkar-soknadsfrist/src/SoknadsfristVilkarProsessIndex.stories.tsx index c244253dfc..78f9e09d8a 100644 --- a/packages/prosess-vilkar-soknadsfrist/src/SoknadsfristVilkarProsessIndex.stories.tsx +++ b/packages/prosess-vilkar-soknadsfrist/src/SoknadsfristVilkarProsessIndex.stories.tsx @@ -5,6 +5,7 @@ import vilkarUtfallType from '@fpsak-frontend/kodeverk/src/vilkarUtfallType'; import { behandlingType } from '@k9-sak-web/backend/k9sak/kodeverk/behandling/BehandlingType.js'; import { Behandling, DokumentStatus, Vilkar } from '@k9-sak-web/types'; import { action } from '@storybook/addon-actions'; +import { Meta, StoryObj } from '@storybook/react'; import SoknadsfristVilkarProsessIndex from './SoknadsfristVilkarProsessIndex'; const vilkarSoknadsfrist = [ @@ -71,252 +72,257 @@ const soknadsStatus = { ] as DokumentStatus[], }; -export default { +const meta: Meta = { title: 'prosess/prosess-vilkar-soknadsfrist', component: SoknadsfristVilkarProsessIndex, }; + +type Story = StoryObj; + const behandling = { id: 1, versjon: 1, type: { kode: behandlingType.FØRSTEGANGSSØKNAD, kodeverk: 'BEHANDLING_TYPE' }, } as Behandling; -export const visOverstyringspanelForSoknadsfrist = props => { - const [erOverstyrt, toggleOverstyring] = React.useState(false); - return ( - toggleOverstyring(!erOverstyrt)} - erOverstyrt={erOverstyrt} - soknadsfristStatus={soknadsStatus} - panelTittelKode="Inngangsvilkar.Soknadsfrist" - vilkar={vilkarSoknadsfrist} - visAllePerioder - {...props} - /> - ); -}; - -visOverstyringspanelForSoknadsfrist.args = { - overrideReadOnly: false, - kanOverstyreAccess: { - isEnabled: true, +export const visOverstyringspanelForSoknadsfrist: Story = { + args: { + overrideReadOnly: false, + kanOverstyreAccess: { + isEnabled: true, + }, + }, + render: props => { + const [erOverstyrt, toggleOverstyring] = React.useState(false); + return ( + toggleOverstyring(!erOverstyrt)} + erOverstyrt={erOverstyrt} + soknadsfristStatus={soknadsStatus} + panelTittelKode="Søknadsfrist" + vilkar={vilkarSoknadsfrist} + {...props} + /> + ); }, }; -export const visOverstyringspanelForSoknadsfristUtenDokumenter = props => { - const [erOverstyrt, toggleOverstyring] = React.useState(false); - return ( - toggleOverstyring(!erOverstyrt)} - erOverstyrt={erOverstyrt} - soknadsfristStatus={{ dokumentStatus: [] }} - panelTittelKode="Inngangsvilkar.Soknadsfrist" - vilkar={vilkarSoknadsfrist} - visAllePerioder - {...props} - /> - ); -}; - -visOverstyringspanelForSoknadsfristUtenDokumenter.args = { - overrideReadOnly: false, - kanOverstyreAccess: { - isEnabled: true, +export const visOverstyringspanelForSoknadsfristUtenDokumenter: Story = { + args: { + overrideReadOnly: false, + kanOverstyreAccess: { + isEnabled: true, + }, + }, + render: props => { + const [erOverstyrt, toggleOverstyring] = React.useState(false); + return ( + toggleOverstyring(!erOverstyrt)} + erOverstyrt={erOverstyrt} + soknadsfristStatus={{ dokumentStatus: [] }} + panelTittelKode="Søknadsfrist" + vilkar={vilkarSoknadsfrist} + {...props} + /> + ); }, }; -export const visSoknadsfristAksjonspunkt5077 = props => { - const [erOverstyrt, toggleOverstyring] = React.useState(false); - return ( - toggleOverstyring(!erOverstyrt)} - erOverstyrt={erOverstyrt} - soknadsfristStatus={{ - dokumentStatus: [ +export const VisSoknadsfristAksjonspunkt5077: Story = { + args: { + overrideReadOnly: false, + kanOverstyreAccess: { + isEnabled: true, + }, + }, + render: props => { + const [erOverstyrt, toggleOverstyring] = React.useState(false); + return ( + toggleOverstyring(!erOverstyrt)} + erOverstyrt={erOverstyrt} + soknadsfristStatus={{ + dokumentStatus: [ + { + type: 'SØKNAD', + status: [ + { + periode: { fom: '2021-04-28', tom: '2021-04-30' }, + status: { kode: 'IKKE_VURDERT', kodeverk: 'VILKAR_UTFALL_TYPE' }, + }, + { + periode: { fom: '2021-05-01', tom: '2021-05-05' }, + status: { kode: 'OPPFYLT', kodeverk: 'VILKAR_UTFALL_TYPE' }, + }, + ], + innsendingstidspunkt: '2021-08-19T11:50:21.894', + journalpostId: '510536417', + avklarteOpplysninger: null, + overstyrteOpplysninger: null, + }, + ], + }} + panelTittelKode="Søknadsfrist" + vilkar={[ + { + vilkarType: { kode: 'FP_VK_3', kodeverk: 'VILKAR_TYPE' }, + lovReferanse: null, + overstyrbar: true, + perioder: [ { + avslagKode: null, + merknadParametere: {}, + vilkarStatus: { kode: 'IKKE_VURDERT', kodeverk: 'VILKAR_UTFALL_TYPE' }, periode: { fom: '2021-04-28', tom: '2021-04-30' }, - status: { kode: 'IKKE_VURDERT', kodeverk: 'VILKAR_UTFALL_TYPE' }, + begrunnelse: null, + vurderesIBehandlingen: true, }, { + avslagKode: null, + merknadParametere: {}, + vilkarStatus: { kode: 'OPPFYLT', kodeverk: 'VILKAR_UTFALL_TYPE' }, periode: { fom: '2021-05-01', tom: '2021-05-05' }, - status: { kode: 'OPPFYLT', kodeverk: 'VILKAR_UTFALL_TYPE' }, + begrunnelse: null, + vurderesIBehandlingen: true, }, ], - innsendingstidspunkt: '2021-08-19T11:50:21.894', - journalpostId: '510536417', - avklarteOpplysninger: null, - overstyrteOpplysninger: null, }, - ], - }} - panelTittelKode="Inngangsvilkar.Soknadsfrist" - vilkar={[ - { - vilkarType: { kode: 'FP_VK_3', kodeverk: 'VILKAR_TYPE' }, - lovReferanse: null, - overstyrbar: true, - perioder: [ - { - avslagKode: null, - merknadParametere: {}, - vilkarStatus: { kode: 'IKKE_VURDERT', kodeverk: 'VILKAR_UTFALL_TYPE' }, - periode: { fom: '2021-04-28', tom: '2021-04-30' }, - begrunnelse: null, - vurderesIBehandlingen: true, - }, - { - avslagKode: null, - merknadParametere: {}, - vilkarStatus: { kode: 'OPPFYLT', kodeverk: 'VILKAR_UTFALL_TYPE' }, - periode: { fom: '2021-05-01', tom: '2021-05-05' }, - begrunnelse: null, - vurderesIBehandlingen: true, - }, - ], - }, - ]} - visAllePerioder={false} - {...props} - /> - ); -}; - -visSoknadsfristAksjonspunkt5077.args = { - overrideReadOnly: false, - kanOverstyreAccess: { - isEnabled: true, + ]} + {...props} + /> + ); }, }; -export const visSoknadsfristAksjonspunkt5077Delvis = props => { - const [erOverstyrt, toggleOverstyring] = React.useState(false); - return ( - toggleOverstyring(!erOverstyrt)} - erOverstyrt={erOverstyrt} - soknadsfristStatus={{ - dokumentStatus: [ +export const visSoknadsfristAksjonspunkt5077Delvis: Story = { + args: { + overrideReadOnly: false, + kanOverstyreAccess: { + isEnabled: true, + }, + }, + render: props => { + const [erOverstyrt, toggleOverstyring] = React.useState(false); + return ( + toggleOverstyring(!erOverstyrt)} + erOverstyrt={erOverstyrt} + soknadsfristStatus={{ + dokumentStatus: [ + { + type: 'SØKNAD', + status: [ + { + periode: { fom: '2021-04-26', tom: '2021-04-27' }, + status: { kode: 'IKKE_OPPFYLT', kodeverk: 'VILKAR_UTFALL_TYPE' }, + }, + { + periode: { fom: '2021-04-28', tom: '2021-05-06' }, + status: { kode: 'OPPFYLT', kodeverk: 'VILKAR_UTFALL_TYPE' }, + }, + ], + innsendingstidspunkt: '2021-08-26T16:17:16.538', + journalpostId: '510540058', + avklarteOpplysninger: { + godkjent: true, + fraDato: '2021-04-27', + begrunnelse: [ + 'jsdfsdf ljksdlkfj sldjf lsdkjf lsjdf\n\n\n', + 'sdsdfs øjjølksdjfølkjsd fjsd s fløskjdflsjd f\n\n\n', + 'sdklfjsøl jølsdjfø lsjdfljsldøjf sdjf slødjf sld\n\n\n', + 'sldfj sljfølsjd fløsdlfj øsldjf lsøjdfølsdjfløsjd lsdfs', + ].join(''), + opprettetAv: 'saksbeh', + opprettetTidspunkt: '2021-08-26T16:17:16.538', + }, + overstyrteOpplysninger: null, + }, + ], + }} + panelTittelKode="Søknadsfrist" + vilkar={[ { - type: 'SØKNAD', - status: [ + vilkarType: { kode: 'FP_VK_3', kodeverk: 'VILKAR_TYPE' }, + lovReferanse: null, + overstyrbar: true, + perioder: [ { + avslagKode: '1007', + merknadParametere: {}, + vilkarStatus: { kode: 'IKKE_OPPFYLT', kodeverk: 'VILKAR_UTFALL_TYPE' }, periode: { fom: '2021-04-26', tom: '2021-04-27' }, - status: { kode: 'IKKE_OPPFYLT', kodeverk: 'VILKAR_UTFALL_TYPE' }, + begrunnelse: null, + vurderesIBehandlingen: true, + }, + { + avslagKode: null, + merknadParametere: {}, + vilkarStatus: { kode: 'OPPFYLT', kodeverk: 'VILKAR_UTFALL_TYPE' }, + periode: { fom: '2021-04-28', tom: '2021-04-30' }, + begrunnelse: null, + vurderesIBehandlingen: true, }, { - periode: { fom: '2021-04-28', tom: '2021-05-06' }, - status: { kode: 'OPPFYLT', kodeverk: 'VILKAR_UTFALL_TYPE' }, + avslagKode: null, + merknadParametere: {}, + vilkarStatus: { kode: 'OPPFYLT', kodeverk: 'VILKAR_UTFALL_TYPE' }, + periode: { fom: '2021-05-01', tom: '2021-05-06' }, + begrunnelse: null, + vurderesIBehandlingen: true, }, ], - innsendingstidspunkt: '2021-08-26T16:17:16.538', - journalpostId: '510540058', - avklarteOpplysninger: { - godkjent: true, - fraDato: '2021-04-27', - begrunnelse: [ - 'jsdfsdf ljksdlkfj sldjf lsdkjf lsjdf\n\n\n', - 'sdsdfs øjjølksdjfølkjsd fjsd s fløskjdflsjd f\n\n\n', - 'sdklfjsøl jølsdjfø lsjdfljsldøjf sdjf slødjf sld\n\n\n', - 'sldfj sljfølsjd fløsdlfj øsldjf lsøjdfølsdjfløsjd lsdfs', - ].join(''), - opprettetAv: 'saksbeh', - opprettetTidspunkt: '2021-08-26T16:17:16.538', - }, - overstyrteOpplysninger: null, }, - ], - }} - panelTittelKode="Inngangsvilkar.Soknadsfrist" - vilkar={[ - { - vilkarType: { kode: 'FP_VK_3', kodeverk: 'VILKAR_TYPE' }, - lovReferanse: null, - overstyrbar: true, - perioder: [ - { - avslagKode: '1007', - merknadParametere: {}, - vilkarStatus: { kode: 'IKKE_OPPFYLT', kodeverk: 'VILKAR_UTFALL_TYPE' }, - periode: { fom: '2021-04-26', tom: '2021-04-27' }, - begrunnelse: null, - vurderesIBehandlingen: true, - }, - { - avslagKode: null, - merknadParametere: {}, - vilkarStatus: { kode: 'OPPFYLT', kodeverk: 'VILKAR_UTFALL_TYPE' }, - periode: { fom: '2021-04-28', tom: '2021-04-30' }, - begrunnelse: null, - vurderesIBehandlingen: true, - }, - { - avslagKode: null, - merknadParametere: {}, - vilkarStatus: { kode: 'OPPFYLT', kodeverk: 'VILKAR_UTFALL_TYPE' }, - periode: { fom: '2021-05-01', tom: '2021-05-06' }, - begrunnelse: null, - vurderesIBehandlingen: true, - }, - ], - }, - ]} - visAllePerioder - {...props} - /> - ); -}; - -visSoknadsfristAksjonspunkt5077Delvis.args = { - overrideReadOnly: false, - kanOverstyreAccess: { - isEnabled: true, + ]} + {...props} + /> + ); }, }; + +export default meta; diff --git a/packages/prosess-vilkar-soknadsfrist/src/SoknadsfristVilkarProsessIndex.tsx b/packages/prosess-vilkar-soknadsfrist/src/SoknadsfristVilkarProsessIndex.tsx index 75c1668b70..f0bcb9b3c6 100644 --- a/packages/prosess-vilkar-soknadsfrist/src/SoknadsfristVilkarProsessIndex.tsx +++ b/packages/prosess-vilkar-soknadsfrist/src/SoknadsfristVilkarProsessIndex.tsx @@ -1,5 +1,5 @@ import classNames from 'classnames/bind'; -import moment from 'moment'; +import { Dayjs } from 'dayjs'; import React, { SetStateAction, useEffect, useState } from 'react'; import { RawIntlProvider, createIntl, createIntlCache } from 'react-intl'; @@ -8,7 +8,7 @@ import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; import aksjonspunktStatus from '@fpsak-frontend/kodeverk/src/aksjonspunktStatus'; import vilkarUtfallType from '@fpsak-frontend/kodeverk/src/vilkarUtfallType'; import { Image } from '@fpsak-frontend/shared-components'; -import { dateFormat } from '@fpsak-frontend/utils'; +import { dateFormat, initializeDate } from '@fpsak-frontend/utils'; import { Aksjonspunkt, Behandling, DokumentStatus, SubmitCallback, Vilkar } from '@k9-sak-web/types'; import { SideMenu } from '@navikt/ft-plattform-komponenter'; @@ -17,8 +17,6 @@ import SoknadsfristVilkarForm from './components/SoknadsfristVilkarForm'; import SoknadsfristVilkarHeader from './components/SoknadsfristVilkarHeader'; import { utledInnsendtSoknadsfrist } from './utils'; -import messages from '../i18n/nb_NO.json'; - import styles from './SoknadsfristVilkarProsessIndex.module.css'; const cx = classNames.bind(styles); @@ -28,7 +26,6 @@ const cache = createIntlCache(); const intl = createIntl( { locale: 'nb-NO', - messages, }, cache, ); @@ -53,10 +50,10 @@ interface SoknadsfristVilkarProsessIndexProps { // Finner ut om Statusperiode gjelder for vilkårsperiode const erRelevantForPeriode = ( - vilkårPeriodeFom: moment.Moment, - vilkårPeriodeTom: moment.Moment, - statusPeriodeFom: moment.Moment, - statusPeriodeTom: moment.Moment, + vilkårPeriodeFom: Dayjs, + vilkårPeriodeTom: Dayjs, + statusPeriodeFom: Dayjs, + statusPeriodeTom: Dayjs, innsendtDato: string, ) => { // er starten av vilkårsperioden før opprinnelig søkndasfrist @@ -122,12 +119,12 @@ const SoknadsfristVilkarProsessIndex = ({ return false; } - const statusPeriodeFom = moment(status.periode.fom); - const statusPeriodeTom = moment(status.periode.tom); + const statusPeriodeFom = initializeDate(status.periode.fom); + const statusPeriodeTom = initializeDate(status.periode.tom); return perioder.some(vilkårPeriode => { - const vilkårPeriodeFom = moment(vilkårPeriode.periode.fom); - const vilkårPeriodeTom = moment(vilkårPeriode.periode.tom); + const vilkårPeriodeFom = initializeDate(vilkårPeriode.periode.fom); + const vilkårPeriodeTom = initializeDate(vilkårPeriode.periode.tom); return erRelevantForPeriode( vilkårPeriodeFom, vilkårPeriodeTom, @@ -140,13 +137,13 @@ const SoknadsfristVilkarProsessIndex = ({ ) : []; - const activePeriodeFom = moment(activePeriode.periode.fom); - const activePeriodeTom = moment(activePeriode.periode.tom); + const activePeriodeFom = initializeDate(activePeriode.periode.fom); + const activePeriodeTom = initializeDate(activePeriode.periode.tom); const dokumenterIAktivPeriode = dokumenterSomSkalVurderes.filter(dok => dok.status.some(status => { - const statusPeriodeFom = moment(status.periode.fom); - const statusPeriodeTom = moment(status.periode.tom); + const statusPeriodeFom = initializeDate(status.periode.fom); + const statusPeriodeTom = initializeDate(status.periode.tom); return erRelevantForPeriode( activePeriodeFom, activePeriodeTom, @@ -167,16 +164,12 @@ const SoknadsfristVilkarProsessIndex = ({ label: `${dateFormat(periode.fom)} - ${dateFormat(periode.tom)}`, icon: (erOverstyrt || harÅpentAksjonspunkt) && vilkarStatus.kode !== vilkarUtfallType.OPPFYLT ? ( - {intl.formatMessage({ + Aksjonspunkt ) : null, }))} onClick={setActiveTab} theme="arrow" - heading={intl.formatMessage({ id: 'Sidemeny.Perioder' })} + heading="Perioder" />
@@ -199,11 +192,8 @@ const SoknadsfristVilkarProsessIndex = ({ erOverstyrt={erOverstyrt} submitCallback={submitCallback} overrideReadOnly={overrideReadOnly} - kanOverstyreAccess={kanOverstyreAccess} toggleOverstyring={toggleOverstyring} status={activePeriode.vilkarStatus.kode} - panelTittelKode={panelTittelKode} - lovReferanse={activeVilkår.lovReferanse ?? lovReferanse} alleDokumenter={dokumenterSomSkalVurderes} dokumenterIAktivPeriode={dokumenterIAktivPeriode} periode={activePeriode} diff --git a/packages/prosess-vilkar-soknadsfrist/src/components/FormState.ts b/packages/prosess-vilkar-soknadsfrist/src/components/FormState.ts new file mode 100644 index 0000000000..777e6b0f23 --- /dev/null +++ b/packages/prosess-vilkar-soknadsfrist/src/components/FormState.ts @@ -0,0 +1,11 @@ +interface AvklarteKrav { + erVilkarOk: string | boolean; + begrunnelse: string; + journalpostId: string; + fraDato: string; +} + +export interface FormState { + isOverstyrt: boolean; + avklarteKrav: AvklarteKrav[]; +} diff --git a/packages/prosess-vilkar-soknadsfrist/src/components/OverstyrBekreftKnappPanel.spec.tsx b/packages/prosess-vilkar-soknadsfrist/src/components/OverstyrBekreftKnappPanel.spec.tsx index 3af8dd39da..7c1c06be9f 100644 --- a/packages/prosess-vilkar-soknadsfrist/src/components/OverstyrBekreftKnappPanel.spec.tsx +++ b/packages/prosess-vilkar-soknadsfrist/src/components/OverstyrBekreftKnappPanel.spec.tsx @@ -1,21 +1,17 @@ -import { renderWithIntl } from '@fpsak-frontend/utils-test/test-utils'; -import { screen } from '@testing-library/react'; +import { render, screen } from '@testing-library/react'; import React from 'react'; -import messages from '../../i18n/nb_NO.json'; import OverstyrBekreftKnappPanel from './OverstyrBekreftKnappPanel'; describe('', () => { it('skal rendre submit-knapp når en ikke er i readonly-modus', () => { - renderWithIntl(, { - messages, - }); + render(); expect(screen.getByRole('button', { name: 'Bekreft overstyring' })).toBeInTheDocument(); expect(screen.getByRole('button', { name: 'Bekreft overstyring' })).not.toBeDisabled(); }); it('skal ikke vise submit-knapp når en er i readonly-modus', () => { - renderWithIntl(, { messages }); + render(); expect(screen.queryByRole('button', { name: 'Bekreft overstyring' })).not.toBeInTheDocument(); }); diff --git a/packages/prosess-vilkar-soknadsfrist/src/components/OverstyrBekreftKnappPanel.tsx b/packages/prosess-vilkar-soknadsfrist/src/components/OverstyrBekreftKnappPanel.tsx index 46a9ead264..9abdf3bc09 100644 --- a/packages/prosess-vilkar-soknadsfrist/src/components/OverstyrBekreftKnappPanel.tsx +++ b/packages/prosess-vilkar-soknadsfrist/src/components/OverstyrBekreftKnappPanel.tsx @@ -1,6 +1,5 @@ import { Button } from '@navikt/ds-react'; import React from 'react'; -import { FormattedMessage } from 'react-intl'; interface OwnProps { disabled?: boolean; @@ -15,7 +14,7 @@ const OverstyrBekreftKnappPanel = ({ disabled = false, submitting, pristine, ove } return ( ); }; diff --git a/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarDokument.module.css b/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarDokument.module.css index ea0d1198a9..c3c57d1029 100644 --- a/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarDokument.module.css +++ b/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarDokument.module.css @@ -11,3 +11,10 @@ .fullBreddeIE { width: 100%; } + +.editButton { + :global(.navds-label) { + font-size: 0.875rem; + text-decoration: underline; + } +} diff --git a/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarDokument.tsx b/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarDokument.tsx index f38a003e49..40eb2e664f 100644 --- a/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarDokument.tsx +++ b/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarDokument.tsx @@ -1,6 +1,6 @@ import avslattImage from '@fpsak-frontend/assets/images/avslaatt.svg'; import innvilgetImage from '@fpsak-frontend/assets/images/check.svg'; -import { DatepickerField, RadioGroupField, TextAreaField } from '@fpsak-frontend/form'; +import { RadioGroupPanelRHF } from '@fpsak-frontend/form'; import { FlexColumn, FlexContainer, @@ -9,6 +9,10 @@ import { VerticalSpacer, useSaksbehandlerOppslag, } from '@fpsak-frontend/shared-components'; +import { initializeDate } from '@fpsak-frontend/utils'; +import { DokumentStatus, Vilkarperiode } from '@k9-sak-web/types'; +import { BodyShort, Button } from '@navikt/ds-react'; +import { Datepicker, TextAreaField } from '@navikt/ft-form-hooks'; import { dateAfterOrEqual, dateBeforeOrEqual, @@ -17,28 +21,27 @@ import { maxLength, minLength, required, - requiredIfNotPristine, -} from '@fpsak-frontend/utils'; -import { DokumentStatus } from '@k9-sak-web/types'; -import { BodyShort } from '@navikt/ds-react'; +} from '@navikt/ft-form-validators'; import { AssessedBy } from '@navikt/ft-plattform-komponenter'; -import moment from 'moment'; import React, { useCallback, useMemo } from 'react'; -import { FormattedMessage, useIntl } from 'react-intl'; - +import { useFormContext } from 'react-hook-form'; import { formatDate } from '../utils'; - +import { FormState } from './FormState'; import styles from './SoknadsfristVilkarDokument.module.css'; const minLength3 = minLength(3); const maxLength1500 = maxLength(1500); interface SoknadsfristVilkarDokumentProps { - erVilkarOk?: boolean | string; readOnly: boolean; skalViseBegrunnelse?: boolean; dokument: DokumentStatus; dokumentIndex: number; erAktivtDokument: boolean; + toggleEditForm: React.Dispatch>; + erOverstyrt?: boolean; + redigerVurdering?: boolean; + dokumentErVurdert: boolean; + periode?: Vilkarperiode; } export const DELVIS_OPPFYLT = 'DELVIS_OPPFYLT'; @@ -50,21 +53,27 @@ export const DELVIS_OPPFYLT = 'DELVIS_OPPFYLT'; * Resultatet kan overstyres av Nav-ansatt med overstyr-rettighet. */ export const SoknadsfristVilkarDokument = ({ - erVilkarOk, readOnly, skalViseBegrunnelse = true, dokument, erAktivtDokument, dokumentIndex, + toggleEditForm, + erOverstyrt, + redigerVurdering, + dokumentErVurdert, + periode, }: SoknadsfristVilkarDokumentProps) => { - const intl = useIntl(); + const { getValues } = useFormContext(); + const harBegrunnelse = !!getValues('avklarteKrav')[dokumentIndex]?.begrunnelse; + const erVilkarOk = readOnly && dokumentErVurdert && periode.vilkarStatus.kode === 'OPPFYLT'; const { hentSaksbehandlerNavn } = useSaksbehandlerOppslag(); const opprettetAv = hentSaksbehandlerNavn(dokument?.avklarteOpplysninger?.opprettetAv); const opprettetTidspunkt = dokument?.avklarteOpplysninger?.opprettetTidspunkt; const minDate = useMemo( () => dokument.status.reduce( - (acc, curr) => (!acc || moment(curr.periode.fom) < moment(acc) ? curr.periode.fom : acc), + (acc, curr) => (!acc || initializeDate(curr.periode.fom) < initializeDate(acc) ? curr.periode.fom : acc), '', ), [dokument.journalpostId], @@ -72,7 +81,7 @@ export const SoknadsfristVilkarDokument = ({ const maxDate = useMemo( () => dokument.status.reduce( - (acc, curr) => (!acc || moment(curr.periode.tom) > moment(acc) ? curr.periode.tom : acc), + (acc, curr) => (!acc || initializeDate(curr.periode.tom) > initializeDate(acc) ? curr.periode.tom : acc), '', ), [dokument.innsendingstidspunkt, dokument.journalpostId], @@ -88,16 +97,20 @@ export const SoknadsfristVilkarDokument = ({

{skalViseBegrunnelse && ( <> - - - +
+
+ + + +
+
)} @@ -108,17 +121,10 @@ export const SoknadsfristVilkarDokument = ({ - {erVilkarOk && ( - - {chunks} }} /> - - )} + {erVilkarOk && Vilkåret er oppfylt for hele perioden} {!erVilkarOk && ( - {chunks} }} - /> + Vilkåret er ikke oppfylt for denne perioden )} @@ -127,54 +133,60 @@ export const SoknadsfristVilkarDokument = ({ )} {(!readOnly || erVilkarOk === undefined) && ( - {chunks} }} /> - ), + value: 'true', + label: 'Vilkåret er oppfylt for hele perioden', }, { value: DELVIS_OPPFYLT, - label: ( - {chunks} }} - /> - ), + label: 'Vilkåret er oppfylt for deler av perioden', element: (
-
), }, { - value: false, + value: 'false', label: ( - {chunks} }} - /> + <> + Vilkåret er ikke oppfylt for denne perioden + ), }, ]} /> )} + {!erOverstyrt && dokumentErVurdert && harBegrunnelse && !redigerVurdering && ( +
+ + +
+ )}
); diff --git a/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarForm.spec.tsx b/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarForm.spec.tsx index 4921a7266b..95c9c04948 100644 --- a/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarForm.spec.tsx +++ b/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarForm.spec.tsx @@ -1,13 +1,9 @@ -import React from 'react'; // import behandlingType from '@fpsak-frontend/kodeverk/src/behandlingType'; import vilkarUtfallType from '@fpsak-frontend/kodeverk/src/vilkarUtfallType'; -import { renderWithIntlAndReduxForm } from '@fpsak-frontend/utils-test/test-utils'; -import { reduxFormPropsMock } from '@fpsak-frontend/utils-test/redux-form-test-helper'; import { K9sakApiKeys, requestApi } from '@k9-sak-web/sak-app/src/data/k9sakApi'; import { DokumentStatus } from '@k9-sak-web/types'; import Vilkarperiode from '@k9-sak-web/types/src/vilkarperiode'; -import { screen } from '@testing-library/react'; -import messages from '../../i18n/nb_NO.json'; +import { render, screen } from '@testing-library/react'; import { SoknadsfristVilkarForm } from './SoknadsfristVilkarForm'; const periode = { @@ -51,15 +47,11 @@ const dokumenter = [ describe('', () => { it('skal rendre form med knapp når vilkåret er overstyrt', () => { requestApi.mock(K9sakApiKeys.FEATURE_TOGGLE, []); - renderWithIntlAndReduxForm( + render( undefined} @@ -69,9 +61,7 @@ describe('', () => { dokumenterIAktivPeriode={dokumenter} alleDokumenter={dokumenter} periode={periode} - isSolvable />, - { messages }, ); expect( diff --git a/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarForm.tsx b/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarForm.tsx index e2089e6dfa..58adbc08b9 100644 --- a/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarForm.tsx +++ b/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarForm.tsx @@ -1,60 +1,134 @@ import advarselIkonUrl from '@fpsak-frontend/assets/images/advarsel_ny.svg'; -import { behandlingForm, behandlingFormValueSelector } from '@fpsak-frontend/form'; import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; import aksjonspunktStatus from '@fpsak-frontend/kodeverk/src/aksjonspunktStatus'; import vilkarUtfallType from '@fpsak-frontend/kodeverk/src/vilkarUtfallType'; import { AksjonspunktBox, AksjonspunktHelpText, - EditedIcon, FlexColumn, FlexContainer, FlexRow, Image, VerticalSpacer, } from '@fpsak-frontend/shared-components'; -import { decodeHtmlEntity } from '@fpsak-frontend/utils'; -import { Aksjonspunkt, DokumentStatus, SubmitCallback } from '@k9-sak-web/types'; +import { decodeHtmlEntity, initializeDate } from '@fpsak-frontend/utils'; +import { Aksjonspunkt, DokumentStatus, Periode, SubmitCallback } from '@k9-sak-web/types'; import Vilkarperiode from '@k9-sak-web/types/src/vilkarperiode'; -import { BodyShort, Button, Label } from '@navikt/ds-react'; -import moment from 'moment'; +import { Button, Label } from '@navikt/ds-react'; +import { Form } from '@navikt/ft-form-hooks'; +import { Dayjs } from 'dayjs'; import hash from 'object-hash'; -import React, { SetStateAction } from 'react'; -import { FormattedMessage } from 'react-intl'; -import { connect } from 'react-redux'; -import { InjectedFormProps } from 'redux-form'; -import { createSelector } from 'reselect'; +import { SetStateAction, useState } from 'react'; +import { useForm } from 'react-hook-form'; import { utledInnsendtSoknadsfrist } from '../utils'; +import { FormState } from './FormState'; import OverstyrBekreftKnappPanel from './OverstyrBekreftKnappPanel'; import SoknadsfristVilkarDokument, { DELVIS_OPPFYLT } from './SoknadsfristVilkarDokument'; import styles from './SoknadsfristVilkarForm.module.css'; -const formName = 'SøknadsfristVilkårOverstyringForm'; +/** + * Temporær fiks for saksbehandlere som setter dato og forventer at + * backend skal telle fra og meg datoen de setter. + * + * Backend teller fra dagen etter.. + */ +const minusEnDag = (dato: string | Dayjs) => initializeDate(dato).subtract(1, 'days').format('YYYY-MM-DD'); +const plusEnDag = (dato: string | Dayjs) => initializeDate(dato).add(1, 'days').format('YYYY-MM-DD'); + +const buildInitialValues = ( + aksjonspunkter: Aksjonspunkt[], + alleDokumenter: DokumentStatus[], + status: string, +): FormState => { + const overstyrtAksjonspunkt = aksjonspunkter.find( + ap => ap.definisjon.kode === aksjonspunktCodes.OVERSTYR_SOKNADSFRISTVILKAR, + ); + + return { + isOverstyrt: overstyrtAksjonspunkt !== undefined, + avklarteKrav: alleDokumenter.map(dokument => { + const fraDato = dokument.overstyrteOpplysninger?.fraDato || dokument.avklarteOpplysninger?.fraDato; + const innsendtSoknadsfrist = utledInnsendtSoknadsfrist(dokument.innsendingstidspunkt); + + const erAvklartEllerOverstyrt = !!fraDato; + + const erDelvisOppfylt = + status !== vilkarUtfallType.OPPFYLT && fraDato && plusEnDag(fraDato) !== innsendtSoknadsfrist; + const erVilkarOk = erDelvisOppfylt ? DELVIS_OPPFYLT : status === vilkarUtfallType.OPPFYLT; + return { + erVilkarOk: erAvklartEllerOverstyrt ? erVilkarOk : null, + begrunnelse: decodeHtmlEntity( + dokument.overstyrteOpplysninger?.begrunnelse || dokument.avklarteOpplysninger?.begrunnelse || '', + ), + journalpostId: dokument.journalpostId, + fraDato: fraDato ? plusEnDag(fraDato) : '', + }; + }), + }; +}; + +const transformValues = ( + values: FormState, + alleDokumenter: DokumentStatus[], + apKode: string, + periodeFom: string, + periodeTom: string, +): { + kode: string; + begrunnelse: string; + avklarteKrav: FormState['avklarteKrav']; + erVilkarOk: boolean; + periode?: Periode; +} => ({ + kode: apKode, + begrunnelse: values.avklarteKrav.map(krav => krav.begrunnelse).join('\n'), + avklarteKrav: values.avklarteKrav.map(krav => { + const dokumentStatus = alleDokumenter.find(d => d.journalpostId === krav.journalpostId); + const erVilkarOk = krav.erVilkarOk === 'true' || krav.erVilkarOk === DELVIS_OPPFYLT; + + const fraDato = (() => { + switch (krav.erVilkarOk) { + case 'true': + return dokumentStatus.status.reduce( + (acc, curr) => + !acc || initializeDate(curr.periode.fom).isBefore(initializeDate(acc)) ? curr.periode.fom : acc, + dokumentStatus.status[0].periode.fom, + ); + + case DELVIS_OPPFYLT: + return krav.fraDato; + + default: + return utledInnsendtSoknadsfrist(dokumentStatus.innsendingstidspunkt); + } + })(); + return { + ...krav, + erVilkarOk, + godkjent: erVilkarOk, + // fjern 'minusEnDag' hvis backend oppdateres.. + fraDato: minusEnDag(fraDato), + }; + }), + erVilkarOk: !values.avklarteKrav.some(krav => !krav.erVilkarOk || krav.erVilkarOk === 'false'), + periode: periodeFom && periodeTom ? { fom: periodeFom, tom: periodeTom } : undefined, +}); interface SoknadsfristVilkarFormProps { - /* eslint-disable react/no-unused-prop-types */ aksjonspunkter: Aksjonspunkt[]; behandlingId: number; behandlingVersjon: number; submitCallback: (props: SubmitCallback[]) => void; periode?: Vilkarperiode; erOverstyrt?: boolean; - erVilkarOk?: boolean; - harAksjonspunkt: boolean; harÅpentAksjonspunkt: boolean; - isReadOnly: boolean; overrideReadOnly: boolean; status: string; - invalid: boolean; toggleOverstyring: (overstyrtPanel: SetStateAction) => void; alleDokumenter?: DokumentStatus[]; dokumenterIAktivPeriode?: DokumentStatus[]; } -interface StateProps { - isSolvable: boolean; -} - /** * VilkarresultatForm * @@ -64,100 +138,115 @@ interface StateProps { export const SoknadsfristVilkarForm = ({ erOverstyrt, harÅpentAksjonspunkt, - isReadOnly, - isSolvable, - erVilkarOk, - harAksjonspunkt, overrideReadOnly, toggleOverstyring, - reset, - handleSubmit, - submitting, - pristine, - invalid, alleDokumenter, dokumenterIAktivPeriode, -}: SoknadsfristVilkarFormProps & StateProps & InjectedFormProps) => { + aksjonspunkter, + periode, + status, + submitCallback, +}: SoknadsfristVilkarFormProps) => { + const formMethods = useForm({ defaultValues: buildInitialValues(aksjonspunkter, alleDokumenter, status) }); + const [editForm, setEditForm] = useState(false); + + const toggleEditForm = (shouldEdit: boolean) => { + setEditForm(shouldEdit); + if (!shouldEdit) { + formMethods.reset(buildInitialValues(aksjonspunkter, alleDokumenter, status)); + } + }; + const aksjonspunkt = harÅpentAksjonspunkt + ? aksjonspunkter.find(ap => ap.definisjon.kode === aksjonspunktCodes.KONTROLLER_OPPLYSNINGER_OM_SØKNADSFRIST) + : aksjonspunkter.find(ap => ap.definisjon.kode === aksjonspunktCodes.OVERSTYR_SOKNADSFRISTVILKAR); + + const harAksjonspunkt = aksjonspunkt !== undefined; + const periodeFom = periode?.periode?.fom; + const periodeTom = periode?.periode?.tom; + const aksjonspunktCode = harÅpentAksjonspunkt + ? aksjonspunktCodes.KONTROLLER_OPPLYSNINGER_OM_SØKNADSFRIST + : aksjonspunktCodes.OVERSTYR_SOKNADSFRISTVILKAR; + + const isSolvable = + erOverstyrt || + (harÅpentAksjonspunkt || aksjonspunkt !== undefined + ? !(aksjonspunkt.status.kode === aksjonspunktStatus.OPPRETTET && !aksjonspunkt.kanLoses) + : false); + + const isReadOnly = overrideReadOnly || !periode?.vurderesIBehandlingen; + const toggleAv = () => { - reset(); + formMethods.reset(); toggleOverstyring(oldArray => oldArray.filter(code => code !== aksjonspunktCodes.OVERSTYR_SOKNADSFRISTVILKAR)); }; - if (!erOverstyrt && !harAksjonspunkt && dokumenterIAktivPeriode.length > 0) { - return ( -
- {Array.isArray(alleDokumenter) && - alleDokumenter.length > 0 && - alleDokumenter.map((dokument, index) => { - const documentHash = hash(dokument); - return ( - hash(d) === documentHash) > -1} - skalViseBegrunnelse - readOnly - erVilkarOk={erVilkarOk} - dokumentIndex={index} - dokument={dokument} - /> - ); - })} -
- ); - } + const handleSubmit = (values: FormState) => { + submitCallback([transformValues(values, alleDokumenter, aksjonspunktCode, periodeFom, periodeTom)]); + }; return ( -
- {(erOverstyrt || harAksjonspunkt) && dokumenterIAktivPeriode.length > 0 && ( + + {!erOverstyrt && !harAksjonspunkt && dokumenterIAktivPeriode.length > 0 && !editForm && ( +
+ {Array.isArray(alleDokumenter) && + alleDokumenter.length > 0 && + alleDokumenter.map((field, index) => { + const dokument = alleDokumenter.find(dok => dok.journalpostId === field.journalpostId); + const documentHash = hash(dokument); + return ( + hash(d) === documentHash) > -1} + skalViseBegrunnelse + readOnly + dokumentIndex={index} + dokument={dokument} + toggleEditForm={toggleEditForm} + dokumentErVurdert={status !== vilkarUtfallType.IKKE_VURDERT} + periode={periode} + /> + ); + })} +
+ )} + + {(erOverstyrt || harAksjonspunkt || editForm) && dokumenterIAktivPeriode.length > 0 && ( {!isReadOnly && (harÅpentAksjonspunkt ? ( - - {[]} - + Vurder om søknadsfristvilkåret er oppfylt ) : ( ))} - {Array.isArray(alleDokumenter) && alleDokumenter.length > 0 ? ( - alleDokumenter.map((dokument, index) => { - const documentHash = hash(dokument); - return ( - hash(d) === documentHash) > -1} - skalViseBegrunnelse={erOverstyrt || harAksjonspunkt} - readOnly={isReadOnly || (!erOverstyrt && !harÅpentAksjonspunkt)} - erVilkarOk={erVilkarOk} - dokumentIndex={index} - dokument={dokument} - /> - ); - }) - ) : ( - - )} + {Array.isArray(alleDokumenter) && alleDokumenter.length > 0 + ? alleDokumenter.map((field, index) => { + const dokument = alleDokumenter.find(dok => dok.journalpostId === field.journalpostId); + const documentHash = hash(dokument); + return ( + hash(d) === documentHash) > -1} + skalViseBegrunnelse={erOverstyrt || harAksjonspunkt || editForm} + readOnly={(isReadOnly || (!erOverstyrt && !harÅpentAksjonspunkt)) && !editForm} + dokumentIndex={index} + dokument={dokument} + toggleEditForm={toggleEditForm} + erOverstyrt={erOverstyrt} + redigerVurdering={editForm} + dokumentErVurdert={status !== vilkarUtfallType.IKKE_VURDERT} + periode={periode} + /> + ); + }) + : 'Det finnes ingen dokumenter knyttet til denne behandlingen'} - {!erOverstyrt && erVilkarOk !== undefined && ( - <> - - - - - - - - - - - - - )} + {erOverstyrt && ( @@ -166,7 +255,7 @@ export const SoknadsfristVilkarForm = ({ @@ -174,9 +263,9 @@ export const SoknadsfristVilkarForm = ({ @@ -185,155 +274,46 @@ export const SoknadsfristVilkarForm = ({ size="small" variant="secondary" type="button" - loading={submitting} - disabled={submitting} + loading={formMethods.formState.isSubmitting} + disabled={formMethods.formState.isSubmitting} onClick={toggleAv} > - + Avbryt )} - {harÅpentAksjonspunkt && !erOverstyrt && ( - + {(harÅpentAksjonspunkt || editForm) && !erOverstyrt && ( +
+ + {editForm && ( + + )} +
)}
)} -
+ ); }; -/** - * Temporær fiks for saksbehandlere som setter dato og forventer at - * backend skal telle fra og meg datoen de setter. - * - * Backend teller fra dagen etter.. - */ -const minusEnDag = dato => moment(dato).subtract(1, 'days').format('YYYY-MM-DD'); -const plusEnDag = dato => moment(dato).add(1, 'days').format('YYYY-MM-DD'); - -const buildInitialValues = createSelector( - [ - (ownProps: SoknadsfristVilkarFormProps) => ownProps.aksjonspunkter, - (ownProps: SoknadsfristVilkarFormProps) => ownProps.alleDokumenter, - (ownProps: SoknadsfristVilkarFormProps) => ownProps.status, - ], - (aksjonspunkter, alleDokumenter, status) => { - const overstyrtAksjonspunkt = aksjonspunkter.find( - ap => ap.definisjon.kode === aksjonspunktCodes.OVERSTYR_SOKNADSFRISTVILKAR, - ); - - return { - isOverstyrt: overstyrtAksjonspunkt !== undefined, - avklarteKrav: alleDokumenter.map(dokument => { - const fraDato = dokument.overstyrteOpplysninger?.fraDato || dokument.avklarteOpplysninger?.fraDato; - const innsendtSoknadsfrist = utledInnsendtSoknadsfrist(dokument.innsendingstidspunkt); - - const erAvklartEllerOverstyrt = !!fraDato; - - const erDelvisOppfylt = - status !== vilkarUtfallType.OPPFYLT && fraDato && plusEnDag(fraDato) !== innsendtSoknadsfrist; - const erVilkarOk = erDelvisOppfylt ? DELVIS_OPPFYLT : status === vilkarUtfallType.OPPFYLT; - - return { - erVilkarOk: erAvklartEllerOverstyrt ? erVilkarOk : null, - begrunnelse: decodeHtmlEntity( - dokument.overstyrteOpplysninger?.begrunnelse || dokument.avklarteOpplysninger?.begrunnelse || '', - ), - journalpostId: dokument.journalpostId, - fraDato: fraDato ? plusEnDag(fraDato) : '', - }; - }), - }; - }, -); - -const transformValues = (values, alleDokumenter, apKode, periodeFom, periodeTom) => ({ - kode: apKode, - begrunnelse: values.avklarteKrav.map(krav => krav.begrunnelse).join('\n'), - avklarteKrav: values.avklarteKrav.map(krav => { - const dokumentStatus = alleDokumenter.find(d => d.journalpostId === krav.journalpostId); - const erVilkarOk = krav.erVilkarOk === true || krav.erVilkarOk === DELVIS_OPPFYLT; - - const fraDato = (() => { - switch (krav.erVilkarOk) { - case true: - return dokumentStatus.status.reduce( - (acc, curr) => (!acc || moment(curr.periode.fom).isBefore(moment(acc)) ? curr.periode.fom : acc), - dokumentStatus.status[0].periode.fom, - ); - - case DELVIS_OPPFYLT: - return krav.fraDato; - - default: - return utledInnsendtSoknadsfrist(dokumentStatus.innsendingstidspunkt); - } - })(); - return { - ...krav, - erVilkarOk, - godkjent: erVilkarOk, - // fjern 'minusEnDag' hvis backend oppdateres.. - fraDato: minusEnDag(fraDato), - }; - }), - erVilkarOk: !values.avklarteKrav.some(krav => !krav.erVilkarOk), - periode: periodeFom && periodeTom ? { fom: periodeFom, tom: periodeTom } : undefined, -}); - -const mapStateToPropsFactory = (_initialState, initialOwnProps: SoknadsfristVilkarFormProps) => { - const { submitCallback, alleDokumenter, periode } = initialOwnProps; - const periodeFom = periode?.periode?.fom; - const periodeTom = periode?.periode?.tom; - - return (state, ownProps) => { - const { behandlingId, behandlingVersjon, aksjonspunkter, harÅpentAksjonspunkt, erOverstyrt, overrideReadOnly } = - ownProps; - - const aksjonspunkt = harÅpentAksjonspunkt - ? aksjonspunkter.find(ap => ap.definisjon.kode === aksjonspunktCodes.KONTROLLER_OPPLYSNINGER_OM_SØKNADSFRIST) - : aksjonspunkter.find(ap => ap.definisjon.kode === aksjonspunktCodes.OVERSTYR_SOKNADSFRISTVILKAR); - - const isSolvable = - harÅpentAksjonspunkt || aksjonspunkt !== undefined - ? !(aksjonspunkt.status.kode === aksjonspunktStatus.OPPRETTET && !aksjonspunkt.kanLoses) - : false; - - const aksjonspunktCode = harÅpentAksjonspunkt - ? aksjonspunktCodes.KONTROLLER_OPPLYSNINGER_OM_SØKNADSFRIST - : aksjonspunktCodes.OVERSTYR_SOKNADSFRISTVILKAR; - - const onSubmit = values => - submitCallback([transformValues(values, alleDokumenter, aksjonspunktCode, periodeFom, periodeTom)]); - - const initialValues = buildInitialValues(ownProps); - - return { - onSubmit, - initialValues, - harÅpentAksjonspunkt, - harAksjonspunkt: aksjonspunkt !== undefined, - isSolvable: erOverstyrt || isSolvable, - isReadOnly: overrideReadOnly || !periode?.vurderesIBehandlingen, - ...behandlingFormValueSelector(formName, behandlingId, behandlingVersjon)( - state, - 'isOverstyrt', - 'erVilkarOk', - 'avklarteKrav', - ), - }; - }; -}; - -const form = behandlingForm({ - form: formName, - enableReinitialize: true, - destroyOnUnmount: false, - forceUnregisterOnUnmount: true, -})(SoknadsfristVilkarForm); - -export default connect(mapStateToPropsFactory)(form); +export default SoknadsfristVilkarForm; diff --git a/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarHeader.spec.tsx b/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarHeader.spec.tsx index e7ee20e656..adddac6953 100644 --- a/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarHeader.spec.tsx +++ b/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarHeader.spec.tsx @@ -1,33 +1,22 @@ import { render, screen } from '@testing-library/react'; import React from 'react'; -import { IntlProvider } from 'react-intl'; -import { Provider } from 'react-redux'; -import { combineReducers, createStore } from 'redux'; -import { reducer } from 'redux-form'; -import messages from '../../i18n/nb_NO.json'; import SoknadsfristVilkarHeader from './SoknadsfristVilkarHeader'; describe('', () => { it('skal rendre header', () => { render( - - - undefined} - panelTittelKode="Inngangsvilkar.Soknadsfrist" - erOverstyrt - aksjonspunkter={[]} - /> - - , + undefined} + panelTittelKode="Søknadsfrist" + erOverstyrt + aksjonspunkter={[]} + />, ); expect(screen.getByRole('heading', { name: 'Søknadsfrist' })).toBeInTheDocument(); diff --git a/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarHeader.tsx b/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarHeader.tsx index c5284848aa..34b6d2941a 100644 --- a/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarHeader.tsx +++ b/packages/prosess-vilkar-soknadsfrist/src/components/SoknadsfristVilkarHeader.tsx @@ -7,8 +7,6 @@ import { FlexColumn, FlexContainer, FlexRow, Image, VerticalSpacer } from '@fpsa import { Aksjonspunkt } from '@k9-sak-web/types'; import { Detail, Heading, Label } from '@navikt/ds-react'; import React, { SetStateAction } from 'react'; -import { FormattedMessage } from 'react-intl'; -import { connect } from 'react-redux'; import styles from './SoknadsfristVilkarForm.module.css'; const isOverridden = (aksjonspunktCodes: string[], aksjonspunktCode: string) => @@ -16,34 +14,33 @@ const isOverridden = (aksjonspunktCodes: string[], aksjonspunktCode: string) => const isHidden = (kanOverstyre: boolean, aksjonspunktCodes: string[], aksjonspunktCode: string) => !isOverridden(aksjonspunktCodes, aksjonspunktCode) && !kanOverstyre; -const getVilkarOkMessage = originalErVilkarOk => { - let messageId = 'SoknadsfristVilkarForm.IkkeBehandlet'; +const getVilkarOkMessage = (originalErVilkarOk: boolean) => { + let message = 'Ikke behandlet'; if (originalErVilkarOk) { - messageId = 'SoknadsfristVilkarForm.ErOppfylt'; + message = 'Vilkåret er oppfylt for hele perioden'; } else if (originalErVilkarOk === false) { - messageId = 'SoknadsfristVilkarForm.ErIkkeOppfylt'; + message = 'Vilkåret er avslått'; } return ( ); }; interface SoknadsfristVilkarHeaderProps { - aksjonspunktCodes: string[]; aksjonspunkter: Aksjonspunkt[]; erOverstyrt?: boolean; kanOverstyreAccess?: { isEnabled: boolean; }; lovReferanse?: string; - originalErVilkarOk?: boolean; overrideReadOnly: boolean; overstyringApKode: string; panelTittelKode: string; toggleOverstyring: (overstyrtPanel: SetStateAction) => void; + status: string; } const SoknadsfristVilkarHeader = ({ @@ -51,12 +48,15 @@ const SoknadsfristVilkarHeader = ({ erOverstyrt, overstyringApKode, lovReferanse, - originalErVilkarOk, overrideReadOnly, kanOverstyreAccess, - aksjonspunktCodes, + aksjonspunkter, + status, toggleOverstyring, }: Partial) => { + const aksjonspunktCodes = aksjonspunkter.map(a => a.definisjon.kode); + const erOppfylt = vilkarUtfallType.OPPFYLT === status; + const originalErVilkarOk = vilkarUtfallType.IKKE_VURDERT !== status ? erOppfylt : undefined; const togglePa = () => { toggleOverstyring(oldArray => [...oldArray, overstyringApKode]); }; @@ -71,7 +71,7 @@ const SoknadsfristVilkarHeader = ({ )} - + {panelTittelKode} {lovReferanse && ( @@ -109,18 +109,4 @@ const SoknadsfristVilkarHeader = ({ ); }; -const mapStateToPropsFactory = (_initialState, initialOwnProps: SoknadsfristVilkarHeaderProps) => { - const aksjonspunktCodes = initialOwnProps.aksjonspunkter.map(a => a.definisjon.kode); - - return (state, ownProps) => { - const erOppfylt = vilkarUtfallType.OPPFYLT === ownProps.status; - const erVilkarOk = vilkarUtfallType.IKKE_VURDERT !== ownProps.status ? erOppfylt : undefined; - - return { - aksjonspunktCodes, - originalErVilkarOk: erVilkarOk, - }; - }; -}; - -export default connect(mapStateToPropsFactory)(SoknadsfristVilkarHeader); +export default SoknadsfristVilkarHeader; diff --git a/packages/prosess-vilkar-soknadsfrist/src/utils.ts b/packages/prosess-vilkar-soknadsfrist/src/utils.ts index 63123b5d74..2ffc8fca3c 100644 --- a/packages/prosess-vilkar-soknadsfrist/src/utils.ts +++ b/packages/prosess-vilkar-soknadsfrist/src/utils.ts @@ -1,10 +1,9 @@ -import moment from 'moment'; -import { DDMMYYYY_DATE_FORMAT } from '@fpsak-frontend/utils'; +import { DDMMYYYY_DATE_FORMAT, initializeDate } from '@fpsak-frontend/utils'; -export const formatDate = dato => moment(dato).format(DDMMYYYY_DATE_FORMAT); +export const formatDate = (dato: string) => initializeDate(dato).format(DDMMYYYY_DATE_FORMAT); -export const utledInnsendtSoknadsfrist = (innsendtDato, format = true) => { - const dt = moment(innsendtDato).startOf('month').subtract(3, 'months'); +export const utledInnsendtSoknadsfrist = (innsendtDato: string, format: boolean = true) => { + const dt = initializeDate(innsendtDato).startOf('month').subtract(3, 'months'); if (format) { return dt.format('YYYY-MM-DD'); diff --git a/packages/shared-components/src/EditedIcon.tsx b/packages/shared-components/src/EditedIcon.tsx index d4ae9b9325..c395785632 100644 --- a/packages/shared-components/src/EditedIcon.tsx +++ b/packages/shared-components/src/EditedIcon.tsx @@ -1,7 +1,5 @@ import endretFelt from '@fpsak-frontend/assets/images/endret_felt.svg'; import classnames from 'classnames/bind'; -import React from 'react'; -import { useIntl } from 'react-intl'; import Image from './Image'; import styles from './editedIcon.module.css'; @@ -18,17 +16,14 @@ interface OwnProps { * Komponent/Ikon som viser om noe i GUI er endret. */ -const EditedIcon = ({ className = '' }: OwnProps) => { - const intl = useIntl(); - return ( - - {intl.formatMessage({ - - ); -}; +const EditedIcon = ({ className = '' }: OwnProps) => ( + + Saksbehandler har endret feltets verdi + +); export default EditedIcon; diff --git a/packages/utils/src/date-utils/initialize.ts b/packages/utils/src/date-utils/initialize.ts index 8ebd2cf974..5b8ee81500 100644 --- a/packages/utils/src/date-utils/initialize.ts +++ b/packages/utils/src/date-utils/initialize.ts @@ -1,4 +1,4 @@ -import dayjs from 'dayjs'; +import dayjs, { Dayjs } from 'dayjs'; import customParseFormat from 'dayjs/plugin/customParseFormat'; import utc from 'dayjs/plugin/utc'; @@ -7,8 +7,8 @@ dayjs.extend(utc); const supportedFormats = ['YYYY-MM-DD', 'DD.MM.YYYY']; -export default function initializeDate(dateString: string) { - return dayjs(dateString, supportedFormats).utc(true).startOf('day'); +export default function initializeDate(date: string | Dayjs) { + return dayjs(date, supportedFormats).utc(true).startOf('day'); } export const dateToday = () => dayjs().utc(true).startOf('day'); diff --git a/yarn.lock b/yarn.lock index 3888516e8b..3036302102 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4294,16 +4294,14 @@ __metadata: "@fpsak-frontend/utils-test": 1.0.0 "@k9-sak-web/sak-app": 1.0.0 "@k9-sak-web/types": 1.0.0 + "@navikt/ft-form-hooks": 4.4.19 + "@navikt/ft-form-validators": 2.3.17 "@navikt/ft-plattform-komponenter": 3.0.4 classnames: 2.5.1 - moment: 2.30.1 object-hash: 3.0.0 react: 18.3.1 + react-hook-form: 7.52.2 react-intl: 6.6.8 - react-redux: 9.1.2 - redux: 5.0.1 - redux-form: 8.3.10 - reselect: 5.1.1 languageName: unknown linkType: soft @@ -4712,6 +4710,39 @@ __metadata: languageName: node linkType: hard +"@navikt/ft-form-hooks@npm:4.4.19": + version: 4.4.19 + resolution: "@navikt/ft-form-hooks@npm:4.4.19::__archiveUrl=https%3A%2F%2Fnpm.pkg.github.com%2Fdownload%2F%40navikt%2Fft-form-hooks%2F4.4.19%2Ffde683c315a0fba9912777a9baf612d61e8f0c00" + dependencies: + "@navikt/aksel-icons": 6.13.0 + "@navikt/ds-css": 6.13.0 + "@navikt/ds-react": 6.13.0 + "@navikt/ft-form-validators": ^2.3.17 + "@navikt/ft-types": ^2.4.15 + "@navikt/ft-ui-komponenter": ^2.3.18 + "@navikt/ft-utils": ^2.3.17 + classnames: 2.5.1 + dayjs: 1.11.12 + lodash.throttle: 4.1.1 + react: 18.3.1 + react-hook-form: 7.52.2 + peerDependencies: + "@navikt/aksel-icons": 6.12.0 + "@navikt/ds-css": 6.12.0 + "@navikt/ds-react": 6.12.0 + "@navikt/ft-form-validators": 2.x + "@navikt/ft-types": 2.x + "@navikt/ft-ui-komponenter": 2.x + "@navikt/ft-utils": 2.x + classnames: 2.5.1 + dayjs: 1.11.11 + lodash.throttle: 4.1.1 + react: 18.3.1 + react-hook-form: 7.52.0 + checksum: 33bc1222b07b63d51b5d2ba7ef5f703783c8964ed4b3247e675f363ce2e45f892604fe7ac44d216ecb894379423facd65691f0373cc0d138a6f38bdf13ffe57b + languageName: node + linkType: hard + "@navikt/ft-form-hooks@npm:5.0.0": version: 5.0.0 resolution: "@navikt/ft-form-hooks@npm:5.0.0::__archiveUrl=https%3A%2F%2Fnpm.pkg.github.com%2Fdownload%2F%40navikt%2Fft-form-hooks%2F5.0.0%2F428d791811c515fc80f6513ae47b82fc0937b148" @@ -4778,7 +4809,20 @@ __metadata: languageName: node linkType: hard -"@navikt/ft-form-validators@npm:2.3.18, @navikt/ft-form-validators@npm:^2.3.18": +"@navikt/ft-form-validators@npm:2.3.17": + version: 2.3.17 + resolution: "@navikt/ft-form-validators@npm:2.3.17::__archiveUrl=https%3A%2F%2Fnpm.pkg.github.com%2Fdownload%2F%40navikt%2Fft-form-validators%2F2.3.17%2Fd43ac393afc7f997d9906251394df582c2f1c530" + dependencies: + "@navikt/ft-utils": ^2.3.17 + moment: 2.30.1 + peerDependencies: + "@navikt/ft-utils": 2.x + moment: 2.30.1 + checksum: 797968d814ac3f48a4cb49752f04cd82f287fb7bfc76cd288b55b1de65375e3baa563a9eeb8d2e49514b04ae762130257333f74054c16096122e392a6f1766ef + languageName: node + linkType: hard + +"@navikt/ft-form-validators@npm:2.3.18, @navikt/ft-form-validators@npm:^2.3.17, @navikt/ft-form-validators@npm:^2.3.18": version: 2.3.18 resolution: "@navikt/ft-form-validators@npm:2.3.18::__archiveUrl=https%3A%2F%2Fnpm.pkg.github.com%2Fdownload%2F%40navikt%2Fft-form-validators%2F2.3.18%2F70e95788d7698d2320bd6bfa01eb0f94b3d21047" dependencies: @@ -4916,7 +4960,7 @@ __metadata: languageName: node linkType: hard -"@navikt/ft-ui-komponenter@npm:2.3.19, @navikt/ft-ui-komponenter@npm:^2.3.19": +"@navikt/ft-ui-komponenter@npm:2.3.19, @navikt/ft-ui-komponenter@npm:^2.3.18, @navikt/ft-ui-komponenter@npm:^2.3.19": version: 2.3.19 resolution: "@navikt/ft-ui-komponenter@npm:2.3.19::__archiveUrl=https%3A%2F%2Fnpm.pkg.github.com%2Fdownload%2F%40navikt%2Fft-ui-komponenter%2F2.3.19%2F55c8382de9237b3f6be6e8be1880c0c8de699c38" dependencies: @@ -4941,7 +4985,7 @@ __metadata: languageName: node linkType: hard -"@navikt/ft-utils@npm:^2.3.18": +"@navikt/ft-utils@npm:^2.3.17, @navikt/ft-utils@npm:^2.3.18": version: 2.3.18 resolution: "@navikt/ft-utils@npm:2.3.18::__archiveUrl=https%3A%2F%2Fnpm.pkg.github.com%2Fdownload%2F%40navikt%2Fft-utils%2F2.3.18%2F90582984444a13ab7bfc2b9e066fdddf61df7c32" dependencies: