From 84f020ad0b09cf0db82bdfeaa9c4562c0917e4f3 Mon Sep 17 00:00:00 2001 From: matiasvinjevoll Date: Fri, 24 Apr 2020 11:16:40 +0200 Subject: [PATCH 1/3] FO-2841 Nytt panel for brukers situasjon --- .../situasjon/situasjon-panel-innhold.tsx | 63 +++++++++++++++++++ src/components/paneler/paneler.tsx | 5 ++ src/mock/data/index.ts | 1 + src/mock/data/situasjon.ts | 27 ++++++++ src/mock/index.ts | 4 +- src/rest/api.ts | 4 ++ src/rest/datatyper/situasjonData.ts | 8 +++ 7 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 src/components/paneler/innhold/situasjon/situasjon-panel-innhold.tsx create mode 100644 src/mock/data/situasjon.ts create mode 100644 src/rest/datatyper/situasjonData.ts diff --git a/src/components/paneler/innhold/situasjon/situasjon-panel-innhold.tsx b/src/components/paneler/innhold/situasjon/situasjon-panel-innhold.tsx new file mode 100644 index 00000000..2005aa11 --- /dev/null +++ b/src/components/paneler/innhold/situasjon/situasjon-panel-innhold.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import { useFetchRegistrering, useFetchSituasjon } from '../../../../rest/api'; +import { useAppStore } from '../../../../stores/app-store'; +import { hasError, isPending } from '@nutgaard/use-fetch'; +import { Feilmelding, Laster, NoData } from '../../../felles/fetch'; +import { hasData } from '../../../../rest/utils'; +import { Registrering } from '../../../../rest/datatyper/registreringsData'; +import { Situasjon } from '../../../../rest/datatyper/situasjonData'; +import { formaterDato } from '../../../../utils'; +import Informasjonsbolk from '../../../felles/informasjonsbolk'; + +const SituasjonPanelInnhold = () => { + const {fnr} = useAppStore(); + const registrering = useFetchRegistrering(fnr); + const situasjonHistorikk = useFetchSituasjon(fnr); + + if (isPending(registrering) || isPending(situasjonHistorikk)) { + return ; + } else if (hasError(registrering) || hasError(situasjonHistorikk)) { + return ; + } else if (!hasData(registrering) || !registrering.data.registrering) { + return ; + } + const {registrering: brukerRegistrering} = registrering.data; + + const situasjoner = tilSituasjonVisning( situasjonHistorikk ? situasjonHistorikk.data : [], brukerRegistrering); + + const [gjeldende] = situasjoner.splice(0, 1); + + return ( + <> +
+ Sist endret: {gjeldende.dato} + {gjeldende.situasjon} +
+ +
{situasjoner.map((situasjon, idx) => +
{situasjon.dato}: {situasjon.situasjon}
) + } +
+
+ + ); +}; + +interface SituasjonVisning { + dato: string; + situasjon: string; +} + +function tilSituasjonVisning(situasjoner: Situasjon[], registrering: Registrering): SituasjonVisning[] { + const regBesvarelse = registrering.teksterForBesvarelse.find(value => value.sporsmalId === 'dinSituasjon'); + const regSituasjon: SituasjonVisning[] = + regBesvarelse ? + [{dato: formaterDato(registrering.opprettetDato), + situasjon: regBesvarelse.svar + ' (fra arbeidssøkerregistrering)'}] : []; + + return situasjoner.map(sit => { + return {dato: formaterDato(sit.opprettet), situasjon: sit.svarTekst}; + }).concat(regSituasjon); +} + +export default SituasjonPanelInnhold; diff --git a/src/components/paneler/paneler.tsx b/src/components/paneler/paneler.tsx index 89846a62..148a8aba 100644 --- a/src/components/paneler/paneler.tsx +++ b/src/components/paneler/paneler.tsx @@ -14,6 +14,7 @@ import { hasData } from '../../rest/utils'; import { hasHashParam, hasQueryParam } from '../../utils'; import { TilretteleggingsbehovSpa, TilretteleggingsbehovViewType } from '../tilretteleggingsbehov-spa'; import './paneler.less'; +import SituasjonPanelInnhold from './innhold/situasjon/situasjon-panel-innhold'; export const Paneler = () => { const { fnr } = useAppStore(); @@ -27,6 +28,10 @@ export const Paneler = () => { return (
+ + + + diff --git a/src/mock/data/index.ts b/src/mock/data/index.ts index e4849208..58d6e980 100644 --- a/src/mock/data/index.ts +++ b/src/mock/data/index.ts @@ -7,4 +7,5 @@ export { default as veilederMock } from './veileder'; export { default as ytelsestatusMock } from './ytelsestatus'; export { default as featuresMock } from './features'; export { default as oppfolgingMock } from './oppfolging'; +export { default as situasjonMock } from './situasjon'; export { ordinaerRegistering as registeringMock } from './registrering'; diff --git a/src/mock/data/situasjon.ts b/src/mock/data/situasjon.ts new file mode 100644 index 00000000..0237e2d2 --- /dev/null +++ b/src/mock/data/situasjon.ts @@ -0,0 +1,27 @@ +import { JSONArray } from 'yet-another-fetch-mock'; + +const situasjonHistorikk: JSONArray = [ + { + opprettet: '2020-04-22 10:18:43.992637', + endretAvType: 'BRUKER', + endretAvId: '12345678901', + svarId: 'SKAL_I_JOBB', + svarTekst: 'Arbeidsgiver har gitt beskjed om når jeg skal tilbake på jobb' + }, + { + opprettet: '2020-04-11 09:42:11.982651', + endretAvType: 'BRUKER', + endretAvId: '12345678901', + svarId: 'PERMITTERT_MED_MIDLERTIDIG_JOBB', + svarTekst: 'Er fortsatt permittert, men har en annen midlertidig jobb' + }, + { + opprettet: '2020-03-26 11:33:51.431962', + endretAvType: 'BRUKER', + endretAvId: '12345678901', + svarId: 'PERMITTERT', + svarTekst: 'Er permittert eller kommer til å bli permittert' + } +]; + +export default situasjonHistorikk; diff --git a/src/mock/index.ts b/src/mock/index.ts index 6121f001..924130e4 100644 --- a/src/mock/index.ts +++ b/src/mock/index.ts @@ -9,7 +9,8 @@ import { personaliaMock, registeringMock, veilederMock, - ytelsestatusMock + ytelsestatusMock, + situasjonMock } from './data'; const mock = FetchMock.configure({ @@ -27,3 +28,4 @@ mock.get('/veilarboppfolging/api/person/:fnr/ytelser', ytelsestatusMock); mock.get('/veilarboppfolging/api/underoppfolging', oppfolgingMock); mock.get('/veilarbregistrering/api/registrering', registeringMock); mock.get('/veilarbpersonflatefs/api/feature', featuresMock); +mock.get('/veilarbvedtakinfo/api/situasjonHistorikk', situasjonMock); diff --git a/src/rest/api.ts b/src/rest/api.ts index 7c4374f6..57c5945a 100644 --- a/src/rest/api.ts +++ b/src/rest/api.ts @@ -9,10 +9,14 @@ import { KartleggingData } from './datatyper/kartlegging'; import { YtelseData } from './datatyper/ytelse'; import { UnderOppfolgingData } from './datatyper/underOppfolgingData'; import { OrNothing } from '../utils/felles-typer'; +import { Situasjon } from './datatyper/situasjonData'; export const useFetchRegistrering = (fnr: string) => useFetch(`/veilarbregistrering/api/registrering?fnr=${fnr}`); +export const useFetchSituasjon = (fnr: string) => + useFetch(`/veilarbvedtakinfo/api/situasjonHistorikk?fnr=${fnr}`); + export const useFetchCvOgJobbprofil = (fnr: string) => useFetch(`/pam-cv-api/rest/v1/arbeidssoker/${fnr}`); export const useFetchVeileder = (veilederId: OrNothing, config?: Config) => diff --git a/src/rest/datatyper/situasjonData.ts b/src/rest/datatyper/situasjonData.ts new file mode 100644 index 00000000..3f43da0f --- /dev/null +++ b/src/rest/datatyper/situasjonData.ts @@ -0,0 +1,8 @@ + +export interface Situasjon { + opprettet: string; + endretAvType: string; + endretAvId: string; + svarId: string; + svarTekst: string; +} From f5fdc94886a8188ea68354964a3fb91ba6fdc3bf Mon Sep 17 00:00:00 2001 From: matiasvinjevoll Date: Tue, 28 Apr 2020 13:59:09 +0200 Subject: [PATCH 2/3] FO-2841 gjeldende situasjon i panel-tittel --- .../situasjon/situasjon-panel-innhold.tsx | 47 ++--------- .../innhold/situasjon/situasjon-panel.tsx | 77 +++++++++++++++++++ src/components/paneler/paneler.tsx | 6 +- 3 files changed, 86 insertions(+), 44 deletions(-) create mode 100644 src/components/paneler/innhold/situasjon/situasjon-panel.tsx diff --git a/src/components/paneler/innhold/situasjon/situasjon-panel-innhold.tsx b/src/components/paneler/innhold/situasjon/situasjon-panel-innhold.tsx index 2005aa11..3d3ed20d 100644 --- a/src/components/paneler/innhold/situasjon/situasjon-panel-innhold.tsx +++ b/src/components/paneler/innhold/situasjon/situasjon-panel-innhold.tsx @@ -1,31 +1,14 @@ import React from 'react'; -import { useFetchRegistrering, useFetchSituasjon } from '../../../../rest/api'; -import { useAppStore } from '../../../../stores/app-store'; -import { hasError, isPending } from '@nutgaard/use-fetch'; -import { Feilmelding, Laster, NoData } from '../../../felles/fetch'; -import { hasData } from '../../../../rest/utils'; -import { Registrering } from '../../../../rest/datatyper/registreringsData'; -import { Situasjon } from '../../../../rest/datatyper/situasjonData'; -import { formaterDato } from '../../../../utils'; import Informasjonsbolk from '../../../felles/informasjonsbolk'; +import { SituasjonVisningHistorikk } from './situasjon-panel'; -const SituasjonPanelInnhold = () => { - const {fnr} = useAppStore(); - const registrering = useFetchRegistrering(fnr); - const situasjonHistorikk = useFetchSituasjon(fnr); - - if (isPending(registrering) || isPending(situasjonHistorikk)) { - return ; - } else if (hasError(registrering) || hasError(situasjonHistorikk)) { - return ; - } else if (!hasData(registrering) || !registrering.data.registrering) { - return ; - } - const {registrering: brukerRegistrering} = registrering.data; +interface Props { + situasjoner: SituasjonVisningHistorikk; +} - const situasjoner = tilSituasjonVisning( situasjonHistorikk ? situasjonHistorikk.data : [], brukerRegistrering); +const SituasjonPanelInnhold = (props: Props) => { - const [gjeldende] = situasjoner.splice(0, 1); + const {gjeldende, historikk} = props.situasjoner; return ( <> @@ -34,7 +17,7 @@ const SituasjonPanelInnhold = () => { {gjeldende.situasjon}
-
{situasjoner.map((situasjon, idx) => +
{historikk.map((situasjon, idx) =>
{situasjon.dato}: {situasjon.situasjon}
) }
@@ -43,21 +26,5 @@ const SituasjonPanelInnhold = () => { ); }; -interface SituasjonVisning { - dato: string; - situasjon: string; -} - -function tilSituasjonVisning(situasjoner: Situasjon[], registrering: Registrering): SituasjonVisning[] { - const regBesvarelse = registrering.teksterForBesvarelse.find(value => value.sporsmalId === 'dinSituasjon'); - const regSituasjon: SituasjonVisning[] = - regBesvarelse ? - [{dato: formaterDato(registrering.opprettetDato), - situasjon: regBesvarelse.svar + ' (fra arbeidssøkerregistrering)'}] : []; - - return situasjoner.map(sit => { - return {dato: formaterDato(sit.opprettet), situasjon: sit.svarTekst}; - }).concat(regSituasjon); -} export default SituasjonPanelInnhold; diff --git a/src/components/paneler/innhold/situasjon/situasjon-panel.tsx b/src/components/paneler/innhold/situasjon/situasjon-panel.tsx new file mode 100644 index 00000000..78a9db08 --- /dev/null +++ b/src/components/paneler/innhold/situasjon/situasjon-panel.tsx @@ -0,0 +1,77 @@ +import React from 'react'; +import SituasjonPanelInnhold from './situasjon-panel-innhold'; +import Panel from '../../panel'; +import { FetchResult, hasError, isPending } from '@nutgaard/use-fetch'; +import { Feilmelding } from '../../../felles/fetch'; +import { hasData } from '../../../../rest/utils'; +import { useAppStore } from '../../../../stores/app-store'; +import { Registrering, RegistreringsData } from '../../../../rest/datatyper/registreringsData'; +import { useFetchRegistrering, useFetchSituasjon } from '../../../../rest/api'; +import { Situasjon } from '../../../../rest/datatyper/situasjonData'; +import { formaterDato } from '../../../../utils'; + +const SituasjonPanel = () => { + // TODO feture toggle + + const {fnr} = useAppStore(); + const registrering: FetchResult = useFetchRegistrering(fnr); + const situasjonHistorikk: FetchResult = useFetchSituasjon(fnr); + + // bør dette flyttes til paneler.tsx og synk uthenting? + if (isPending(registrering) || isPending(situasjonHistorikk)) { + return null; + } else if (hasError(registrering) || hasError(situasjonHistorikk)) { + return ; + } else if (!hasData(registrering) || !registrering.data.registrering) { + return null; + } + + let situasjonVisningHistorikk = tilSituasjonVisningHistorikk(situasjonHistorikk.data, registrering.data.registrering); + + if (!situasjonVisningHistorikk) return null; + + let {gjeldende} = situasjonVisningHistorikk; + + const tittel = `Brukers situasjon ${gjeldende.situasjon} (sist endret ${gjeldende.dato})` + + return ( + + + + ); +} + +export interface SituasjonVisning { + dato: string; + situasjon: string; +} + +export interface SituasjonVisningHistorikk { + gjeldende: SituasjonVisning; + historikk: SituasjonVisning[]; +} + +export function tilSituasjonVisningHistorikk(situasjoner: Situasjon[], registrering: Registrering): SituasjonVisningHistorikk | null { + const regBesvarelse = registrering.teksterForBesvarelse.find(value => value.sporsmalId === 'dinSituasjon'); + if (!regBesvarelse) return null; // TODO logg feil/metrikk? + + const regSituasjon: SituasjonVisning[] = + [{dato: formaterDato(registrering.opprettetDato), + situasjon: regBesvarelse.svar}]; + + const historikk = situasjoner.map(sit => { + return {dato: formaterDato(sit.opprettet), situasjon: sit.svarTekst}; + }).concat(regSituasjon); + + // TODO: sorter først + const [gjeldende] = historikk.splice(0, 1); + + if (historikk.length === 0) return null; + + return { + gjeldende, + historikk + } +} + +export default SituasjonPanel; diff --git a/src/components/paneler/paneler.tsx b/src/components/paneler/paneler.tsx index 148a8aba..5f3596f4 100644 --- a/src/components/paneler/paneler.tsx +++ b/src/components/paneler/paneler.tsx @@ -14,7 +14,7 @@ import { hasData } from '../../rest/utils'; import { hasHashParam, hasQueryParam } from '../../utils'; import { TilretteleggingsbehovSpa, TilretteleggingsbehovViewType } from '../tilretteleggingsbehov-spa'; import './paneler.less'; -import SituasjonPanelInnhold from './innhold/situasjon/situasjon-panel-innhold'; +import SituasjonPanel from './innhold/situasjon/situasjon-panel'; export const Paneler = () => { const { fnr } = useAppStore(); @@ -28,9 +28,7 @@ export const Paneler = () => { return (
- - - + From fd838b76237ab83fc8fd5f1ba6e39130904afddf Mon Sep 17 00:00:00 2001 From: matiasvinjevoll Date: Tue, 28 Apr 2020 15:58:51 +0200 Subject: [PATCH 3/3] FO-2841 sorter historikk --- .../innhold/situasjon/situasjon-panel-innhold.tsx | 5 +++-- .../paneler/innhold/situasjon/situasjon-panel.tsx | 14 +++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/components/paneler/innhold/situasjon/situasjon-panel-innhold.tsx b/src/components/paneler/innhold/situasjon/situasjon-panel-innhold.tsx index 3d3ed20d..bbfad3fc 100644 --- a/src/components/paneler/innhold/situasjon/situasjon-panel-innhold.tsx +++ b/src/components/paneler/innhold/situasjon/situasjon-panel-innhold.tsx @@ -1,6 +1,7 @@ import React from 'react'; import Informasjonsbolk from '../../../felles/informasjonsbolk'; import { SituasjonVisningHistorikk } from './situasjon-panel'; +import { formaterDato } from '../../../../utils'; interface Props { situasjoner: SituasjonVisningHistorikk; @@ -13,12 +14,12 @@ const SituasjonPanelInnhold = (props: Props) => { return ( <>
- Sist endret: {gjeldende.dato} + Sist endret: {formaterDato(gjeldende.dato.toISOString())} {gjeldende.situasjon}
{historikk.map((situasjon, idx) => -
{situasjon.dato}: {situasjon.situasjon}
) +
{formaterDato(situasjon.dato.toISOString())}: {situasjon.situasjon}
) }
diff --git a/src/components/paneler/innhold/situasjon/situasjon-panel.tsx b/src/components/paneler/innhold/situasjon/situasjon-panel.tsx index 78a9db08..f244fa54 100644 --- a/src/components/paneler/innhold/situasjon/situasjon-panel.tsx +++ b/src/components/paneler/innhold/situasjon/situasjon-panel.tsx @@ -17,7 +17,6 @@ const SituasjonPanel = () => { const registrering: FetchResult = useFetchRegistrering(fnr); const situasjonHistorikk: FetchResult = useFetchSituasjon(fnr); - // bør dette flyttes til paneler.tsx og synk uthenting? if (isPending(registrering) || isPending(situasjonHistorikk)) { return null; } else if (hasError(registrering) || hasError(situasjonHistorikk)) { @@ -32,7 +31,7 @@ const SituasjonPanel = () => { let {gjeldende} = situasjonVisningHistorikk; - const tittel = `Brukers situasjon ${gjeldende.situasjon} (sist endret ${gjeldende.dato})` + const tittel = `Brukers situasjon ${gjeldende.situasjon} (sist endret ${formaterDato(gjeldende.dato.toISOString())})` return ( @@ -42,7 +41,7 @@ const SituasjonPanel = () => { } export interface SituasjonVisning { - dato: string; + dato: Date; situasjon: string; } @@ -56,14 +55,15 @@ export function tilSituasjonVisningHistorikk(situasjoner: Situasjon[], registrer if (!regBesvarelse) return null; // TODO logg feil/metrikk? const regSituasjon: SituasjonVisning[] = - [{dato: formaterDato(registrering.opprettetDato), + [{dato: new Date(registrering.opprettetDato), situasjon: regBesvarelse.svar}]; const historikk = situasjoner.map(sit => { - return {dato: formaterDato(sit.opprettet), situasjon: sit.svarTekst}; - }).concat(regSituasjon); + return {dato: new Date(sit.opprettet), situasjon: sit.svarTekst}; + }) + .concat(regSituasjon) + .sort((a,b) => a.dato < b.dato ? 0 : -1); - // TODO: sorter først const [gjeldende] = historikk.splice(0, 1); if (historikk.length === 0) return null;