diff --git a/src/data/manglendemedvirkning/manglendeMedvirkningTypes.ts b/src/data/manglendemedvirkning/manglendeMedvirkningTypes.ts index 2d3dd94e9..63122b350 100644 --- a/src/data/manglendemedvirkning/manglendeMedvirkningTypes.ts +++ b/src/data/manglendemedvirkning/manglendeMedvirkningTypes.ts @@ -48,3 +48,13 @@ export enum VurderingType { UNNTAK = "UNNTAK", IKKE_AKTUELL = "IKKE_AKTUELL", } + +export const typeTexts: { + [key in VurderingType]: string; +} = { + [VurderingType.FORHANDSVARSEL]: "Forhåndsvarsel", + [VurderingType.OPPFYLT]: "Oppfylt", + [VurderingType.STANS]: "Stans", + [VurderingType.IKKE_AKTUELL]: "Ikke aktuell", + [VurderingType.UNNTAK]: "Unntak", +}; diff --git a/src/sider/manglendemedvirkning/ManglendeMedvirkning.tsx b/src/sider/manglendemedvirkning/ManglendeMedvirkning.tsx index 6e1072cd7..58fed494a 100644 --- a/src/sider/manglendemedvirkning/ManglendeMedvirkning.tsx +++ b/src/sider/manglendemedvirkning/ManglendeMedvirkning.tsx @@ -1,31 +1,20 @@ -import React from "react"; -import ForhandsvarselSkjema from "@/sider/manglendemedvirkning/forhandsvarsel/ForhandsvarselSkjema"; +import React, { useState } from "react"; import { useManglendeMedvirkningVurderingQuery } from "@/data/manglendemedvirkning/manglendeMedvirkningQueryHooks"; import { VurderingType } from "@/data/manglendemedvirkning/manglendeMedvirkningTypes"; -import { Alert, Box } from "@navikt/ds-react"; -import ForhandsvarselSendt from "@/sider/manglendemedvirkning/forhandsvarsel/ForhandsvarselSendt"; -import { useNotification } from "@/context/notification/NotificationContext"; +import { ManglendeMedvirkningStartetVurdering } from "@/sider/manglendemedvirkning/ManglendeMedvirkningStartetVurdering"; +import { ManglendeMedvirkningNyVurdering } from "@/sider/manglendemedvirkning/ManglendeMedvirkningNyVurdering"; export default function ManglendeMedvirkning() { - const { notification } = useNotification(); const { sisteVurdering } = useManglendeMedvirkningVurderingQuery(); const isForhandsvarsel = sisteVurdering?.vurderingType === VurderingType.FORHANDSVARSEL; + const [showStartetVurdering, setShowStartetVurdering] = useState(false); - return ( - <> - {notification && ( - - {notification.message} - - )} - - {isForhandsvarsel ? ( - - ) : ( - - )} - - + return showStartetVurdering || isForhandsvarsel ? ( + + ) : ( + setShowStartetVurdering(true)} + /> ); } diff --git a/src/sider/manglendemedvirkning/ManglendeMedvirkningNyVurdering.tsx b/src/sider/manglendemedvirkning/ManglendeMedvirkningNyVurdering.tsx new file mode 100644 index 000000000..2de47002a --- /dev/null +++ b/src/sider/manglendemedvirkning/ManglendeMedvirkningNyVurdering.tsx @@ -0,0 +1,66 @@ +import React from "react"; +import { ReactElement } from "react"; +import { useNotification } from "@/context/notification/NotificationContext"; +import { Alert, BodyShort, Box, Button, Heading } from "@navikt/ds-react"; +import { tilLesbarDatoMedArUtenManedNavn } from "@/utils/datoUtils"; +import { + typeTexts, + VurderingResponseDTO, + VurderingType, +} from "@/data/manglendemedvirkning/manglendeMedvirkningTypes"; +import { useManglendeMedvirkningVurderingQuery } from "@/data/manglendemedvirkning/manglendeMedvirkningQueryHooks"; + +const texts = { + title: "Arbeidsuførhet", + siste: "Siste vurdering", + button: "Start ny vurdering", +}; + +const lastVurderingText = (vurderinger: VurderingResponseDTO[]) => { + if (vurderinger.length === 0) { + return "Ingen vurderinger har blitt gjort, trykk på 'Start ny vurdering' for å sende forhåndsvarsel."; + } + + const lastVurdering = vurderinger[0]; + const lastForhandsvarsel = vurderinger.find( + ({ vurderingType }) => vurderingType === VurderingType.FORHANDSVARSEL + ); + const lastVurderingType = + typeTexts[lastVurdering.vurderingType].toLowerCase(); + + return `Forrige forhåndsvarsel på § 8-8 ble sendt ut ${tilLesbarDatoMedArUtenManedNavn( + lastForhandsvarsel?.createdAt + )} og ${lastVurderingType} ${tilLesbarDatoMedArUtenManedNavn( + lastVurdering?.createdAt + )}.`; +}; + +interface Props { + handleClick: () => void; +} + +export const ManglendeMedvirkningNyVurdering = ({ + handleClick, +}: Props): ReactElement => { + const { data } = useManglendeMedvirkningVurderingQuery(); + const { notification } = useNotification(); + + return ( + <> + {notification && ( + + {notification.message} + + )} + + + {texts.siste} + + {`${lastVurderingText(data)}`} + + + + ); +}; diff --git a/src/sider/manglendemedvirkning/ManglendeMedvirkningStartetVurdering.tsx b/src/sider/manglendemedvirkning/ManglendeMedvirkningStartetVurdering.tsx new file mode 100644 index 000000000..dc8b25216 --- /dev/null +++ b/src/sider/manglendemedvirkning/ManglendeMedvirkningStartetVurdering.tsx @@ -0,0 +1,23 @@ +import React, { ReactElement } from "react"; +import { + VurderingResponseDTO, + VurderingType, +} from "@/data/manglendemedvirkning/manglendeMedvirkningTypes"; +import ForhandsvarselSendt from "@/sider/manglendemedvirkning/forhandsvarsel/ForhandsvarselSendt"; +import ForhandsvarselSkjema from "@/sider/manglendemedvirkning/forhandsvarsel/ForhandsvarselSkjema"; + +interface ManglendeMedvirkningStartetVurderingProps { + sisteVurdering: VurderingResponseDTO | undefined; +} + +export const ManglendeMedvirkningStartetVurdering = ({ + sisteVurdering, +}: ManglendeMedvirkningStartetVurderingProps): ReactElement => { + const isForhandsvarsel = + sisteVurdering?.vurderingType === VurderingType.FORHANDSVARSEL; + return isForhandsvarsel ? ( + + ) : ( + + ); +}; diff --git a/test/manglendemedvirkning/ForhandsvarselTest.tsx b/test/manglendemedvirkning/ForhandsvarselTest.tsx new file mode 100644 index 000000000..ec81d22be --- /dev/null +++ b/test/manglendemedvirkning/ForhandsvarselTest.tsx @@ -0,0 +1,83 @@ +import { beforeEach, describe, expect, it } from "vitest"; +import { manglendeMedvirkningPath } from "@/routers/AppRouter"; +import { screen, waitFor } from "@testing-library/react"; +import { changeTextInput, clickButton, getTextInput } from "../testUtils"; +import { addDays } from "@/utils/datoUtils"; +import { + NewForhandsvarselVurderingRequestDTO, + VurderingType, +} from "@/data/manglendemedvirkning/manglendeMedvirkningTypes"; +import { ARBEIDSTAKER_DEFAULT } from "../../mock/common/mockConstants"; +import { getSendForhandsvarselDocument } from "./vurderingDocuments"; +import React from "react"; +import { renderWithRouter } from "../testRouterUtils"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { ValgtEnhetContext } from "@/context/ValgtEnhetContext"; +import { navEnhet } from "../dialogmote/testData"; +import { NotificationProvider } from "@/context/notification/NotificationContext"; +import ForhandsvarselSkjema from "@/sider/manglendemedvirkning/forhandsvarsel/ForhandsvarselSkjema"; +import { queryClientWithMockData } from "../testQueryClient"; + +let queryClient: QueryClient; + +const renderForhandsvarselSkjema = () => { + return renderWithRouter( + + void 0 }} + > + + + + + , + manglendeMedvirkningPath, + [manglendeMedvirkningPath] + ); +}; + +describe("Manglendemedvirkning Forhandsvarsel", () => { + beforeEach(() => { + queryClient = queryClientWithMockData(); + }); + + it("viser feil når man sender forhåndsvarsel uten å ha skrevet begrunnelse", async () => { + renderForhandsvarselSkjema(); + + await clickButton("Send"); + + expect(await screen.findByText("Vennligst angi begrunnelse")).to.exist; + }); + + it("skal sende forhandsvarsel med riktige verdier", async () => { + renderForhandsvarselSkjema(); + + const varselSvarfrist = addDays(new Date(), 1); + const begrunnelse = "En begrunnelse"; + + const begrunnelseInput = getTextInput("Begrunnelse (obligatorisk)"); + changeTextInput(begrunnelseInput, begrunnelse); + + await clickButton("Send"); + + const expectedRequestBody: NewForhandsvarselVurderingRequestDTO = { + personident: ARBEIDSTAKER_DEFAULT.personIdent, + vurderingType: VurderingType.FORHANDSVARSEL, + begrunnelse: begrunnelse, + document: getSendForhandsvarselDocument(begrunnelse, varselSvarfrist), + varselSvarfrist: varselSvarfrist, + }; + + await waitFor(() => { + const vurderingMutation = queryClient.getMutationCache().getAll().pop(); + + // Ikke deep.equal fordi varselSvarfrist blir ulik på millisekund-nivå + expect(vurderingMutation?.state.variables).to.deep.include({ + personident: expectedRequestBody.personident, + vurderingType: expectedRequestBody.vurderingType, + begrunnelse: expectedRequestBody.begrunnelse, + document: expectedRequestBody.document, + }); + }); + }); +}); diff --git a/test/manglendemedvirkning/ManglendeMedvirkningTest.tsx b/test/manglendemedvirkning/ManglendeMedvirkningTest.tsx index df57d211f..eb7139574 100644 --- a/test/manglendemedvirkning/ManglendeMedvirkningTest.tsx +++ b/test/manglendemedvirkning/ManglendeMedvirkningTest.tsx @@ -3,13 +3,11 @@ import { ARBEIDSTAKER_DEFAULT } from "../../mock/common/mockConstants"; import { beforeEach, describe, expect, it } from "vitest"; import { queryClientWithMockData } from "../testQueryClient"; import { manglendeMedvirkningQueryKeys } from "@/data/manglendemedvirkning/manglendeMedvirkningQueryHooks"; -import { screen, waitFor } from "@testing-library/react"; +import { screen } from "@testing-library/react"; import { ValgtEnhetContext } from "@/context/ValgtEnhetContext"; import { navEnhet } from "../dialogmote/testData"; -import React, { ReactNode } from "react"; -import { changeTextInput, clickButton, getTextInput } from "../testUtils"; +import React from "react"; import { - NewForhandsvarselVurderingRequestDTO, VurderingResponseDTO, VurderingType, } from "@/data/manglendemedvirkning/manglendeMedvirkningTypes"; @@ -21,48 +19,105 @@ import { import { NotificationProvider } from "@/context/notification/NotificationContext"; import { renderWithRouter } from "../testRouterUtils"; import { manglendeMedvirkningPath } from "@/routers/AppRouter"; -import { getSendForhandsvarselDocument } from "./vurderingDocuments"; import ManglendeMedvirkning from "@/sider/manglendemedvirkning/ManglendeMedvirkning"; import { generateUUID } from "@/utils/uuidUtils"; -import { defaultForhandsvarselVurdering } from "./manglendeMedvirkningTestData"; +import { + createManglendeMedvirkningVurdering, + defaultForhandsvarselVurdering, +} from "./manglendeMedvirkningTestData"; +import { clickButton, getButton } from "../testUtils"; let queryClient: QueryClient; -const renderManglendeMedvirkning = (children: ReactNode, path: string) => { +const renderManglendeMedvirkning = () => { return renderWithRouter( void 0 }} > - {children} + + + , - path, - [path] + manglendeMedvirkningPath, + [manglendeMedvirkningPath] ); }; -function mockVurdering(vurdering?: VurderingResponseDTO) { +function mockVurdering(vurderinger: VurderingResponseDTO[] = []) { queryClient.setQueryData( manglendeMedvirkningQueryKeys.manglendeMedvirkning( ARBEIDSTAKER_DEFAULT.personIdent ), - () => (vurdering ? [vurdering] : []) + () => vurderinger ); } describe("Manglendemedvirkning", () => { + const nyVurderingButtonText = "Start ny vurdering"; + beforeEach(() => { queryClient = queryClientWithMockData(); }); + describe("Ny vurdering", () => { + it("viser ny vurdering-knapp når ingen tidligere vurderinger", () => { + mockVurdering([]); + renderManglendeMedvirkning(); - describe("ForhandsvarselSkjema", () => { - it("skal vise forhandsvarsel side når ingen tidligere vurderinger", () => { - mockVurdering(); - renderManglendeMedvirkning( - , - manglendeMedvirkningPath + expect(screen.getByText("Siste vurdering")).to.exist; + expect(getButton(nyVurderingButtonText)).to.exist; + }); + it("viser ny vurdering-knapp når forrige vurdering OPPFYLT", () => { + const oppfyltVurdering = createManglendeMedvirkningVurdering( + VurderingType.OPPFYLT ); + mockVurdering([oppfyltVurdering, defaultForhandsvarselVurdering]); + renderManglendeMedvirkning(); + + expect(screen.getByText("Siste vurdering")).to.exist; + expect(screen.getByText(/oppfylt/)).to.exist; + expect(getButton(nyVurderingButtonText)).to.exist; + }); + it("viser ny vurdering-knapp når forrige vurdering STANS", () => { + const stansVurdering = createManglendeMedvirkningVurdering( + VurderingType.STANS + ); + mockVurdering([stansVurdering, defaultForhandsvarselVurdering]); + renderManglendeMedvirkning(); + + expect(screen.getByText("Siste vurdering")).to.exist; + expect(screen.getByText(/stans/)).to.exist; + expect(getButton(nyVurderingButtonText)).to.exist; + }); + it("viser ny vurdering-knapp når forrige vurdering IKKE AKTUELL", () => { + const ikkeAktuellVurdering = createManglendeMedvirkningVurdering( + VurderingType.IKKE_AKTUELL + ); + mockVurdering([ikkeAktuellVurdering, defaultForhandsvarselVurdering]); + renderManglendeMedvirkning(); + + expect(screen.getByText("Siste vurdering")).to.exist; + expect(screen.getByText(/ikke aktuell/)).to.exist; + expect(getButton(nyVurderingButtonText)).to.exist; + }); + it("viser ny vurdering-knapp når forrige vurdering UNNTAK", () => { + const unntakVurdering = createManglendeMedvirkningVurdering( + VurderingType.UNNTAK + ); + mockVurdering([unntakVurdering]); + renderManglendeMedvirkning(); + + expect(screen.getByText("Siste vurdering")).to.exist; + expect(screen.getByText(/unntak/)).to.exist; + expect(getButton(nyVurderingButtonText)).to.exist; + }); + + it("viser forhandsvarsel-skjema etter klikk på ny vurdering-knapp uten tidligere vurderinger", async () => { + mockVurdering(); + renderManglendeMedvirkning(); + + await clickButton(nyVurderingButtonText); expect(screen.getByText("Send forhåndsvarsel")).to.exist; expect( @@ -74,62 +129,37 @@ describe("Manglendemedvirkning", () => { expect(screen.getByRole("button", { name: "Forhåndsvisning" })).to.exist; }); - it("viser feil når man sender forhåndsvarsel uten å ha skrevet begrunnelse", async () => { - mockVurdering(); - renderManglendeMedvirkning( - , - manglendeMedvirkningPath - ); - - await clickButton("Send"); - - expect(await screen.findByText("Vennligst angi begrunnelse")).to.exist; - }); - - it("skal sende forhandsvarsel med riktige verdier", async () => { - mockVurdering(); - renderManglendeMedvirkning( - , - manglendeMedvirkningPath + it("viser forhandsvarsel-skjema etter klikk på ny vurdering-knapp når forrige vurdering OPPFYLT", async () => { + const oppfyltVurdering = createManglendeMedvirkningVurdering( + VurderingType.OPPFYLT ); - const varselSvarfrist = addDays(new Date(), 1); - const begrunnelse = "En begrunnelse"; - - const begrunnelseInput = getTextInput("Begrunnelse (obligatorisk)"); - changeTextInput(begrunnelseInput, begrunnelse); + mockVurdering([oppfyltVurdering, defaultForhandsvarselVurdering]); + renderManglendeMedvirkning(); - await clickButton("Send"); + await clickButton(nyVurderingButtonText); - const expectedRequestBody: NewForhandsvarselVurderingRequestDTO = { - personident: ARBEIDSTAKER_DEFAULT.personIdent, - vurderingType: VurderingType.FORHANDSVARSEL, - begrunnelse: begrunnelse, - document: getSendForhandsvarselDocument(begrunnelse, varselSvarfrist), - varselSvarfrist: varselSvarfrist, - }; - - await waitFor(() => { - const vurderingMutation = queryClient.getMutationCache().getAll().pop(); - - // Ikke deep.equal fordi varselSvarfrist blir ulik på millisekund-nivå - expect(vurderingMutation?.state.variables).to.deep.include({ - personident: expectedRequestBody.personident, - vurderingType: expectedRequestBody.vurderingType, - begrunnelse: expectedRequestBody.begrunnelse, - document: expectedRequestBody.document, - }); - }); + expect(screen.getByText("Send forhåndsvarsel")).to.exist; + expect( + screen.getByRole("textbox", { + name: "Begrunnelse (obligatorisk)", + }) + ).to.exist; + expect(screen.getByRole("button", { name: "Send" })).to.exist; + expect(screen.getByRole("button", { name: "Forhåndsvisning" })).to.exist; }); }); describe("ForhandsvarselSendt", () => { - it("viser ForhandsvarselBeforeDeadline når svarfrist ikke utgått", () => { - mockVurdering(defaultForhandsvarselVurdering); + it("viser ikke ny vurdering-knapp når forhåndsvarsel sendt", () => { + mockVurdering([defaultForhandsvarselVurdering]); + renderManglendeMedvirkning(); - renderManglendeMedvirkning( - , - manglendeMedvirkningPath - ); + expect(screen.queryByRole("button", { name: nyVurderingButtonText })).to + .not.exist; + }); + it("viser ForhandsvarselBeforeDeadline når svarfrist ikke utgått", () => { + mockVurdering([defaultForhandsvarselVurdering]); + renderManglendeMedvirkning(); expect( screen.getByText( @@ -172,12 +202,8 @@ describe("Manglendemedvirkning", () => { svarfrist: svarfrist, }, }; - mockVurdering(forhandsvarselAfterFrist); - - renderManglendeMedvirkning( - , - manglendeMedvirkningPath - ); + mockVurdering([forhandsvarselAfterFrist]); + renderManglendeMedvirkning(); expect(screen.getByText("Fristen er gått ut")).to.exist; expect(screen.getByText("Fristen var:")).to.exist; diff --git a/test/manglendemedvirkning/manglendeMedvirkningTestData.ts b/test/manglendemedvirkning/manglendeMedvirkningTestData.ts index e547887cf..b58cbc6a2 100644 --- a/test/manglendemedvirkning/manglendeMedvirkningTestData.ts +++ b/test/manglendemedvirkning/manglendeMedvirkningTestData.ts @@ -39,3 +39,16 @@ export const defaultForhandsvarselVurderingAfterDeadline: VurderingResponseDTO = svarfrist: addDays(new Date(), -1), }, }; + +export const createManglendeMedvirkningVurdering = ( + type: VurderingType +): VurderingResponseDTO => ({ + personident: ARBEIDSTAKER_DEFAULT.personIdent, + createdAt: new Date(), + vurderingType: type, + begrunnelse: "", + document: [], + uuid: generateUUID(), + varsel: null, + veilederident: VEILEDER_DEFAULT.ident, +});