From 2cb2882822ce07b7493431232d283bd0e90851cb Mon Sep 17 00:00:00 2001 From: ramziabuqassim Date: Wed, 29 May 2024 16:24:14 +0200 Subject: [PATCH 01/10] starter endring av kontrollsamtale for ny/oppdater/annulere --- src/api/kontrollsamtaleApi.ts | 29 +- .../oppsummeringsblokk/Oppsummeringsblokk.tsx | 3 +- .../OppsummeringAvVedtak.tsx | 3 +- .../OppsummeringAvAldersvilk\303\245r.tsx" | 2 +- .../OppsummeringAvBosituasjon.tsx" | 2 +- .../OppsummeringAvFamiliegjenforening.tsx" | 2 +- .../OppsummeringAvFastOpphold.tsx" | 2 +- .../OppsummeringAvFlyktning.tsx" | 2 +- .../OppsummeringAvFormue.tsx" | 2 +- .../OppsummeringAvFradrag.tsx" | 4 +- .../OppsummeringAvInstitusjonsopphold.tsx" | 2 +- .../OppsummeringAvLovligOpphold.tsx" | 2 +- .../OppsummeringAvOpplysningsplikt.tsx" | 2 +- ...OppsummeringAvPersonligOppm\303\270te.tsx" | 2 +- .../OppsummeringAvUf\303\270re.tsx" | 2 +- .../OppsummeringAvUtenlandsopphold.tsx" | 2 +- ...ppsummeringAvS\303\270knadsbehandling.tsx" | 3 +- ...summeringAvRegistrerteUtenlandsopphold.tsx | 3 +- src/components/tabell/SuTabellUtils.ts | 3 +- .../kontrollsamtale/KontrollsamtalePage.tsx | 271 +++++++++++------- .../kontrollsamtale/KontrollsamtaleUtils.ts | 18 ++ .../kontrollsamtalePage.module.less | 19 ++ src/pages/kontrollsamtale/message-nb.ts | 16 -- .../BehandlingssammendragTabell.tsx | 3 +- .../BehandlingssammendragUtils.ts | 2 +- .../regulering/ManuellRegulering.tsx | 4 +- .../RevurderingsperiodeHeader.tsx | 4 +- .../sakintro/Vedtakstabell/Vedtakstabell.tsx | 3 +- src/types/Kontrollsamtale.ts | 2 +- src/utils/date/dateUtils.ts | 8 - src/utils/periode/periodeUtils.ts | 8 + 31 files changed, 257 insertions(+), 173 deletions(-) create mode 100644 src/pages/kontrollsamtale/KontrollsamtaleUtils.ts delete mode 100644 src/pages/kontrollsamtale/message-nb.ts diff --git a/src/api/kontrollsamtaleApi.ts b/src/api/kontrollsamtaleApi.ts index d84cbcd33..820111e56 100644 --- a/src/api/kontrollsamtaleApi.ts +++ b/src/api/kontrollsamtaleApi.ts @@ -1,25 +1,22 @@ import { Kontrollsamtale } from '~src/types/Kontrollsamtale'; -import { toStringDateOrNull } from '~src/utils/date/dateUtils'; import apiClient from './apiClient'; -export const settNyDatoForKontrollsamtale = (args: { sakId: string; nyDato: Date }) => - apiClient({ - url: `/saker/${args.sakId}/kontrollsamtaler/nyDato`, - method: 'POST', - body: { - nyDato: toStringDateOrNull(args.nyDato), - }, - }); - -export const fetchNesteKontrollsamtale = (sakId: string) => - apiClient({ - url: `/saker/${sakId}/kontrollsamtaler/hent`, - method: 'GET', - }); - export const hentKontrollsamtaler = (arg: { sakId: string }) => apiClient({ url: `/saker/${arg.sakId}/kontrollsamtaler`, method: 'GET', }); + +export const opprettNyKontrollsamtale = (arg: { sakId: string; dato: string }) => + apiClient({ + url: `/saker/${arg.sakId}/kontrollsamtaler`, + method: 'POST', + }); + +export const oppdaterKontrollsamtale = (arg: { sakId: string; kontrollsamtaleId: string; dato: string }) => + apiClient({ + url: `/saker/${arg.sakId}/kontrollsamtaler/${arg.kontrollsamtaleId}`, + method: 'POST', + body: { dato: arg.dato }, + }); diff --git a/src/components/oppsummering/oppsummeringAvRevurdering/informasjonsrevurdering/oppsummeringsblokk/Oppsummeringsblokk.tsx b/src/components/oppsummering/oppsummeringAvRevurdering/informasjonsrevurdering/oppsummeringsblokk/Oppsummeringsblokk.tsx index 6169bab53..6dc5fa33b 100644 --- a/src/components/oppsummering/oppsummeringAvRevurdering/informasjonsrevurdering/oppsummeringsblokk/Oppsummeringsblokk.tsx +++ b/src/components/oppsummering/oppsummeringAvRevurdering/informasjonsrevurdering/oppsummeringsblokk/Oppsummeringsblokk.tsx @@ -17,6 +17,7 @@ import { UtbetalingsRevurderingStatus, } from '~src/types/Revurdering'; import * as DateUtils from '~src/utils/date/dateUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import { erRevurderingIverksattMedTilbakekreving } from '~src/utils/revurdering/revurderingUtils'; import Oppsummeringspanel, { @@ -58,7 +59,7 @@ const Intro = (props: { revurdering: InformasjonsRevurdering }) => { }, { tittel: formatMessage('label.periode'), - verdi: DateUtils.formatPeriode(props.revurdering.periode), + verdi: formatPeriode(props.revurdering.periode), }, { tittel: formatMessage('label.årsak'), diff --git a/src/components/oppsummering/oppsummeringAvVedtak/OppsummeringAvVedtak.tsx b/src/components/oppsummering/oppsummeringAvVedtak/OppsummeringAvVedtak.tsx index 747fcf48b..453f144e9 100644 --- a/src/components/oppsummering/oppsummeringAvVedtak/OppsummeringAvVedtak.tsx +++ b/src/components/oppsummering/oppsummeringAvVedtak/OppsummeringAvVedtak.tsx @@ -27,9 +27,10 @@ import { InformasjonsRevurdering, Revurdering, TilbakekrevingsAvgjørelse } from import { Søknadsbehandling } from '~src/types/Søknadsbehandling'; import { Vedtak } from '~src/types/Vedtak'; import { erBehandlingRevurdering, erBehandlingSøknadsbehandling } from '~src/utils/behandling/BehandlingUtils'; -import { formatDate, formatDateTime, formatPeriode } from '~src/utils/date/dateUtils'; +import { formatDate, formatDateTime } from '~src/utils/date/dateUtils'; import { getBlob } from '~src/utils/dokumentUtils'; import { splitStatusOgResultatFraKlage } from '~src/utils/klage/klageUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import { erInformasjonsRevurdering, erRevurderingIverksattMedTilbakekreving, diff --git "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvAldersvilk\303\245r.tsx" "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvAldersvilk\303\245r.tsx" index b9745b574..24f3df2f4 100644 --- "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvAldersvilk\303\245r.tsx" +++ "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvAldersvilk\303\245r.tsx" @@ -1,7 +1,7 @@ import { useI18n } from '~src/lib/i18n'; import { Nullable } from '~src/lib/types'; import { Aldersvilkår, Aldersvurdering } from '~src/types/grunnlagsdataOgVilkårsvurderinger/alder/Aldersvilkår'; -import { formatPeriode } from '~src/utils/date/dateUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import { OppsummeringPar } from '../oppsummeringpar/OppsummeringPar'; diff --git "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvBosituasjon.tsx" "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvBosituasjon.tsx" index 22e52137c..3ad694a66 100644 --- "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvBosituasjon.tsx" +++ "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvBosituasjon.tsx" @@ -1,6 +1,6 @@ import { useI18n } from '~src/lib/i18n'; import { Bosituasjon } from '~src/types/grunnlagsdataOgVilkårsvurderinger/bosituasjon/Bosituasjongrunnlag'; -import { formatPeriode } from '~src/utils/date/dateUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import { OppsummeringPar } from '../oppsummeringpar/OppsummeringPar'; diff --git "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFamiliegjenforening.tsx" "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFamiliegjenforening.tsx" index 541c0dffb..9ebe99485 100644 --- "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFamiliegjenforening.tsx" +++ "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFamiliegjenforening.tsx" @@ -4,7 +4,7 @@ import { Familiegjenforening, FamiliegjenforeningVurdering, } from '~src/types/grunnlagsdataOgVilkårsvurderinger/familieforening/Familieforening'; -import { formatPeriode } from '~src/utils/date/dateUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import { OppsummeringPar } from '../oppsummeringpar/OppsummeringPar'; diff --git "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFastOpphold.tsx" "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFastOpphold.tsx" index 21eda56bf..1f67699fe 100644 --- "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFastOpphold.tsx" +++ "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFastOpphold.tsx" @@ -4,7 +4,7 @@ import { FastOppholdVilkår, VurderingsperiodeFastOpphold, } from '~src/types/grunnlagsdataOgVilkårsvurderinger/fastOpphold/FastOppholdVilkår'; -import { formatPeriode } from '~src/utils/date/dateUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import { OppsummeringPar } from '../oppsummeringpar/OppsummeringPar'; diff --git "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFlyktning.tsx" "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFlyktning.tsx" index 1d3ed3ba0..b59ecf52c 100644 --- "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFlyktning.tsx" +++ "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFlyktning.tsx" @@ -4,7 +4,7 @@ import { FlyktningVilkår, VurderingsperiodeFlyktning, } from '~src/types/grunnlagsdataOgVilkårsvurderinger/flyktning/FlyktningVilkår'; -import { formatPeriode } from '~src/utils/date/dateUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import { OppsummeringPar } from '../oppsummeringpar/OppsummeringPar'; diff --git "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFormue.tsx" "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFormue.tsx" index 7b01bdfaa..791561cc1 100644 --- "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFormue.tsx" +++ "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFormue.tsx" @@ -8,7 +8,7 @@ import { Nullable } from '~src/lib/types'; import { EksternGrunnlagSkatt } from '~src/types/EksterneGrunnlag'; import { Formuegrunnlag } from '~src/types/grunnlagsdataOgVilkårsvurderinger/formue/Formuegrunnlag'; import { FormueStatus, FormueVilkår } from '~src/types/grunnlagsdataOgVilkårsvurderinger/formue/Formuevilkår'; -import { formatPeriode } from '~src/utils/date/dateUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import SeSkattegrunnlag from '../oppsummeringAvSkattegrunnlag/Skattegrunnlagsmodal'; import { OppsummeringPar } from '../oppsummeringpar/OppsummeringPar'; diff --git "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFradrag.tsx" "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFradrag.tsx" index 84ea23e77..b52a75ebd 100644 --- "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFradrag.tsx" +++ "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvFradrag.tsx" @@ -9,8 +9,8 @@ import { eqNullable } from '~src/lib/types'; import { Fradrag, FradragTilhører, UtenlandskInntekt } from '~src/types/Fradrag'; import { eqStringPeriode } from '~src/types/Periode'; import { groupByEq } from '~src/utils/array/arrayUtils'; -import * as DateUtils from '~src/utils/date/dateUtils'; import { formatCurrency } from '~src/utils/format/formatUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import { OppsummeringPar } from '../oppsummeringpar/OppsummeringPar'; @@ -45,7 +45,7 @@ const OppsummeringAvFradrag = (props: { fradrag: Fradrag[] }) => { verdi={pipe( A.head(fradragsgruppe), O.chainNullableK((head) => head.periode), - O.map((periode) => DateUtils.formatPeriode(periode)), + O.map((periode) => formatPeriode(periode)), O.getOrElse(() => formatMessage('feil.ukjent.periode')), )} /> diff --git "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvInstitusjonsopphold.tsx" "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvInstitusjonsopphold.tsx" index 2d0d9c11c..6bed257eb 100644 --- "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvInstitusjonsopphold.tsx" +++ "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvInstitusjonsopphold.tsx" @@ -4,7 +4,7 @@ import { InstitusjonsoppholdVilkår, VurderingsperiodeInstitusjonsopphold, } from '~src/types/grunnlagsdataOgVilkårsvurderinger/institusjonsopphold/Institusjonsopphold'; -import { formatPeriode } from '~src/utils/date/dateUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import { OppsummeringPar } from '../oppsummeringpar/OppsummeringPar'; diff --git "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvLovligOpphold.tsx" "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvLovligOpphold.tsx" index b95992115..773ca5460 100644 --- "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvLovligOpphold.tsx" +++ "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvLovligOpphold.tsx" @@ -4,7 +4,7 @@ import { LovligOppholdVilkår, VurderingsperiodeLovligOpphold, } from '~src/types/grunnlagsdataOgVilkårsvurderinger/lovligOpphold/LovligOppholdVilkår'; -import { formatPeriode } from '~src/utils/date/dateUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import { OppsummeringPar } from '../oppsummeringpar/OppsummeringPar'; diff --git "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvOpplysningsplikt.tsx" "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvOpplysningsplikt.tsx" index a66170f6b..3e5a068c6 100644 --- "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvOpplysningsplikt.tsx" +++ "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvOpplysningsplikt.tsx" @@ -1,7 +1,7 @@ import { useI18n } from '~src/lib/i18n'; import { Nullable } from '~src/lib/types'; import { OpplysningspliktVilkår } from '~src/types/grunnlagsdataOgVilkårsvurderinger/opplysningsplikt/Opplysningsplikt'; -import { formatPeriode } from '~src/utils/date/dateUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import { OppsummeringPar } from '../oppsummeringpar/OppsummeringPar'; diff --git "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvPersonligOppm\303\270te.tsx" "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvPersonligOppm\303\270te.tsx" index 69a808774..e4edab3df 100644 --- "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvPersonligOppm\303\270te.tsx" +++ "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvPersonligOppm\303\270te.tsx" @@ -5,7 +5,7 @@ import { PersonligOppmøteÅrsak, VurderingsperiodePersonligOppmøte, } from '~src/types/grunnlagsdataOgVilkårsvurderinger/personligOppmøte/PersonligOppmøteVilkår'; -import { formatPeriode } from '~src/utils/date/dateUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import { OppsummeringPar } from '../oppsummeringpar/OppsummeringPar'; diff --git "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvUf\303\270re.tsx" "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvUf\303\270re.tsx" index d17f0a4bc..b08fa3420 100644 --- "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvUf\303\270re.tsx" +++ "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvUf\303\270re.tsx" @@ -5,7 +5,7 @@ import { UføreVilkår, VurderingsperiodeUføre, } from '~src/types/grunnlagsdataOgVilkårsvurderinger/uføre/Uførevilkår'; -import { formatPeriode } from '~src/utils/date/dateUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import { OppsummeringPar } from '../oppsummeringpar/OppsummeringPar'; diff --git "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvUtenlandsopphold.tsx" "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvUtenlandsopphold.tsx" index a3d656864..1864e5205 100644 --- "a/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvUtenlandsopphold.tsx" +++ "b/src/components/oppsummering/oppsummeringAvVilk\303\245rOgGrunnlag/OppsummeringAvUtenlandsopphold.tsx" @@ -6,7 +6,7 @@ import { UtenlandsoppholdVilkår, VurderingsperiodeUtenlandsopphold, } from '~src/types/grunnlagsdataOgVilkårsvurderinger/utenlandsopphold/Utenlandsopphold'; -import { formatPeriode } from '~src/utils/date/dateUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import { OppsummeringPar } from '../oppsummeringpar/OppsummeringPar'; diff --git "a/src/components/oppsummering/s\303\270knadsbehandlingoppsummering/OppsummeringAvS\303\270knadsbehandling.tsx" "b/src/components/oppsummering/s\303\270knadsbehandlingoppsummering/OppsummeringAvS\303\270knadsbehandling.tsx" index 067ca6d0c..835ca85c4 100644 --- "a/src/components/oppsummering/s\303\270knadsbehandlingoppsummering/OppsummeringAvS\303\270knadsbehandling.tsx" +++ "b/src/components/oppsummering/s\303\270knadsbehandlingoppsummering/OppsummeringAvS\303\270knadsbehandling.tsx" @@ -6,7 +6,8 @@ import * as PdfApi from '~src/api/pdfApi'; import { useApiCall } from '~src/lib/hooks'; import { useI18n } from '~src/lib/i18n'; import { Søknadsbehandling } from '~src/types/Søknadsbehandling'; -import { formatDate, formatPeriode } from '~src/utils/date/dateUtils'; +import { formatDate } from '~src/utils/date/dateUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import { søknadMottatt } from '~src/utils/søknad/søknadUtils'; import ApiErrorAlert from '../../apiErrorAlert/ApiErrorAlert'; diff --git a/src/components/oppsummering/utenlandsopphold/OppsummeringAvRegistrerteUtenlandsopphold.tsx b/src/components/oppsummering/utenlandsopphold/OppsummeringAvRegistrerteUtenlandsopphold.tsx index 5dc839a56..0f00019ea 100644 --- a/src/components/oppsummering/utenlandsopphold/OppsummeringAvRegistrerteUtenlandsopphold.tsx +++ b/src/components/oppsummering/utenlandsopphold/OppsummeringAvRegistrerteUtenlandsopphold.tsx @@ -20,7 +20,8 @@ import { useAsyncActionCreator } from '~src/lib/hooks'; import { useI18n } from '~src/lib/i18n'; import { Nullable } from '~src/lib/types'; import { RegistrertUtenlandsopphold, UtenlandsoppholdDokumentasjon } from '~src/types/RegistrertUtenlandsopphold'; -import { formatDate, formatDateTime, formatPeriodeMedDager } from '~src/utils/date/dateUtils'; +import { formatDate, formatDateTime } from '~src/utils/date/dateUtils'; +import { formatPeriodeMedDager } from '~src/utils/periode/periodeUtils'; import messages from './OppsummeringAvRegistrerteUtenlandsopphold-nb'; import styles from './OppsummeringAvRegistrerteUtenlandsopphold.module.less'; diff --git a/src/components/tabell/SuTabellUtils.ts b/src/components/tabell/SuTabellUtils.ts index a87fd351b..c0bd91f95 100644 --- a/src/components/tabell/SuTabellUtils.ts +++ b/src/components/tabell/SuTabellUtils.ts @@ -5,8 +5,9 @@ import { Regulering } from '~src/types/Regulering'; import { Revurdering } from '~src/types/Revurdering'; import { Søknad } from '~src/types/Søknad'; import { Søknadsbehandling } from '~src/types/Søknadsbehandling'; -import { formatDate, formatDateTime, formatPeriode } from '~src/utils/date/dateUtils'; +import { formatDate, formatDateTime } from '~src/utils/date/dateUtils'; import { splitStatusOgResultatFraKlage } from '~src/utils/klage/klageUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import { erReguleringAvsluttet } from '~src/utils/ReguleringUtils'; import { erRevurderingAvsluttet, diff --git a/src/pages/kontrollsamtale/KontrollsamtalePage.tsx b/src/pages/kontrollsamtale/KontrollsamtalePage.tsx index 74ee3356e..4439d6b09 100644 --- a/src/pages/kontrollsamtale/KontrollsamtalePage.tsx +++ b/src/pages/kontrollsamtale/KontrollsamtalePage.tsx @@ -1,13 +1,16 @@ import * as RemoteData from '@devexperts/remote-data-ts'; -import { ChevronLeftIcon } from '@navikt/aksel-icons'; -import { BodyLong, BodyShort, Button, Heading, Loader, Skeleton } from '@navikt/ds-react'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { PencilWritingIcon } from '@navikt/aksel-icons'; +import { BodyShort, Button, Heading, Modal, Skeleton } from '@navikt/ds-react'; import { startOfTomorrow } from 'date-fns'; import { useEffect, useState } from 'react'; -import { useNavigate, useOutletContext } from 'react-router-dom'; +import { Controller, useForm } from 'react-hook-form'; +import { useOutletContext } from 'react-router-dom'; import * as kontrollsamtaleApi from '~src/api/kontrollsamtaleApi'; import ApiErrorAlert from '~src/components/apiErrorAlert/ApiErrorAlert'; import { DatePicker } from '~src/components/inputs/datePicker/DatePicker'; +import LinkAsButton from '~src/components/linkAsButton/LinkAsButton'; import Oppsummeringspanel, { Oppsummeringsfarge, Oppsummeringsikon, @@ -15,36 +18,86 @@ import Oppsummeringspanel, { import { SaksoversiktContext } from '~src/context/SaksoversiktContext'; import { pipe } from '~src/lib/fp'; import { useApiCall } from '~src/lib/hooks'; -import { useI18n } from '~src/lib/i18n'; import * as Routes from '~src/lib/routes'; -import { Nullable } from '~src/lib/types'; import { Kontrollsamtale } from '~src/types/Kontrollsamtale'; -import { formatDate, toDateOrNull } from '~src/utils/date/dateUtils'; +import { formatDate, parseNonNullableIsoDateOnly, toIsoDateOnlyString } from '~src/utils/date/dateUtils'; import styles from './kontrollsamtalePage.module.less'; -import messages from './message-nb'; +import { + OppdaterKontrollsamtaleFormData, + OppdaterKontrollsamtaleSchema, + OpprettNyKontrollsamtaleFormData, + opprettNyKontrollsamtaleSchema, +} from './KontrollsamtaleUtils'; const KontrollsamtalePage = () => { - const { formatMessage } = useI18n({ messages }); const props = useOutletContext(); return (
- {formatMessage('kontrollsamtale')} + Kontrollsamtale
- +
); }; +const OpprettNyKontrollsamtale = (props: { sakId: string }) => { + const [status, opprett] = useApiCall(kontrollsamtaleApi.opprettNyKontrollsamtale); + + const form = useForm({ + defaultValues: { + nyKontrollsamtaleDato: null, + }, + resolver: yupResolver(opprettNyKontrollsamtaleSchema), + }); + + const onSubmit = (values: OpprettNyKontrollsamtaleFormData) => { + opprett({ sakId: props.sakId, dato: toIsoDateOnlyString(values.nyKontrollsamtaleDato!) }); + }; + + return ( + +
+ ( + + )} + /> + + {RemoteData.isFailure(status) && } +
+ + Tilbake + + +
+ +
+ ); +}; + const OppsummeringAvKontrollsamtaler = (props: { sakId: string }) => { - const { formatMessage } = useI18n({ messages }); const [kontrollsamtaler, hentKontrollsamtaler] = useApiCall(kontrollsamtaleApi.hentKontrollsamtaler); useEffect(() => { @@ -55,7 +108,7 @@ const OppsummeringAvKontrollsamtaler = (props: { sakId: string }) => { {pipe( kontrollsamtaler, @@ -63,15 +116,18 @@ const OppsummeringAvKontrollsamtaler = (props: { sakId: string }) => { () => null, () => , (err) => , - (kontrollsamtaler) => ( -
    - {kontrollsamtaler.map((k) => ( -
  • - -
  • - ))} -
- ), + (kontrollsamtaler) => + kontrollsamtaler.length === 0 ? ( + Ingen kontrollsamtaler registrert + ) : ( +
    + {kontrollsamtaler.map((k) => ( +
  • + +
  • + ))} +
+ ), ), )}
@@ -80,103 +136,106 @@ const OppsummeringAvKontrollsamtaler = (props: { sakId: string }) => { const BasicKontrollsamtaleOppsummering = (props: { kontrollsamtale: Kontrollsamtale }) => { return ( -
-
- Id - {props.kontrollsamtale.id} -
-
- Status - {props.kontrollsamtale.status} -
-
- Frist - {props.kontrollsamtale.frist} -
-
- Innkallingsdato - {props.kontrollsamtale.innkallingsdato} -
-
- Dokument-id - {props.kontrollsamtale.dokumentId ?? 'Ikke funnet'} -
-
- kontrollnotatets journalpost-id - {props.kontrollsamtale.journalpostIdKontrollnotat ?? 'Ikke funnet'} +
+
+
+ Id + {props.kontrollsamtale.id} +
+
+ Status + {props.kontrollsamtale.status} +
+
+ Frist + {formatDate(props.kontrollsamtale.frist)} +
+
+ Innkallingsdato + {formatDate(props.kontrollsamtale.innkallingsdato)} +
+
+ Dokument-id + {props.kontrollsamtale.dokumentId ?? 'Ikke funnet'} +
+
+ kontrollnotatets journalpost-id + {props.kontrollsamtale.journalpostIdKontrollnotat ?? 'Ikke funnet'} +
+
); }; -const NyKontrollsamtaleDato = (props: { sakId: string }) => { - const navigate = useNavigate(); - const { formatMessage } = useI18n({ messages }); - const [nyDato, settNyDato] = useState>(null); - const [nyDatoStatus, settNyDatoPost] = useApiCall(kontrollsamtaleApi.settNyDatoForKontrollsamtale); - const [nesteKontrollsamtale, fetchNesteKontrollsamtale] = useApiCall(kontrollsamtaleApi.fetchNesteKontrollsamtale); - - const handleNyDatoForKontrollsamtaleClick = (nyDato: Date) => { - settNyDatoPost({ sakId: props.sakId, nyDato: nyDato }, () => - fetchNesteKontrollsamtale(props.sakId, () => { - Routes.navigateToSakIntroWithMessage(navigate, formatMessage('nyDatoBekreftelse'), props.sakId); - }), - ); - }; +const KontrollsamtaleModal = (props: { kontrollsamtale: Kontrollsamtale }) => { + const [visKontrollsamtaleModal, setVisKontrollsamtaleModal] = useState(false); - useEffect(() => { - fetchNesteKontrollsamtale(props.sakId); - }, []); + return ( +
+ setVisKontrollsamtaleModal(false)} + kontrollsamtaleSomSkalEndres={props.kontrollsamtale} + /> + +
+ ); +}; + +const EndreKontrollsamtaleModal = (props: { + visModal: boolean; + onClose: () => void; + kontrollsamtaleSomSkalEndres: Kontrollsamtale; +}) => { + const form = useForm({ + defaultValues: { + nyDato: parseNonNullableIsoDateOnly(props.kontrollsamtaleSomSkalEndres.innkallingsdato), + }, + resolver: yupResolver(OppdaterKontrollsamtaleSchema), + }); return ( - - {pipe( - nesteKontrollsamtale, - RemoteData.fold( - () => <>, - () => <>, - (err) => , - (kontrollsamtale) => ( -
- - {kontrollsamtale?.innkallingsdato - ? formatMessage('nestePlanlagt') + formatDate(kontrollsamtale.innkallingsdato) - : formatMessage('ingenPlanlagt')} - - + +
{ + console.log('TODO', values); + })} + > + ( + )} + /> -
- - -
- {RemoteData.isFailure(nyDatoStatus) && } -
- ), - ), - )} -
+ + + + ); }; diff --git a/src/pages/kontrollsamtale/KontrollsamtaleUtils.ts b/src/pages/kontrollsamtale/KontrollsamtaleUtils.ts new file mode 100644 index 000000000..4cc899c91 --- /dev/null +++ b/src/pages/kontrollsamtale/KontrollsamtaleUtils.ts @@ -0,0 +1,18 @@ +import { Nullable } from '~src/lib/types'; +import yup from '~src/lib/validering'; + +export interface OpprettNyKontrollsamtaleFormData { + nyKontrollsamtaleDato: Nullable; +} + +export const opprettNyKontrollsamtaleSchema = yup.object({ + nyKontrollsamtaleDato: yup.date().required('Dato må være satt'), +}); + +export interface OppdaterKontrollsamtaleFormData { + nyDato: Date; +} + +export const OppdaterKontrollsamtaleSchema = yup.object({ + nyDato: yup.date().required('Dato må være satt'), +}); diff --git a/src/pages/kontrollsamtale/kontrollsamtalePage.module.less b/src/pages/kontrollsamtale/kontrollsamtalePage.module.less index 5f0c8dc42..39e60ddbd 100644 --- a/src/pages/kontrollsamtale/kontrollsamtalePage.module.less +++ b/src/pages/kontrollsamtale/kontrollsamtalePage.module.less @@ -62,3 +62,22 @@ background-color: rgba(0, 0, 0, 0.5); -webkit-box-shadow: 0 0 1px rgba(255, 255, 255, 0.5); } + +//------------------------- +.opprettNyKontrollsamtaleFormContainer { + display: flex; + flex-direction: column; + gap: @spacing-s; + + .buttonsContainer { + display: flex; + gap: @spacing; + align-self: flex-end; + } +} + +.oppsummeringsContainer { + display: flex; + align-items: flex-start; + gap: @spacing-s; +} diff --git a/src/pages/kontrollsamtale/message-nb.ts b/src/pages/kontrollsamtale/message-nb.ts deleted file mode 100644 index 719c7d799..000000000 --- a/src/pages/kontrollsamtale/message-nb.ts +++ /dev/null @@ -1,16 +0,0 @@ -export default { - 'kontrollsamtale.panel.nyDato': 'Ny kontrollsamtale dato', - - 'oppsummeringAvKontrollsamtaler.panel.tittel': 'Registrerte kontrollsamtaler', - - kontrollsamtale: 'Kontrollsamtale', - nestePlanlagt: 'Innkalling til neste planlagte kontrollsamtale: ', - ingenPlanlagt: 'Ingen planlagte kontrollsamtaler', - ingenUtbetalingsperioder: 'Saken har ingen utbetalingsperioder, og kan derfor ikke ha kontrollsamtale', - settNyDato: 'Sett ny dato', - velgDatoTittel: 'Velg dato for innkalling til neste kontrollsamtale', - datovalidering: 'Ingen dato er satt', - kunneIkkeSetteDato: 'Kunne ikke sette ny dato', - nyDatoBekreftelse: 'Dato for innkalling til neste kontrollsamtale er oppdatert', - tilbake: 'Tilbake', -}; diff --git a/src/pages/saksbehandling/behandlingssammendrag/BehandlingssammendragTabell.tsx b/src/pages/saksbehandling/behandlingssammendrag/BehandlingssammendragTabell.tsx index 839a5d93c..2ed488b76 100644 --- a/src/pages/saksbehandling/behandlingssammendrag/BehandlingssammendragTabell.tsx +++ b/src/pages/saksbehandling/behandlingssammendrag/BehandlingssammendragTabell.tsx @@ -14,7 +14,8 @@ import * as Routes from '~src/lib/routes'; import { useAppDispatch } from '~src/redux/Store'; import { Behandlingssammendrag } from '~src/types/Behandlingssammendrag'; import { Sak } from '~src/types/Sak'; -import { formatDateTime, formatPeriode } from '~src/utils/date/dateUtils'; +import { formatDateTime } from '~src/utils/date/dateUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import messages from './Behandlingssammendrag-nb'; import styles from './Behandlingssammendrag.module.less'; diff --git a/src/pages/saksbehandling/behandlingssammendrag/BehandlingssammendragUtils.ts b/src/pages/saksbehandling/behandlingssammendrag/BehandlingssammendragUtils.ts index 16793bc05..65c434c44 100644 --- a/src/pages/saksbehandling/behandlingssammendrag/BehandlingssammendragUtils.ts +++ b/src/pages/saksbehandling/behandlingssammendrag/BehandlingssammendragUtils.ts @@ -5,7 +5,7 @@ import * as S from 'fp-ts/string'; import { AriaSortVerdi } from '~src/components/tabell/SuTabell'; import { pipe } from '~src/lib/fp'; import { Behandlingssammendrag } from '~src/types/Behandlingssammendrag'; -import { formatPeriode } from '~src/utils/date/dateUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; export enum BehandlingssammendragKolonne { saksnummer = 'saksnummer', diff --git a/src/pages/saksbehandling/regulering/ManuellRegulering.tsx b/src/pages/saksbehandling/regulering/ManuellRegulering.tsx index 69d54e48e..7a59c3ad2 100644 --- a/src/pages/saksbehandling/regulering/ManuellRegulering.tsx +++ b/src/pages/saksbehandling/regulering/ManuellRegulering.tsx @@ -41,9 +41,9 @@ import { ÅrsakForManuellType, FantIkkeVedtakForApril, } from '~src/types/Regulering'; -import { formatPeriode, parseIsoDateOnly } from '~src/utils/date/dateUtils'; +import { parseIsoDateOnly } from '~src/utils/date/dateUtils'; import { fjernFradragSomIkkeErVelgbareEkskludertNavYtelserTilLivsopphold } from '~src/utils/fradrag/fradragUtil'; -import { formatPeriodeMedOptionalTilOgMed } from '~src/utils/periode/periodeUtils'; +import { formatPeriode, formatPeriodeMedOptionalTilOgMed } from '~src/utils/periode/periodeUtils'; import messages from './manuellRegulering-nb'; import styles from './manuellRegulering.module.less'; diff --git a/src/pages/saksbehandling/revurdering/revurderingsperiodeheader/RevurderingsperiodeHeader.tsx b/src/pages/saksbehandling/revurdering/revurderingsperiodeheader/RevurderingsperiodeHeader.tsx index e5bdc133d..f2ecc888b 100644 --- a/src/pages/saksbehandling/revurdering/revurderingsperiodeheader/RevurderingsperiodeHeader.tsx +++ b/src/pages/saksbehandling/revurdering/revurderingsperiodeheader/RevurderingsperiodeHeader.tsx @@ -2,7 +2,7 @@ import { BodyShort, Label } from '@navikt/ds-react'; import { useI18n } from '~src/lib/i18n'; import { Periode } from '~src/types/Periode'; -import * as DateUtils from '~src/utils/date/dateUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import messages from './revurderingsperiodeheader-nb'; import styles from './revurderingsperiodeheader.module.less'; @@ -12,7 +12,7 @@ const RevurderingsperiodeHeader = (props: { periode: Periode }) => { return (
{formatMessage('heading')}: - +
); }; diff --git a/src/pages/saksbehandling/sakintro/Vedtakstabell/Vedtakstabell.tsx b/src/pages/saksbehandling/sakintro/Vedtakstabell/Vedtakstabell.tsx index a21ef0d4c..48854dec1 100644 --- a/src/pages/saksbehandling/sakintro/Vedtakstabell/Vedtakstabell.tsx +++ b/src/pages/saksbehandling/sakintro/Vedtakstabell/Vedtakstabell.tsx @@ -24,8 +24,9 @@ import * as Routes from '~src/lib/routes'; import { DokumentIdType } from '~src/types/dokument/Dokument'; import { Klage, KlageStatus } from '~src/types/Klage'; import { Vedtak, VedtakType } from '~src/types/Vedtak'; -import { formatDateTime, formatPeriode } from '~src/utils/date/dateUtils'; +import { formatDateTime } from '~src/utils/date/dateUtils'; import { getBlob } from '~src/utils/dokumentUtils'; +import { formatPeriode } from '~src/utils/periode/periodeUtils'; import { erDokumentGenerertEllerSenere, erDokumentIkkeGenerertEnda, diff --git a/src/types/Kontrollsamtale.ts b/src/types/Kontrollsamtale.ts index 6782eb34d..6cabbc4a9 100644 --- a/src/types/Kontrollsamtale.ts +++ b/src/types/Kontrollsamtale.ts @@ -5,7 +5,7 @@ export interface Kontrollsamtale { opprettet: string; innkallingsdato: string; status: string; - frist: Nullable; + frist: string; dokumentId: Nullable; journalpostIdKontrollnotat: Nullable; } diff --git a/src/utils/date/dateUtils.ts b/src/utils/date/dateUtils.ts index 43f5d42dd..0b8162281 100644 --- a/src/utils/date/dateUtils.ts +++ b/src/utils/date/dateUtils.ts @@ -3,7 +3,6 @@ import { createIntl, createIntlCache, FormatDateOptions } from 'react-intl'; import { Languages } from '~src/lib/i18n'; import { Nullable } from '~src/lib/types'; -import { Periode } from '~src/types/Periode'; const cache = createIntlCache(); const intl = createIntl({ locale: Languages.nb }, cache); @@ -72,13 +71,6 @@ export const toIsoMonth = (date: Date) => { return DateFns.format(date, DateFormats.IsoMonthOnly); }; -// Tipper det ikke blir nødvendig med "overload" for Periode -export const formatPeriode = (periode: Periode) => - `${formatMonthYear(periode.fraOgMed)} – ${formatMonthYear(periode.tilOgMed)}`; - -export const formatPeriodeMedDager = (periode: Periode) => - `${formatDayMonthYear(periode.fraOgMed)} – ${formatDayMonthYear(periode.tilOgMed)}`; - export const toIsoDateOnlyString = (date: Date) => DateFns.format(date, DateFormats.IsoDateOnly); export const startenPåNesteMåned = (date: Date) => DateFns.startOfMonth(DateFns.addMonths(date, 1)); diff --git a/src/utils/periode/periodeUtils.ts b/src/utils/periode/periodeUtils.ts index 10eebd26d..7776c05f1 100644 --- a/src/utils/periode/periodeUtils.ts +++ b/src/utils/periode/periodeUtils.ts @@ -5,6 +5,7 @@ import * as S from 'fp-ts/lib/string'; import { eqNullable } from '~src/lib/types'; import { NullablePeriode, Periode, PeriodeMedOptionalTilOgMed, PeriodeType } from '~src/types/Periode'; import * as DateUtils from '~src/utils/date/dateUtils'; +import { formatDayMonthYear, formatMonthYear } from '~src/utils/date/dateUtils'; export const lagTomPeriode = (): PeriodeType => ({ fraOgMed: null, tilOgMed: null }); @@ -46,3 +47,10 @@ export const formatPeriodeMonthYear = (periode: Periode) => export const formatPeriodeMedOptionalTilOgMed = (periode: PeriodeMedOptionalTilOgMed) => `${DateUtils.formatMonthYear(periode.fraOgMed)} – ${periode.tilOgMed ? DateUtils.formatMonthYear(periode.tilOgMed) : 'Ingen sluttdato'}`; + +// Tipper det ikke blir nødvendig med "overload" for Periode +export const formatPeriode = (periode: Periode) => + `${formatMonthYear(periode.fraOgMed)} – ${formatMonthYear(periode.tilOgMed)}`; + +export const formatPeriodeMedDager = (periode: Periode) => + `${formatDayMonthYear(periode.fraOgMed)} – ${formatDayMonthYear(periode.tilOgMed)}`; From cf6bdb82bfec9afd967f7e18d153ceef8daebf27 Mon Sep 17 00:00:00 2001 From: ramziabuqassim Date: Thu, 30 May 2024 12:42:31 +0200 Subject: [PATCH 02/10] legger til annuller & knytter form til api-kallene. Litt form enhancements --- src/api/dokumentApi.ts | 9 ++ src/api/kontrollsamtaleApi.ts | 16 +- .../kontrollsamtale/KontrollsamtalePage.tsx | 152 ++++++++++++++++-- .../kontrollsamtale/KontrollsamtaleUtils.ts | 44 +++++ .../kontrollsamtalePage.module.less | 15 ++ src/types/Kontrollsamtale.ts | 24 ++- 6 files changed, 241 insertions(+), 19 deletions(-) diff --git a/src/api/dokumentApi.ts b/src/api/dokumentApi.ts index 13ebe26b5..bcd17410d 100644 --- a/src/api/dokumentApi.ts +++ b/src/api/dokumentApi.ts @@ -11,3 +11,12 @@ export async function hentDokumenter(arg: { method: 'GET', }); } + +export const getDokument = (arg: { dokumentId: string }) => { + return apiClient({ + url: `/dokumenter/${arg.dokumentId}`, + method: 'GET', + request: { headers: new Headers({ Accept: 'application/pdf' }) }, + bodyTransformer: (res) => res.blob(), + }); +}; diff --git a/src/api/kontrollsamtaleApi.ts b/src/api/kontrollsamtaleApi.ts index 820111e56..4c48c986e 100644 --- a/src/api/kontrollsamtaleApi.ts +++ b/src/api/kontrollsamtaleApi.ts @@ -1,4 +1,8 @@ -import { Kontrollsamtale } from '~src/types/Kontrollsamtale'; +import { + AnnullerKontrollsamtaleRequest, + Kontrollsamtale, + OppdaterKontrollsamtaleRequest, +} from '~src/types/Kontrollsamtale'; import apiClient from './apiClient'; @@ -9,14 +13,20 @@ export const hentKontrollsamtaler = (arg: { sakId: string }) => }); export const opprettNyKontrollsamtale = (arg: { sakId: string; dato: string }) => - apiClient({ + apiClient({ url: `/saker/${arg.sakId}/kontrollsamtaler`, method: 'POST', }); -export const oppdaterKontrollsamtale = (arg: { sakId: string; kontrollsamtaleId: string; dato: string }) => +export const oppdaterKontrollsamtale = (arg: OppdaterKontrollsamtaleRequest) => apiClient({ url: `/saker/${arg.sakId}/kontrollsamtaler/${arg.kontrollsamtaleId}`, method: 'POST', body: { dato: arg.dato }, }); + +export const annullerKontrollsamtale = (arg: AnnullerKontrollsamtaleRequest) => + apiClient<{ status: 'OK' }>({ + url: `/saker/${arg.sakId}/kontrollsamtaler/${arg.kontrollsamtaleId}`, + method: 'DELETE', + }); diff --git a/src/pages/kontrollsamtale/KontrollsamtalePage.tsx b/src/pages/kontrollsamtale/KontrollsamtalePage.tsx index 4439d6b09..da4ec4e46 100644 --- a/src/pages/kontrollsamtale/KontrollsamtalePage.tsx +++ b/src/pages/kontrollsamtale/KontrollsamtalePage.tsx @@ -1,29 +1,35 @@ import * as RemoteData from '@devexperts/remote-data-ts'; import { yupResolver } from '@hookform/resolvers/yup'; -import { PencilWritingIcon } from '@navikt/aksel-icons'; -import { BodyShort, Button, Heading, Modal, Skeleton } from '@navikt/ds-react'; +import { PencilWritingIcon, ExternalLinkIcon } from '@navikt/aksel-icons'; +import { BodyShort, Button, Heading, Modal, Select, Skeleton, TextField } from '@navikt/ds-react'; import { startOfTomorrow } from 'date-fns'; import { useEffect, useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; -import { useOutletContext } from 'react-router-dom'; +import { useNavigate, useOutletContext } from 'react-router-dom'; +import { getDokument } from '~src/api/dokumentApi'; import * as kontrollsamtaleApi from '~src/api/kontrollsamtaleApi'; -import ApiErrorAlert from '~src/components/apiErrorAlert/ApiErrorAlert'; +import ApiErrorAlert, { useApiErrorMessages } from '~src/components/apiErrorAlert/ApiErrorAlert'; import { DatePicker } from '~src/components/inputs/datePicker/DatePicker'; import LinkAsButton from '~src/components/linkAsButton/LinkAsButton'; import Oppsummeringspanel, { Oppsummeringsfarge, Oppsummeringsikon, } from '~src/components/oppsummering/oppsummeringspanel/Oppsummeringspanel'; +import { createToast, ToastType, useToast } from '~src/components/toast/Toast'; import { SaksoversiktContext } from '~src/context/SaksoversiktContext'; import { pipe } from '~src/lib/fp'; -import { useApiCall } from '~src/lib/hooks'; +import { useApiCall, useBrevForhåndsvisning } from '~src/lib/hooks'; import * as Routes from '~src/lib/routes'; +import { navigateToSakIntroWithMessage } from '~src/lib/routes'; import { Kontrollsamtale } from '~src/types/Kontrollsamtale'; import { formatDate, parseNonNullableIsoDateOnly, toIsoDateOnlyString } from '~src/utils/date/dateUtils'; import styles from './kontrollsamtalePage.module.less'; import { + KontrollsamtaleFormStatus, + kontrollsamtaleStatusTextMapper, + kontrollsamtalestatusToFormStatus, OppdaterKontrollsamtaleFormData, OppdaterKontrollsamtaleSchema, OpprettNyKontrollsamtaleFormData, @@ -49,6 +55,7 @@ const KontrollsamtalePage = () => { }; const OpprettNyKontrollsamtale = (props: { sakId: string }) => { + const navigate = useNavigate(); const [status, opprett] = useApiCall(kontrollsamtaleApi.opprettNyKontrollsamtale); const form = useForm({ @@ -59,7 +66,9 @@ const OpprettNyKontrollsamtale = (props: { sakId: string }) => { }); const onSubmit = (values: OpprettNyKontrollsamtaleFormData) => { - opprett({ sakId: props.sakId, dato: toIsoDateOnlyString(values.nyKontrollsamtaleDato!) }); + opprett({ sakId: props.sakId, dato: toIsoDateOnlyString(values.nyKontrollsamtaleDato!) }, () => { + navigateToSakIntroWithMessage(navigate, 'Ny kontrollsamtale har blitt opprettet', props.sakId); + }); }; return ( @@ -77,7 +86,8 @@ const OpprettNyKontrollsamtale = (props: { sakId: string }) => { label={'Velg dato for ny kontrollsamtale'} fromDate={startOfTomorrow()} error={fieldState.error?.message} - {...field} + onChange={field.onChange} + value={field.value} /> )} /> @@ -123,7 +133,7 @@ const OppsummeringAvKontrollsamtaler = (props: { sakId: string }) => {
    {kontrollsamtaler.map((k) => (
  • - +
  • ))}
@@ -134,7 +144,23 @@ const OppsummeringAvKontrollsamtaler = (props: { sakId: string }) => { ); }; -const BasicKontrollsamtaleOppsummering = (props: { kontrollsamtale: Kontrollsamtale }) => { +const BasicKontrollsamtaleOppsummering = (props: { sakId: string; kontrollsamtale: Kontrollsamtale }) => { + const { insert } = useToast(); + const apiErrorMessages = useApiErrorMessages(); + const [dokumentStatus, hentDokument] = useBrevForhåndsvisning(getDokument); + + useEffect(() => { + if (RemoteData.isFailure(dokumentStatus)) { + insert( + createToast({ + type: ToastType.ERROR, + duration: 5000, + message: apiErrorMessages(dokumentStatus.error), + }), + ); + } + }, [dokumentStatus]); + return (
@@ -144,7 +170,7 @@ const BasicKontrollsamtaleOppsummering = (props: { kontrollsamtale: Kontrollsamt
Status - {props.kontrollsamtale.status} + {kontrollsamtaleStatusTextMapper(props.kontrollsamtale.status)}
Frist @@ -156,19 +182,33 @@ const BasicKontrollsamtaleOppsummering = (props: { kontrollsamtale: Kontrollsamt
Dokument-id - {props.kontrollsamtale.dokumentId ?? 'Ikke funnet'} + + + {props.kontrollsamtale.dokumentId ? ( + + ) : ( + 'Ikke funnet' + )} +
kontrollnotatets journalpost-id {props.kontrollsamtale.journalpostIdKontrollnotat ?? 'Ikke funnet'}
- +
); }; -const KontrollsamtaleModal = (props: { kontrollsamtale: Kontrollsamtale }) => { +const KontrollsamtaleModal = (props: { sakId: string; kontrollsamtale: Kontrollsamtale }) => { const [visKontrollsamtaleModal, setVisKontrollsamtaleModal] = useState(false); return ( @@ -176,6 +216,7 @@ const KontrollsamtaleModal = (props: { kontrollsamtale: Kontrollsamtale }) => { setVisKontrollsamtaleModal(false)} + sakId={props.sakId} kontrollsamtaleSomSkalEndres={props.kontrollsamtale} /> + {RemoteData.isFailure(oppdaterStatus) && } + {RemoteData.isFailure(annullerStatus) && } +
+ + +
diff --git a/src/pages/kontrollsamtale/KontrollsamtaleUtils.ts b/src/pages/kontrollsamtale/KontrollsamtaleUtils.ts index 4cc899c91..8978ab98e 100644 --- a/src/pages/kontrollsamtale/KontrollsamtaleUtils.ts +++ b/src/pages/kontrollsamtale/KontrollsamtaleUtils.ts @@ -1,5 +1,6 @@ import { Nullable } from '~src/lib/types'; import yup from '~src/lib/validering'; +import { KontrollsamtaleStatus } from '~src/types/Kontrollsamtale'; export interface OpprettNyKontrollsamtaleFormData { nyKontrollsamtaleDato: Nullable; @@ -9,10 +10,53 @@ export const opprettNyKontrollsamtaleSchema = yup.object; } export const OppdaterKontrollsamtaleSchema = yup.object({ nyDato: yup.date().required('Dato må være satt'), + journalpostId: yup.string(), + status: yup.string().oneOf(Object.values(KontrollsamtaleFormStatus)).required('Status må være satt'), }); + +export const kontrollsamtaleStatusTextMapper = (status: KontrollsamtaleStatus | KontrollsamtaleFormStatus) => { + switch (status) { + case KontrollsamtaleStatus.PLANLAGT_INNKALLING: + return 'Planlagt innkalling'; + case KontrollsamtaleStatus.INNKALT: + return 'Innkalt'; + case KontrollsamtaleStatus.GJENNOMFØRT: + case KontrollsamtaleFormStatus.GJENNOMFØRT: + return 'Gjennomført'; + case KontrollsamtaleStatus.ANNULLERT: + return 'Annullert'; + case KontrollsamtaleStatus.IKKE_MØTT_INNEN_FRIST: + case KontrollsamtaleFormStatus.IKKE_MØTT_INNEN_FRIST: + return 'Ikke møtt innen frist'; + } +}; + +export const kontrollsamtalestatusToFormStatus = ( + status: KontrollsamtaleStatus, +): Nullable => { + switch (status) { + case KontrollsamtaleStatus.PLANLAGT_INNKALLING: + return null; + case KontrollsamtaleStatus.INNKALT: + return null; + case KontrollsamtaleStatus.GJENNOMFØRT: + return KontrollsamtaleFormStatus.GJENNOMFØRT; + case KontrollsamtaleStatus.ANNULLERT: + return null; + case KontrollsamtaleStatus.IKKE_MØTT_INNEN_FRIST: + return KontrollsamtaleFormStatus.IKKE_MØTT_INNEN_FRIST; + } +}; diff --git a/src/pages/kontrollsamtale/kontrollsamtalePage.module.less b/src/pages/kontrollsamtale/kontrollsamtalePage.module.less index 39e60ddbd..f50954b19 100644 --- a/src/pages/kontrollsamtale/kontrollsamtalePage.module.less +++ b/src/pages/kontrollsamtale/kontrollsamtalePage.module.less @@ -52,6 +52,10 @@ grid-template-columns: repeat(2, 1fr); } +.dokumentButton { + padding: 0; +} + ::-webkit-scrollbar { -webkit-appearance: none; width: 7px; @@ -81,3 +85,14 @@ align-items: flex-start; gap: @spacing-s; } + +.modalForm { + display: flex; + flex-direction: column; + gap: @spacing-s; + + .buttonsContainer { + display: flex; + gap: @spacing-s; + } +} diff --git a/src/types/Kontrollsamtale.ts b/src/types/Kontrollsamtale.ts index 6cabbc4a9..213c35dc6 100644 --- a/src/types/Kontrollsamtale.ts +++ b/src/types/Kontrollsamtale.ts @@ -1,11 +1,33 @@ import { Nullable } from '~src/lib/types'; +import { KontrollsamtaleFormStatus } from '~src/pages/kontrollsamtale/KontrollsamtaleUtils'; export interface Kontrollsamtale { id: string; opprettet: string; innkallingsdato: string; - status: string; + status: KontrollsamtaleStatus; frist: string; dokumentId: Nullable; journalpostIdKontrollnotat: Nullable; } + +export enum KontrollsamtaleStatus { + PLANLAGT_INNKALLING = 'PLANLAGT_INNKALLING', + INNKALT = 'INNKALT', + GJENNOMFØRT = 'GJENNOMFØRT', + ANNULLERT = 'ANNULLERT', + IKKE_MØTT_INNEN_FRIST = 'IKKE_MØTT_INNEN_FRIST', +} + +export interface OppdaterKontrollsamtaleRequest { + sakId: string; + kontrollsamtaleId: string; + dato: string; + journalpostId: Nullable; + status: KontrollsamtaleFormStatus; +} + +export interface AnnullerKontrollsamtaleRequest { + sakId: string; + kontrollsamtaleId: string; +} From d7e6a578b206d834e8cff740144c06e237b29d54 Mon Sep 17 00:00:00 2001 From: ramziabuqassim Date: Fri, 31 May 2024 12:41:29 +0200 Subject: [PATCH 03/10] split oppdater mellom status/journalpost & innkallingsdato --- src/api/kontrollsamtaleApi.ts | 23 +- .../HentOgVisKontrollsamtaler.module.less | 10 + .../HentOgVisKontrollsamtaler.tsx | 58 +++ .../kontrollsamtale/KontrollsamtalePage.tsx | 281 +---------- .../kontrollsamtale/KontrollsamtaleUtils.ts | 19 +- .../OppsummeringAvKontrollsamtale.module.less | 67 +++ .../OppsummeringAvKontrollsamtale.tsx | 449 ++++++++++++++++++ .../OppsummeringAvKontrollsamtaleUtils.ts | 26 + .../kontrollsamtalePage.module.less | 46 -- src/types/Kontrollsamtale.ts | 15 +- 10 files changed, 648 insertions(+), 346 deletions(-) create mode 100644 src/pages/kontrollsamtale/HentOgVisKontrollsamtaler.module.less create mode 100644 src/pages/kontrollsamtale/HentOgVisKontrollsamtaler.tsx create mode 100644 src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.module.less create mode 100644 src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.tsx create mode 100644 src/pages/kontrollsamtale/OppsummeringAvKontrollsamtaleUtils.ts diff --git a/src/api/kontrollsamtaleApi.ts b/src/api/kontrollsamtaleApi.ts index 4c48c986e..66f1d2d9c 100644 --- a/src/api/kontrollsamtaleApi.ts +++ b/src/api/kontrollsamtaleApi.ts @@ -1,7 +1,8 @@ import { AnnullerKontrollsamtaleRequest, Kontrollsamtale, - OppdaterKontrollsamtaleRequest, + OppdaterKontrollsamtaleInnkallingsdatoRequest, + OppdaterKontrollsamtaleStatusOgJournalpostRequest, } from '~src/types/Kontrollsamtale'; import apiClient from './apiClient'; @@ -18,11 +19,23 @@ export const opprettNyKontrollsamtale = (arg: { sakId: string; dato: string }) = method: 'POST', }); -export const oppdaterKontrollsamtale = (arg: OppdaterKontrollsamtaleRequest) => - apiClient({ - url: `/saker/${arg.sakId}/kontrollsamtaler/${arg.kontrollsamtaleId}`, +export const oppdaterKontrollsamtaleStatusOgJournalpost = (arg: OppdaterKontrollsamtaleStatusOgJournalpostRequest) => + apiClient({ + url: `/saker/${arg.sakId}/kontrollsamtaler`, + method: 'POST', + body: { + status: arg.status, + journalpostId: arg.journalpostId, + }, + }); + +export const oppdaterKontrollsamtaleInnkallingsdato = (arg: OppdaterKontrollsamtaleInnkallingsdatoRequest) => + apiClient({ + url: `/saker/${arg.sakId}/kontrollsamtaler`, method: 'POST', - body: { dato: arg.dato }, + body: { + innkallingsdato: arg.innkallingsmåned, + }, }); export const annullerKontrollsamtale = (arg: AnnullerKontrollsamtaleRequest) => diff --git a/src/pages/kontrollsamtale/HentOgVisKontrollsamtaler.module.less b/src/pages/kontrollsamtale/HentOgVisKontrollsamtaler.module.less new file mode 100644 index 000000000..161a1cc90 --- /dev/null +++ b/src/pages/kontrollsamtale/HentOgVisKontrollsamtaler.module.less @@ -0,0 +1,10 @@ +@import '@styles/variables.less'; + +.kontrollsamtalerContainer { + display: flex; + flex-direction: column; + gap: @spacing-s; + max-height: 500px; + padding-right: 2rem; + overflow: auto; +} diff --git a/src/pages/kontrollsamtale/HentOgVisKontrollsamtaler.tsx b/src/pages/kontrollsamtale/HentOgVisKontrollsamtaler.tsx new file mode 100644 index 000000000..cb20464bf --- /dev/null +++ b/src/pages/kontrollsamtale/HentOgVisKontrollsamtaler.tsx @@ -0,0 +1,58 @@ +import * as RemoteData from '@devexperts/remote-data-ts'; +import { BodyShort, Skeleton } from '@navikt/ds-react'; +import { useEffect } from 'react'; + +import * as kontrollsamtaleApi from '~src/api/kontrollsamtaleApi'; +import ApiErrorAlert from '~src/components/apiErrorAlert/ApiErrorAlert'; +import Oppsummeringspanel, { + Oppsummeringsfarge, + Oppsummeringsikon, +} from '~src/components/oppsummering/oppsummeringspanel/Oppsummeringspanel'; +import { pipe } from '~src/lib/fp'; +import { useApiCall } from '~src/lib/hooks'; + +import styles from './HentOgVisKontrollsamtaler.module.less'; +import OppsummeringAvKontrollsamtale from './OppsummeringAvKontrollsamtale'; + +const HentOgVisKontrollsamtaler = (props: { sakId: string }) => { + const [kontrollsamtaler, hentKontrollsamtaler] = useApiCall(kontrollsamtaleApi.hentKontrollsamtaler); + + useEffect(() => { + hentKontrollsamtaler({ sakId: props.sakId }); + }, []); + + return ( + + {pipe( + kontrollsamtaler, + RemoteData.fold( + () => null, + () => , + (err) => , + (kontrollsamtaler) => + kontrollsamtaler.length === 0 ? ( + Ingen kontrollsamtaler registrert + ) : ( +
    + {kontrollsamtaler.map((k) => ( +
  • + +
  • + ))} +
+ ), + ), + )} +
+ ); +}; + +export default HentOgVisKontrollsamtaler; diff --git a/src/pages/kontrollsamtale/KontrollsamtalePage.tsx b/src/pages/kontrollsamtale/KontrollsamtalePage.tsx index da4ec4e46..2230e76f3 100644 --- a/src/pages/kontrollsamtale/KontrollsamtalePage.tsx +++ b/src/pages/kontrollsamtale/KontrollsamtalePage.tsx @@ -1,40 +1,27 @@ import * as RemoteData from '@devexperts/remote-data-ts'; import { yupResolver } from '@hookform/resolvers/yup'; -import { PencilWritingIcon, ExternalLinkIcon } from '@navikt/aksel-icons'; -import { BodyShort, Button, Heading, Modal, Select, Skeleton, TextField } from '@navikt/ds-react'; +import { Button, Heading } from '@navikt/ds-react'; import { startOfTomorrow } from 'date-fns'; -import { useEffect, useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { useNavigate, useOutletContext } from 'react-router-dom'; -import { getDokument } from '~src/api/dokumentApi'; import * as kontrollsamtaleApi from '~src/api/kontrollsamtaleApi'; -import ApiErrorAlert, { useApiErrorMessages } from '~src/components/apiErrorAlert/ApiErrorAlert'; +import ApiErrorAlert from '~src/components/apiErrorAlert/ApiErrorAlert'; import { DatePicker } from '~src/components/inputs/datePicker/DatePicker'; import LinkAsButton from '~src/components/linkAsButton/LinkAsButton'; import Oppsummeringspanel, { Oppsummeringsfarge, Oppsummeringsikon, } from '~src/components/oppsummering/oppsummeringspanel/Oppsummeringspanel'; -import { createToast, ToastType, useToast } from '~src/components/toast/Toast'; import { SaksoversiktContext } from '~src/context/SaksoversiktContext'; -import { pipe } from '~src/lib/fp'; -import { useApiCall, useBrevForhåndsvisning } from '~src/lib/hooks'; +import { useApiCall } from '~src/lib/hooks'; import * as Routes from '~src/lib/routes'; import { navigateToSakIntroWithMessage } from '~src/lib/routes'; -import { Kontrollsamtale } from '~src/types/Kontrollsamtale'; -import { formatDate, parseNonNullableIsoDateOnly, toIsoDateOnlyString } from '~src/utils/date/dateUtils'; +import { toIsoDateOnlyString } from '~src/utils/date/dateUtils'; +import HentOgVisKontrollsamtaler from './HentOgVisKontrollsamtaler'; import styles from './kontrollsamtalePage.module.less'; -import { - KontrollsamtaleFormStatus, - kontrollsamtaleStatusTextMapper, - kontrollsamtalestatusToFormStatus, - OppdaterKontrollsamtaleFormData, - OppdaterKontrollsamtaleSchema, - OpprettNyKontrollsamtaleFormData, - opprettNyKontrollsamtaleSchema, -} from './KontrollsamtaleUtils'; +import { OpprettNyKontrollsamtaleFormData, opprettNyKontrollsamtaleSchema } from './KontrollsamtaleUtils'; const KontrollsamtalePage = () => { const props = useOutletContext(); @@ -48,7 +35,7 @@ const KontrollsamtalePage = () => {
- +
); @@ -107,258 +94,4 @@ const OpprettNyKontrollsamtale = (props: { sakId: string }) => { ); }; -const OppsummeringAvKontrollsamtaler = (props: { sakId: string }) => { - const [kontrollsamtaler, hentKontrollsamtaler] = useApiCall(kontrollsamtaleApi.hentKontrollsamtaler); - - useEffect(() => { - hentKontrollsamtaler({ sakId: props.sakId }); - }, []); - - return ( - - {pipe( - kontrollsamtaler, - RemoteData.fold( - () => null, - () => , - (err) => , - (kontrollsamtaler) => - kontrollsamtaler.length === 0 ? ( - Ingen kontrollsamtaler registrert - ) : ( -
    - {kontrollsamtaler.map((k) => ( -
  • - -
  • - ))} -
- ), - ), - )} -
- ); -}; - -const BasicKontrollsamtaleOppsummering = (props: { sakId: string; kontrollsamtale: Kontrollsamtale }) => { - const { insert } = useToast(); - const apiErrorMessages = useApiErrorMessages(); - const [dokumentStatus, hentDokument] = useBrevForhåndsvisning(getDokument); - - useEffect(() => { - if (RemoteData.isFailure(dokumentStatus)) { - insert( - createToast({ - type: ToastType.ERROR, - duration: 5000, - message: apiErrorMessages(dokumentStatus.error), - }), - ); - } - }, [dokumentStatus]); - - return ( -
-
-
- Id - {props.kontrollsamtale.id} -
-
- Status - {kontrollsamtaleStatusTextMapper(props.kontrollsamtale.status)} -
-
- Frist - {formatDate(props.kontrollsamtale.frist)} -
-
- Innkallingsdato - {formatDate(props.kontrollsamtale.innkallingsdato)} -
-
- Dokument-id - - - {props.kontrollsamtale.dokumentId ? ( - - ) : ( - 'Ikke funnet' - )} - -
-
- kontrollnotatets journalpost-id - {props.kontrollsamtale.journalpostIdKontrollnotat ?? 'Ikke funnet'} -
-
- -
- ); -}; - -const KontrollsamtaleModal = (props: { sakId: string; kontrollsamtale: Kontrollsamtale }) => { - const [visKontrollsamtaleModal, setVisKontrollsamtaleModal] = useState(false); - - return ( -
- setVisKontrollsamtaleModal(false)} - sakId={props.sakId} - kontrollsamtaleSomSkalEndres={props.kontrollsamtale} - /> - -
- ); -}; - -const EndreKontrollsamtaleModal = (props: { - visModal: boolean; - onClose: () => void; - sakId: string; - kontrollsamtaleSomSkalEndres: Kontrollsamtale; -}) => { - const navigate = useNavigate(); - const [annullerStatus, annuller] = useApiCall(kontrollsamtaleApi.annullerKontrollsamtale); - const [oppdaterStatus, oppdater] = useApiCall(kontrollsamtaleApi.oppdaterKontrollsamtale); - - const form = useForm({ - defaultValues: { - nyDato: parseNonNullableIsoDateOnly(props.kontrollsamtaleSomSkalEndres.innkallingsdato), - journalpostId: props.kontrollsamtaleSomSkalEndres.journalpostIdKontrollnotat ?? '', - status: kontrollsamtalestatusToFormStatus(props.kontrollsamtaleSomSkalEndres.status), - }, - resolver: yupResolver(OppdaterKontrollsamtaleSchema), - }); - - return ( - - -
{ - oppdater( - { - sakId: props.sakId, - kontrollsamtaleId: props.kontrollsamtaleSomSkalEndres.id, - dato: toIsoDateOnlyString(values.nyDato), - journalpostId: values.journalpostId, - status: values.status!, - }, - () => { - navigateToSakIntroWithMessage( - navigate, - 'Kontrollsamtale har blitt oppdatert', - props.sakId, - ); - }, - ); - })} - > - ( - - )} - /> - - ( - - )} - /> - - ( - - )} - /> - - {RemoteData.isFailure(oppdaterStatus) && } - {RemoteData.isFailure(annullerStatus) && } -
- - -
- -
-
- ); -}; - export default KontrollsamtalePage; diff --git a/src/pages/kontrollsamtale/KontrollsamtaleUtils.ts b/src/pages/kontrollsamtale/KontrollsamtaleUtils.ts index 8978ab98e..6b1100ef9 100644 --- a/src/pages/kontrollsamtale/KontrollsamtaleUtils.ts +++ b/src/pages/kontrollsamtale/KontrollsamtaleUtils.ts @@ -2,6 +2,8 @@ import { Nullable } from '~src/lib/types'; import yup from '~src/lib/validering'; import { KontrollsamtaleStatus } from '~src/types/Kontrollsamtale'; +import { KontrollsamtaleFormStatus } from './OppsummeringAvKontrollsamtaleUtils'; + export interface OpprettNyKontrollsamtaleFormData { nyKontrollsamtaleDato: Nullable; } @@ -10,23 +12,6 @@ export const opprettNyKontrollsamtaleSchema = yup.object; -} - -export const OppdaterKontrollsamtaleSchema = yup.object({ - nyDato: yup.date().required('Dato må være satt'), - journalpostId: yup.string(), - status: yup.string().oneOf(Object.values(KontrollsamtaleFormStatus)).required('Status må være satt'), -}); - export const kontrollsamtaleStatusTextMapper = (status: KontrollsamtaleStatus | KontrollsamtaleFormStatus) => { switch (status) { case KontrollsamtaleStatus.PLANLAGT_INNKALLING: diff --git a/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.module.less b/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.module.less new file mode 100644 index 000000000..4991a60ec --- /dev/null +++ b/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.module.less @@ -0,0 +1,67 @@ +@import '@styles/variables.less'; + +.oppsummeringsContainer { + display: flex; + align-items: flex-start; + gap: @spacing-s; +} + +.kontrollsamtaleDetalje { + display: grid; + grid-template-columns: repeat(2, 1fr); +} + +.buttonMedIKon { + padding: 0; + display: flex; + justify-self: flex-start; + + span { + display: flex; + align-items: center; + } +} + +::-webkit-scrollbar { + -webkit-appearance: none; + width: 7px; +} + +::-webkit-scrollbar-thumb { + border-radius: 4px; + background-color: rgba(0, 0, 0, 0.5); + -webkit-box-shadow: 0 0 1px rgba(255, 255, 255, 0.5); +} + +.annullerKontrollsamtaleIkon { + display: flex; + align-items: flex-end; +} + +.modal { + //setter lengen slik at en helpText ikke trigger scrolling på modalen + width: 615px; +} + +.modalBody { + display: flex; + flex-direction: column; + gap: @spacing-s; + + .modalForm { + display: flex; + flex-direction: column; + gap: @spacing-s; + align-items: flex-start; + + .journalpostInputLabel { + display: flex; + gap: @spacing-xxs; + } + + .buttonsContainer { + display: flex; + gap: @spacing-s; + } + } +} diff --git a/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.tsx b/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.tsx new file mode 100644 index 000000000..ad099ad6b --- /dev/null +++ b/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.tsx @@ -0,0 +1,449 @@ +import * as RemoteData from '@devexperts/remote-data-ts'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { ExternalLinkIcon, PencilWritingIcon, XMarkOctagonIcon } from '@navikt/aksel-icons'; +import { BodyShort, Button, HelpText, Modal, Select, TextField } from '@navikt/ds-react'; +import { useEffect, useState } from 'react'; +import { Controller, useForm } from 'react-hook-form'; +import { useNavigate } from 'react-router-dom'; + +import { getDokument } from '~src/api/dokumentApi'; +import * as kontrollsamtaleApi from '~src/api/kontrollsamtaleApi'; +import ApiErrorAlert, { useApiErrorMessages } from '~src/components/apiErrorAlert/ApiErrorAlert'; +import { MonthPicker } from '~src/components/inputs/datePicker/DatePicker'; +import { ToastType, createToast, useToast } from '~src/components/toast/Toast'; +import { useApiCall, useBrevForhåndsvisning } from '~src/lib/hooks'; +import { navigateToSakIntroWithMessage } from '~src/lib/routes'; +import { Kontrollsamtale } from '~src/types/Kontrollsamtale'; +import { formatDate, parseNonNullableIsoDateOnly, toIsoMonth } from '~src/utils/date/dateUtils'; + +import { kontrollsamtaleStatusTextMapper, kontrollsamtalestatusToFormStatus } from './KontrollsamtaleUtils'; +import styles from './OppsummeringAvKontrollsamtale.module.less'; +import { + KontrollsamtaleFormStatus, + OppdaterKontrollsamtaleInnkallingsdato, + OppdaterKontrollsamtaleStatusOgJournalpostIdFormData, + oppdaterKontrollsamtaleInnkallingsdatoSchema, + oppdaterKontrollsamtaleStatusOgJournalpostIdFormDataSchema, +} from './OppsummeringAvKontrollsamtaleUtils'; + +const OppsummeringAvKontrollsamtale = (props: { + sakId: string; + kontrollsamtale: Kontrollsamtale; + medEdit: boolean; +}) => { + const { insert } = useToast(); + const apiErrorMessages = useApiErrorMessages(); + const [dokumentStatus, hentDokument] = useBrevForhåndsvisning(getDokument); + + useEffect(() => { + if (RemoteData.isFailure(dokumentStatus)) { + insert( + createToast({ + type: ToastType.ERROR, + duration: 5000, + message: apiErrorMessages(dokumentStatus.error), + }), + ); + } + }, [dokumentStatus]); + + return ( +
+
+
+ Id + {props.kontrollsamtale.id} +
+ +
+ Frist + {formatDate(props.kontrollsamtale.frist)} +
+ +
+ Dokument-id + + {props.kontrollsamtale.dokumentId ? ( + + ) : ( + 'Ikke funnet' + )} + +
+ +
+ {props.medEdit && } +
+ ); +}; + +const OppsummerKontrollsamtaleStatus = (props: { + sakId: string; + kontrollsamtale: Kontrollsamtale; + medEdit: boolean; +}) => { + const [editStatus, setEditStatus] = useState(false); + + return ( +
+
+ Status + {props.medEdit ? ( + + ) : ( + {kontrollsamtaleStatusTextMapper(props.kontrollsamtale.status)} + )} +
+ {editStatus && ( + setEditStatus(false)} + sakId={props.sakId} + kontrollsamtaleSomSkalEndres={props.kontrollsamtale} + /> + )} +
+ ); +}; + +const EditKontrollsamtaleStatusOgJournalpostId = (props: { + visModal: boolean; + onClose: () => void; + sakId: string; + kontrollsamtaleSomSkalEndres: Kontrollsamtale; +}) => { + const navigate = useNavigate(); + const [oppdaterStatus, oppdater] = useApiCall(kontrollsamtaleApi.oppdaterKontrollsamtaleStatusOgJournalpost); + + const form = useForm({ + defaultValues: { + journalpostId: props.kontrollsamtaleSomSkalEndres.journalpostIdKontrollnotat ?? '', + status: kontrollsamtalestatusToFormStatus(props.kontrollsamtaleSomSkalEndres.status), + }, + resolver: yupResolver(oppdaterKontrollsamtaleStatusOgJournalpostIdFormDataSchema), + }); + + return ( + + +
{ + oppdater( + { + sakId: props.sakId, + kontrollsamtaleId: props.kontrollsamtaleSomSkalEndres.id, + status: values.status!, + journalpostId: values.journalpostId ? values.journalpostId : null, + }, + () => { + navigateToSakIntroWithMessage( + navigate, + 'Kontrollsamtalen har blitt oppdatert', + props.sakId, + ); + }, + ); + })} + > + ( + + )} + /> + ( + + Kontrollnotatets journalpost-id + + Journalpost-id er kun påkrevd dersom kontrollsamtale statusen er gjennomført + + + } + error={fieldState.error?.message} + {...field} + /> + )} + /> + {RemoteData.isFailure(oppdaterStatus) && } +
+ + +
+ +
+
+ ); +}; + +const OppsummerKontrollsamtaleInnkallingsdato = (props: { + sakId: string; + kontrollsamtale: Kontrollsamtale; + medEdit: boolean; +}) => { + const [editStatus, setEditStatus] = useState(false); + return ( +
+
+ Innkallingsdato + {props.medEdit ? ( + + ) : ( + {formatDate(props.kontrollsamtale.innkallingsdato)} + )} +
+ {editStatus && ( + setEditStatus(false)} + sakId={props.sakId} + kontrollsamtaleSomSkalEndres={props.kontrollsamtale} + /> + )} +
+ ); +}; + +const EditKontrollsamtaleInnkallingsdato = (props: { + visModal: boolean; + onClose: () => void; + sakId: string; + kontrollsamtaleSomSkalEndres: Kontrollsamtale; +}) => { + const navigate = useNavigate(); + const [oppdaterStatus, oppdater] = useApiCall(kontrollsamtaleApi.oppdaterKontrollsamtaleInnkallingsdato); + + const form = useForm({ + defaultValues: { + innkallingsmåned: parseNonNullableIsoDateOnly(props.kontrollsamtaleSomSkalEndres.innkallingsdato), + }, + resolver: yupResolver(oppdaterKontrollsamtaleInnkallingsdatoSchema), + }); + + return ( + + +
{ + oppdater( + { + sakId: props.sakId, + kontrollsamtaleId: props.kontrollsamtaleSomSkalEndres.id, + innkallingsmåned: toIsoMonth(values.innkallingsmåned!), + }, + () => { + navigateToSakIntroWithMessage( + navigate, + 'Kontrollsamtalen har blitt oppdatert', + props.sakId, + ); + }, + ); + })} + > + ( + + )} + /> + {RemoteData.isFailure(oppdaterStatus) && } +
+ + +
+ +
+
+ ); +}; + +const OppsummerKontrollsamtaleJournalpostKontrollnotat = (props: { + sakId: string; + kontrollsamtale: Kontrollsamtale; + medEdit: boolean; +}) => { + const [editStatus, setEditStatus] = useState(false); + return ( +
+
+ kontrollnotatets journalpost-id + {props.medEdit ? ( + + ) : ( + {props.kontrollsamtale.journalpostIdKontrollnotat ?? 'Ikke funnet'} + )} +
+ {editStatus && ( + setEditStatus(false)} + sakId={props.sakId} + kontrollsamtaleSomSkalEndres={props.kontrollsamtale} + /> + )} +
+ ); +}; + +const EditKontrollsamtale = (props: { sakId: string; kontrollsamtale: Kontrollsamtale }) => { + const [visKontrollsamtaleModal, setVisKontrollsamtaleModal] = useState(false); + + return ( +
+ setVisKontrollsamtaleModal(false)} + sakId={props.sakId} + kontrollsamtaleSomSkalEndres={props.kontrollsamtale} + /> + +
+ ); +}; + +const EndreKontrollsamtaleModal = (props: { + visModal: boolean; + onClose: () => void; + sakId: string; + kontrollsamtaleSomSkalEndres: Kontrollsamtale; +}) => { + const navigate = useNavigate(); + const [annullerStatus, annuller] = useApiCall(kontrollsamtaleApi.annullerKontrollsamtale); + + return ( + + + + Er du sikker på at du vil annullere kontrollsamtalen med id {props.kontrollsamtaleSomSkalEndres.id}? + + {RemoteData.isFailure(annullerStatus) && } +
+ + +
+
+
+ ); +}; + +export default OppsummeringAvKontrollsamtale; diff --git a/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtaleUtils.ts b/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtaleUtils.ts new file mode 100644 index 000000000..9b91fda0b --- /dev/null +++ b/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtaleUtils.ts @@ -0,0 +1,26 @@ +import { Nullable } from '~src/lib/types'; +import yup from '~src/lib/validering'; + +export enum KontrollsamtaleFormStatus { + GJENNOMFØRT = 'GJENNOMFØRT', + IKKE_MØTT_INNEN_FRIST = 'IKKE_MØTT_INNEN_FRIST', +} + +export interface OppdaterKontrollsamtaleStatusOgJournalpostIdFormData { + status: Nullable; + journalpostId: string; +} + +export const oppdaterKontrollsamtaleStatusOgJournalpostIdFormDataSchema = + yup.object({ + status: yup.string().oneOf(Object.values(KontrollsamtaleFormStatus)).required('Status må være satt'), + journalpostId: yup.string(), + }); + +export interface OppdaterKontrollsamtaleInnkallingsdato { + innkallingsmåned: Nullable; +} + +export const oppdaterKontrollsamtaleInnkallingsdatoSchema = yup.object({ + innkallingsmåned: yup.date().required('Innkallingsdato må være satt'), +}); diff --git a/src/pages/kontrollsamtale/kontrollsamtalePage.module.less b/src/pages/kontrollsamtale/kontrollsamtalePage.module.less index f50954b19..0fa9a1185 100644 --- a/src/pages/kontrollsamtale/kontrollsamtalePage.module.less +++ b/src/pages/kontrollsamtale/kontrollsamtalePage.module.less @@ -38,35 +38,6 @@ gap: @spacing; } -.kontrollsamtalerContainer { - display: flex; - flex-direction: column; - gap: @spacing-s; - max-height: 500px; - padding-right: 2rem; - overflow: auto; -} - -.kontrollsamtaleDetalje { - display: grid; - grid-template-columns: repeat(2, 1fr); -} - -.dokumentButton { - padding: 0; -} - -::-webkit-scrollbar { - -webkit-appearance: none; - width: 7px; -} - -::-webkit-scrollbar-thumb { - border-radius: 4px; - background-color: rgba(0, 0, 0, 0.5); - -webkit-box-shadow: 0 0 1px rgba(255, 255, 255, 0.5); -} - //------------------------- .opprettNyKontrollsamtaleFormContainer { display: flex; @@ -79,20 +50,3 @@ align-self: flex-end; } } - -.oppsummeringsContainer { - display: flex; - align-items: flex-start; - gap: @spacing-s; -} - -.modalForm { - display: flex; - flex-direction: column; - gap: @spacing-s; - - .buttonsContainer { - display: flex; - gap: @spacing-s; - } -} diff --git a/src/types/Kontrollsamtale.ts b/src/types/Kontrollsamtale.ts index 213c35dc6..aaab247ad 100644 --- a/src/types/Kontrollsamtale.ts +++ b/src/types/Kontrollsamtale.ts @@ -1,5 +1,5 @@ import { Nullable } from '~src/lib/types'; -import { KontrollsamtaleFormStatus } from '~src/pages/kontrollsamtale/KontrollsamtaleUtils'; +import { KontrollsamtaleFormStatus } from '~src/pages/kontrollsamtale/OppsummeringAvKontrollsamtaleUtils'; export interface Kontrollsamtale { id: string; @@ -9,6 +9,8 @@ export interface Kontrollsamtale { frist: string; dokumentId: Nullable; journalpostIdKontrollnotat: Nullable; + kanOppdatereInnkallingsmåned: boolean; + lovligeStatusovergangerForSaksbehandler: KontrollsamtaleStatus[]; } export enum KontrollsamtaleStatus { @@ -19,12 +21,17 @@ export enum KontrollsamtaleStatus { IKKE_MØTT_INNEN_FRIST = 'IKKE_MØTT_INNEN_FRIST', } -export interface OppdaterKontrollsamtaleRequest { +export interface OppdaterKontrollsamtaleStatusOgJournalpostRequest { sakId: string; kontrollsamtaleId: string; - dato: string; - journalpostId: Nullable; status: KontrollsamtaleFormStatus; + journalpostId: Nullable; +} + +export interface OppdaterKontrollsamtaleInnkallingsdatoRequest { + sakId: string; + kontrollsamtaleId: string; + innkallingsmåned: string; } export interface AnnullerKontrollsamtaleRequest { From d159913357792aff7ae0df64d0e448beceec1d1f Mon Sep 17 00:00:00 2001 From: ramziabuqassim Date: Fri, 31 May 2024 12:56:42 +0200 Subject: [PATCH 04/10] Refactor API endpoints for updating kontrollsamtale status and journalpost, and innkallingsdato --- src/api/kontrollsamtaleApi.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/api/kontrollsamtaleApi.ts b/src/api/kontrollsamtaleApi.ts index 66f1d2d9c..c7aae1b7e 100644 --- a/src/api/kontrollsamtaleApi.ts +++ b/src/api/kontrollsamtaleApi.ts @@ -21,8 +21,8 @@ export const opprettNyKontrollsamtale = (arg: { sakId: string; dato: string }) = export const oppdaterKontrollsamtaleStatusOgJournalpost = (arg: OppdaterKontrollsamtaleStatusOgJournalpostRequest) => apiClient({ - url: `/saker/${arg.sakId}/kontrollsamtaler`, - method: 'POST', + url: `/saker/${arg.sakId}/kontrollsamtaler/${arg.kontrollsamtaleId}/statusogjournalpostid`, + method: 'PATCH', body: { status: arg.status, journalpostId: arg.journalpostId, @@ -31,10 +31,10 @@ export const oppdaterKontrollsamtaleStatusOgJournalpost = (arg: OppdaterKontroll export const oppdaterKontrollsamtaleInnkallingsdato = (arg: OppdaterKontrollsamtaleInnkallingsdatoRequest) => apiClient({ - url: `/saker/${arg.sakId}/kontrollsamtaler`, - method: 'POST', + url: `/saker/${arg.sakId}/kontrollsamtaler/${arg.kontrollsamtaleId}/innkallingsmåned`, + method: 'PATCH', body: { - innkallingsdato: arg.innkallingsmåned, + innkallingsmåned: arg.innkallingsmåned, }, }); From 586e006a6443da385017e6e983240b493cb67f6a Mon Sep 17 00:00:00 2001 From: ramziabuqassim Date: Fri, 31 May 2024 12:59:34 +0200 Subject: [PATCH 05/10] fix body til opprett ny kontrollsamtale --- src/api/kontrollsamtaleApi.ts | 5 ++++- src/pages/kontrollsamtale/KontrollsamtalePage.tsx | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/api/kontrollsamtaleApi.ts b/src/api/kontrollsamtaleApi.ts index c7aae1b7e..ce099fe4c 100644 --- a/src/api/kontrollsamtaleApi.ts +++ b/src/api/kontrollsamtaleApi.ts @@ -13,10 +13,13 @@ export const hentKontrollsamtaler = (arg: { sakId: string }) => method: 'GET', }); -export const opprettNyKontrollsamtale = (arg: { sakId: string; dato: string }) => +export const opprettNyKontrollsamtale = (arg: { sakId: string; innkallingsmåned: string }) => apiClient({ url: `/saker/${arg.sakId}/kontrollsamtaler`, method: 'POST', + body: { + innkallingsmåned: arg.innkallingsmåned, + }, }); export const oppdaterKontrollsamtaleStatusOgJournalpost = (arg: OppdaterKontrollsamtaleStatusOgJournalpostRequest) => diff --git a/src/pages/kontrollsamtale/KontrollsamtalePage.tsx b/src/pages/kontrollsamtale/KontrollsamtalePage.tsx index 2230e76f3..2dc936757 100644 --- a/src/pages/kontrollsamtale/KontrollsamtalePage.tsx +++ b/src/pages/kontrollsamtale/KontrollsamtalePage.tsx @@ -17,7 +17,7 @@ import { SaksoversiktContext } from '~src/context/SaksoversiktContext'; import { useApiCall } from '~src/lib/hooks'; import * as Routes from '~src/lib/routes'; import { navigateToSakIntroWithMessage } from '~src/lib/routes'; -import { toIsoDateOnlyString } from '~src/utils/date/dateUtils'; +import { toIsoMonth } from '~src/utils/date/dateUtils'; import HentOgVisKontrollsamtaler from './HentOgVisKontrollsamtaler'; import styles from './kontrollsamtalePage.module.less'; @@ -53,7 +53,7 @@ const OpprettNyKontrollsamtale = (props: { sakId: string }) => { }); const onSubmit = (values: OpprettNyKontrollsamtaleFormData) => { - opprett({ sakId: props.sakId, dato: toIsoDateOnlyString(values.nyKontrollsamtaleDato!) }, () => { + opprett({ sakId: props.sakId, innkallingsmåned: toIsoMonth(values.nyKontrollsamtaleDato!) }, () => { navigateToSakIntroWithMessage(navigate, 'Ny kontrollsamtale har blitt opprettet', props.sakId); }); }; From ff9fa23a1fe6da0149cbd8976192998d047e5bc2 Mon Sep 17 00:00:00 2001 From: ramziabuqassim Date: Fri, 31 May 2024 13:01:53 +0200 Subject: [PATCH 06/10] =?UTF-8?q?chore:=20Update=20OppsummeringAvKontrolls?= =?UTF-8?q?amtaleUtils.ts=20to=20enforce=20required=20journalpost=20id=20f?= =?UTF-8?q?or=20status=20'GJENNOMF=C3=98RT'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kontrollsamtale/OppsummeringAvKontrollsamtaleUtils.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtaleUtils.ts b/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtaleUtils.ts index 9b91fda0b..8fc6b4957 100644 --- a/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtaleUtils.ts +++ b/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtaleUtils.ts @@ -14,7 +14,13 @@ export interface OppdaterKontrollsamtaleStatusOgJournalpostIdFormData { export const oppdaterKontrollsamtaleStatusOgJournalpostIdFormDataSchema = yup.object({ status: yup.string().oneOf(Object.values(KontrollsamtaleFormStatus)).required('Status må være satt'), - journalpostId: yup.string(), + journalpostId: yup + .string() + .defined() + .when('status', { + is: KontrollsamtaleFormStatus.GJENNOMFØRT, + then: yup.string().required('Journalpost id må være satt dersom status er gjennomført'), + }), }); export interface OppdaterKontrollsamtaleInnkallingsdato { From e7e5b74f0b3668c06855a04d7af4c82a61915a18 Mon Sep 17 00:00:00 2001 From: ramziabuqassim Date: Fri, 31 May 2024 13:20:51 +0200 Subject: [PATCH 07/10] chore: Update OppsummeringAvKontrollsamtale.tsx to include EditStatusTextHelper component --- .../OppsummeringAvKontrollsamtale.tsx | 49 ++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.tsx b/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.tsx index ad099ad6b..72a1b3e7b 100644 --- a/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.tsx +++ b/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.tsx @@ -1,7 +1,7 @@ import * as RemoteData from '@devexperts/remote-data-ts'; import { yupResolver } from '@hookform/resolvers/yup'; import { ExternalLinkIcon, PencilWritingIcon, XMarkOctagonIcon } from '@navikt/aksel-icons'; -import { BodyShort, Button, HelpText, Modal, Select, TextField } from '@navikt/ds-react'; +import { BodyShort, Button, HelpText, Label, Modal, Select, TextField } from '@navikt/ds-react'; import { useEffect, useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { useNavigate } from 'react-router-dom'; @@ -13,7 +13,7 @@ import { MonthPicker } from '~src/components/inputs/datePicker/DatePicker'; import { ToastType, createToast, useToast } from '~src/components/toast/Toast'; import { useApiCall, useBrevForhåndsvisning } from '~src/lib/hooks'; import { navigateToSakIntroWithMessage } from '~src/lib/routes'; -import { Kontrollsamtale } from '~src/types/Kontrollsamtale'; +import { Kontrollsamtale, KontrollsamtaleStatus } from '~src/types/Kontrollsamtale'; import { formatDate, parseNonNullableIsoDateOnly, toIsoMonth } from '~src/utils/date/dateUtils'; import { kontrollsamtaleStatusTextMapper, kontrollsamtalestatusToFormStatus } from './KontrollsamtaleUtils'; @@ -132,6 +132,45 @@ const OppsummerKontrollsamtaleStatus = (props: { ); }; +const EditStatusTextHelper = (props: { kontrollsamtale: Kontrollsamtale }) => { + const kanAnnulleres = props.kontrollsamtale.lovligeStatusovergangerForSaksbehandler.includes( + KontrollsamtaleStatus.ANNULLERT, + ); + + const statuserUtenAnnullering = props.kontrollsamtale.lovligeStatusovergangerForSaksbehandler.filter( + (status) => status !== KontrollsamtaleStatus.ANNULLERT, + ); + + return ( +
+ {statuserUtenAnnullering.length > 0 ? ( +
+ +
    + {props.kontrollsamtale.lovligeStatusovergangerForSaksbehandler + .filter((status) => status !== KontrollsamtaleStatus.ANNULLERT) + .map((status) => kontrollsamtaleStatusTextMapper(status))} +
+ {kanAnnulleres && ( + + Kontrollsamtalen kan også annuleres ved å klikke på annuller knappen i oversikten + + )} +
+ ) : ( +
+ + {kanAnnulleres && ( + + Kontrollsamtalen kan annuleres ved å klikke på annuller knappen i oversikten + + )} +
+ )} +
+ ); +}; + const EditKontrollsamtaleStatusOgJournalpostId = (props: { visModal: boolean; onClose: () => void; @@ -178,6 +217,8 @@ const EditKontrollsamtaleStatusOgJournalpostId = (props: { ); })} > + + + {!props.kontrollsamtaleSomSkalEndres.kanOppdatereInnkallingsmåned && ( + + )} + Date: Fri, 31 May 2024 13:25:23 +0200 Subject: [PATCH 08/10] Refactor API endpoint for updating kontrollsamtale status and journalpost --- src/api/kontrollsamtaleApi.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/kontrollsamtaleApi.ts b/src/api/kontrollsamtaleApi.ts index ce099fe4c..c4b771adb 100644 --- a/src/api/kontrollsamtaleApi.ts +++ b/src/api/kontrollsamtaleApi.ts @@ -24,7 +24,7 @@ export const opprettNyKontrollsamtale = (arg: { sakId: string; innkallingsmåned export const oppdaterKontrollsamtaleStatusOgJournalpost = (arg: OppdaterKontrollsamtaleStatusOgJournalpostRequest) => apiClient({ - url: `/saker/${arg.sakId}/kontrollsamtaler/${arg.kontrollsamtaleId}/statusogjournalpostid`, + url: `/saker/${arg.sakId}/kontrollsamtaler/${arg.kontrollsamtaleId}/status`, method: 'PATCH', body: { status: arg.status, From d09bb6150f37e20e601676a545b22684f4271213 Mon Sep 17 00:00:00 2001 From: ramziabuqassim Date: Fri, 31 May 2024 13:33:46 +0200 Subject: [PATCH 09/10] =?UTF-8?q?legg=20til=20hjelpetekster=20for=20oppdat?= =?UTF-8?q?er=20innkallingsm=C3=A5ned=20for=20kontrollsamtale?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.tsx b/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.tsx index 72a1b3e7b..af2b29e1b 100644 --- a/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.tsx +++ b/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.tsx @@ -349,7 +349,7 @@ const EditKontrollsamtaleInnkallingsdato = (props: { })} > {!props.kontrollsamtaleSomSkalEndres.kanOppdatereInnkallingsmåned && ( - + )} ( Date: Fri, 31 May 2024 15:30:25 +0200 Subject: [PATCH 10/10] oppdaterer styling for kontrollsamtale --- src/api/kontrollsamtaleApi.ts | 2 +- .../HentOgVisKontrollsamtaler.module.less | 15 +++- .../kontrollsamtale/KontrollsamtalePage.tsx | 75 +---------------- .../OpprettKontrollsamtale.module.less | 17 ++++ .../OpprettNyKontrollsamtale.tsx | 80 +++++++++++++++++++ .../OppsummeringAvKontrollsamtale.module.less | 14 +--- .../kontrollsamtalePage.module.less | 15 +--- 7 files changed, 117 insertions(+), 101 deletions(-) create mode 100644 src/pages/kontrollsamtale/OpprettKontrollsamtale.module.less create mode 100644 src/pages/kontrollsamtale/OpprettNyKontrollsamtale.tsx diff --git a/src/api/kontrollsamtaleApi.ts b/src/api/kontrollsamtaleApi.ts index c4b771adb..86c04b6f3 100644 --- a/src/api/kontrollsamtaleApi.ts +++ b/src/api/kontrollsamtaleApi.ts @@ -42,7 +42,7 @@ export const oppdaterKontrollsamtaleInnkallingsdato = (arg: OppdaterKontrollsamt }); export const annullerKontrollsamtale = (arg: AnnullerKontrollsamtaleRequest) => - apiClient<{ status: 'OK' }>({ + apiClient({ url: `/saker/${arg.sakId}/kontrollsamtaler/${arg.kontrollsamtaleId}`, method: 'DELETE', }); diff --git a/src/pages/kontrollsamtale/HentOgVisKontrollsamtaler.module.less b/src/pages/kontrollsamtale/HentOgVisKontrollsamtaler.module.less index 161a1cc90..367cd0ba3 100644 --- a/src/pages/kontrollsamtale/HentOgVisKontrollsamtaler.module.less +++ b/src/pages/kontrollsamtale/HentOgVisKontrollsamtaler.module.less @@ -1,10 +1,23 @@ @import '@styles/variables.less'; .kontrollsamtalerContainer { - display: flex; + display: grid; flex-direction: column; gap: @spacing-s; max-height: 500px; padding-right: 2rem; overflow: auto; } + +/* +::-webkit-scrollbar { + -webkit-appearance: none; + width: 5px; +} + +::-webkit-scrollbar-thumb { + border-radius: 2px; + background-color: rgba(0, 0, 0, 0.5); + -webkit-box-shadow: 0 0 1px rgba(255, 255, 255, 0.5); +} +*/ diff --git a/src/pages/kontrollsamtale/KontrollsamtalePage.tsx b/src/pages/kontrollsamtale/KontrollsamtalePage.tsx index 2dc936757..de9ee4753 100644 --- a/src/pages/kontrollsamtale/KontrollsamtalePage.tsx +++ b/src/pages/kontrollsamtale/KontrollsamtalePage.tsx @@ -1,27 +1,11 @@ -import * as RemoteData from '@devexperts/remote-data-ts'; -import { yupResolver } from '@hookform/resolvers/yup'; -import { Button, Heading } from '@navikt/ds-react'; -import { startOfTomorrow } from 'date-fns'; -import { Controller, useForm } from 'react-hook-form'; -import { useNavigate, useOutletContext } from 'react-router-dom'; +import { Heading } from '@navikt/ds-react'; +import { useOutletContext } from 'react-router-dom'; -import * as kontrollsamtaleApi from '~src/api/kontrollsamtaleApi'; -import ApiErrorAlert from '~src/components/apiErrorAlert/ApiErrorAlert'; -import { DatePicker } from '~src/components/inputs/datePicker/DatePicker'; -import LinkAsButton from '~src/components/linkAsButton/LinkAsButton'; -import Oppsummeringspanel, { - Oppsummeringsfarge, - Oppsummeringsikon, -} from '~src/components/oppsummering/oppsummeringspanel/Oppsummeringspanel'; import { SaksoversiktContext } from '~src/context/SaksoversiktContext'; -import { useApiCall } from '~src/lib/hooks'; -import * as Routes from '~src/lib/routes'; -import { navigateToSakIntroWithMessage } from '~src/lib/routes'; -import { toIsoMonth } from '~src/utils/date/dateUtils'; import HentOgVisKontrollsamtaler from './HentOgVisKontrollsamtaler'; import styles from './kontrollsamtalePage.module.less'; -import { OpprettNyKontrollsamtaleFormData, opprettNyKontrollsamtaleSchema } from './KontrollsamtaleUtils'; +import OpprettNyKontrollsamtale from './OpprettNyKontrollsamtale'; const KontrollsamtalePage = () => { const props = useOutletContext(); @@ -41,57 +25,4 @@ const KontrollsamtalePage = () => { ); }; -const OpprettNyKontrollsamtale = (props: { sakId: string }) => { - const navigate = useNavigate(); - const [status, opprett] = useApiCall(kontrollsamtaleApi.opprettNyKontrollsamtale); - - const form = useForm({ - defaultValues: { - nyKontrollsamtaleDato: null, - }, - resolver: yupResolver(opprettNyKontrollsamtaleSchema), - }); - - const onSubmit = (values: OpprettNyKontrollsamtaleFormData) => { - opprett({ sakId: props.sakId, innkallingsmåned: toIsoMonth(values.nyKontrollsamtaleDato!) }, () => { - navigateToSakIntroWithMessage(navigate, 'Ny kontrollsamtale har blitt opprettet', props.sakId); - }); - }; - - return ( - -
- ( - - )} - /> - - {RemoteData.isFailure(status) && } -
- - Tilbake - - -
- -
- ); -}; - export default KontrollsamtalePage; diff --git a/src/pages/kontrollsamtale/OpprettKontrollsamtale.module.less b/src/pages/kontrollsamtale/OpprettKontrollsamtale.module.less new file mode 100644 index 000000000..7596bab12 --- /dev/null +++ b/src/pages/kontrollsamtale/OpprettKontrollsamtale.module.less @@ -0,0 +1,17 @@ +@import '@styles/variables.less'; + +.panelContainer { + width: 30rem; +} + +.opprettNyKontrollsamtaleFormContainer { + display: flex; + flex-direction: column; + gap: @spacing-s; + + .buttonsContainer { + display: flex; + gap: @spacing; + align-self: flex-end; + } +} diff --git a/src/pages/kontrollsamtale/OpprettNyKontrollsamtale.tsx b/src/pages/kontrollsamtale/OpprettNyKontrollsamtale.tsx new file mode 100644 index 000000000..5e0042aea --- /dev/null +++ b/src/pages/kontrollsamtale/OpprettNyKontrollsamtale.tsx @@ -0,0 +1,80 @@ +import * as RemoteData from '@devexperts/remote-data-ts'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { Button } from '@navikt/ds-react'; +import { useForm, Controller } from 'react-hook-form'; +import { useNavigate } from 'react-router-dom'; + +import * as kontrollsamtaleApi from '~src/api/kontrollsamtaleApi'; +import ApiErrorAlert from '~src/components/apiErrorAlert/ApiErrorAlert'; +import { MonthPicker } from '~src/components/inputs/datePicker/DatePicker'; +import LinkAsButton from '~src/components/linkAsButton/LinkAsButton'; +import Oppsummeringspanel, { + Oppsummeringsikon, + Oppsummeringsfarge, +} from '~src/components/oppsummering/oppsummeringspanel/Oppsummeringspanel'; +import { useApiCall } from '~src/lib/hooks'; +import * as Routes from '~src/lib/routes'; +import { navigateToSakIntroWithMessage } from '~src/lib/routes'; +import { toIsoMonth } from '~src/utils/date/dateUtils'; + +import { OpprettNyKontrollsamtaleFormData, opprettNyKontrollsamtaleSchema } from './KontrollsamtaleUtils'; +import styles from './OpprettKontrollsamtale.module.less'; + +const OpprettNyKontrollsamtale = (props: { sakId: string }) => { + const navigate = useNavigate(); + const [status, opprett] = useApiCall(kontrollsamtaleApi.opprettNyKontrollsamtale); + + const form = useForm({ + defaultValues: { + nyKontrollsamtaleDato: null, + }, + resolver: yupResolver(opprettNyKontrollsamtaleSchema), + }); + + const onSubmit = (values: OpprettNyKontrollsamtaleFormData) => { + opprett({ sakId: props.sakId, innkallingsmåned: toIsoMonth(values.nyKontrollsamtaleDato!) }, () => { + navigateToSakIntroWithMessage(navigate, 'Ny kontrollsamtale har blitt opprettet', props.sakId); + }); + }; + + return ( + +
+ ( + { + const today = new Date(); + return new Date(today.getFullYear(), today.getMonth() + 1, 1); + })()} + error={fieldState.error?.message} + onChange={field.onChange} + value={field.value} + /> + )} + /> + + {RemoteData.isFailure(status) && } +
+ + Tilbake + + +
+ +
+ ); +}; + +export default OpprettNyKontrollsamtale; diff --git a/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.module.less b/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.module.less index 4991a60ec..b30e0f0cb 100644 --- a/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.module.less +++ b/src/pages/kontrollsamtale/OppsummeringAvKontrollsamtale.module.less @@ -2,13 +2,12 @@ .oppsummeringsContainer { display: flex; - align-items: flex-start; gap: @spacing-s; } .kontrollsamtaleDetalje { display: grid; - grid-template-columns: repeat(2, 1fr); + grid-template-columns: 250px 350px; } .buttonMedIKon { @@ -22,17 +21,6 @@ } } -::-webkit-scrollbar { - -webkit-appearance: none; - width: 7px; -} - -::-webkit-scrollbar-thumb { - border-radius: 4px; - background-color: rgba(0, 0, 0, 0.5); - -webkit-box-shadow: 0 0 1px rgba(255, 255, 255, 0.5); -} - .annullerKontrollsamtaleIkon { display: flex; align-items: flex-end; diff --git a/src/pages/kontrollsamtale/kontrollsamtalePage.module.less b/src/pages/kontrollsamtale/kontrollsamtalePage.module.less index 0fa9a1185..d705404bd 100644 --- a/src/pages/kontrollsamtale/kontrollsamtalePage.module.less +++ b/src/pages/kontrollsamtale/kontrollsamtalePage.module.less @@ -17,7 +17,7 @@ .mainContentContainer { display: flex; - gap: @spacing-xxl; + gap: @spacing-xl; margin: 0 10rem; flex-wrap: wrap; } @@ -37,16 +37,3 @@ display: flex; gap: @spacing; } - -//------------------------- -.opprettNyKontrollsamtaleFormContainer { - display: flex; - flex-direction: column; - gap: @spacing-s; - - .buttonsContainer { - display: flex; - gap: @spacing; - align-self: flex-end; - } -}