From 3e9c60ddacaf19460c882b303d2b377c5d67bf2e Mon Sep 17 00:00:00 2001 From: Sondre Lefsaker Date: Thu, 10 Oct 2024 12:55:33 +0200 Subject: [PATCH 1/2] returner deltaker-summary for alle statuser --- .../useTiltaksgjennomforingDeltakerSummary.ts | 6 +-- .../modal/AvbrytGjennomforingModal.tsx | 2 +- .../src/components/skjema/InfoContainer.tsx | 10 ++-- .../NokkeltallDeltakere.tsx | 33 ++++++------ .../SelectOppstartstype.tsx | 15 ++---- .../TiltaksgjennomforingDetaljer.tsx | 2 +- .../routes/v1/TiltaksgjennomforingRoutes.kt | 54 +++++-------------- .../src/main/resources/web/openapi.yaml | 28 +++++----- 8 files changed, 55 insertions(+), 95 deletions(-) diff --git a/frontend/mr-admin-flate/src/api/tiltaksgjennomforing/useTiltaksgjennomforingDeltakerSummary.ts b/frontend/mr-admin-flate/src/api/tiltaksgjennomforing/useTiltaksgjennomforingDeltakerSummary.ts index e890e4f950..7842faa20d 100644 --- a/frontend/mr-admin-flate/src/api/tiltaksgjennomforing/useTiltaksgjennomforingDeltakerSummary.ts +++ b/frontend/mr-admin-flate/src/api/tiltaksgjennomforing/useTiltaksgjennomforingDeltakerSummary.ts @@ -1,16 +1,14 @@ -import { useQuery } from "@tanstack/react-query"; +import { useSuspenseQuery } from "@tanstack/react-query"; import { QueryKeys } from "@/api/QueryKeys"; import { TiltaksgjennomforingerService } from "@mr/api-client"; export function useTiltaksgjennomforingDeltakerSummary(id?: string) { - return useQuery({ + return useSuspenseQuery({ queryKey: QueryKeys.tiltaksgjennomforingDeltakerSummary(id!), queryFn() { return TiltaksgjennomforingerService.getTiltaksgjennomforingDeltakerSummary({ id: id!, }); }, - throwOnError: false, - enabled: !!id, }); } diff --git a/frontend/mr-admin-flate/src/components/modal/AvbrytGjennomforingModal.tsx b/frontend/mr-admin-flate/src/components/modal/AvbrytGjennomforingModal.tsx index 83d4463d99..acb56c4c79 100644 --- a/frontend/mr-admin-flate/src/components/modal/AvbrytGjennomforingModal.tsx +++ b/frontend/mr-admin-flate/src/components/modal/AvbrytGjennomforingModal.tsx @@ -127,7 +127,7 @@ export const AvbrytGjennomforingModal = ({ modalRef, tiltaksgjennomforing }: Pro } body={ <> - {deltakerSummary && deltakerSummary.antallDeltakere > 0 && ( + {deltakerSummary.antallDeltakere > 0 && ( {`Det finnes ${deltakerSummary.antallDeltakere} deltaker${deltakerSummary.antallDeltakere > 1 ? "e" : ""} på gjennomføringen. Ved å avbryte denne vil det føre til statusendring på alle deltakere som har en aktiv status.`} diff --git a/frontend/mr-admin-flate/src/components/skjema/InfoContainer.tsx b/frontend/mr-admin-flate/src/components/skjema/InfoContainer.tsx index 358691f15e..7f1a5c0405 100644 --- a/frontend/mr-admin-flate/src/components/skjema/InfoContainer.tsx +++ b/frontend/mr-admin-flate/src/components/skjema/InfoContainer.tsx @@ -1,13 +1,17 @@ import { PropsWithChildren } from "react"; import styles from "./InfoContainer.module.scss"; +import React from "react"; +import { Laster } from "../laster/Laster"; interface Props { dataTestId?: string; } export function InfoContainer({ dataTestId, children }: PropsWithChildren) { return ( -
- {children} -
+ }> +
+ {children} +
+
); } diff --git a/frontend/mr-admin-flate/src/components/tiltaksgjennomforinger/NokkeltallDeltakere.tsx b/frontend/mr-admin-flate/src/components/tiltaksgjennomforinger/NokkeltallDeltakere.tsx index 23028af76a..4819f31a1e 100644 --- a/frontend/mr-admin-flate/src/components/tiltaksgjennomforinger/NokkeltallDeltakere.tsx +++ b/frontend/mr-admin-flate/src/components/tiltaksgjennomforinger/NokkeltallDeltakere.tsx @@ -1,38 +1,35 @@ +import { Toggles } from "@mr/api-client"; import { Heading } from "@navikt/ds-react"; import * as Highcharts from "highcharts"; import HighchartsReact from "highcharts-react-official"; -import { Toggles } from "@mr/api-client"; import { useRef } from "react"; -import { useFeatureToggle } from "../../api/features/useFeatureToggle"; -import { useTiltaksgjennomforingDeltakerSummary } from "../../api/tiltaksgjennomforing/useTiltaksgjennomforingDeltakerSummary"; +import { useFeatureToggle } from "@/api/features/useFeatureToggle"; +import { useTiltaksgjennomforingDeltakerSummary } from "@/api/tiltaksgjennomforing/useTiltaksgjennomforingDeltakerSummary"; import styles from "./NokkeltallDeltakere.module.scss"; interface Props { tiltaksgjennomforingId: string; } -export function NokkeltallDeltakere({ tiltaksgjennomforingId }: Props) { +export function NokkeltallDeltakere(props: Props) { const { data: enableDebug } = useFeatureToggle( Toggles.MULIGHETSROMMET_ADMIN_FLATE_ENABLE_DEBUGGER, ); - const { data: deltakerSummary } = useTiltaksgjennomforingDeltakerSummary(tiltaksgjennomforingId); - const chartComponentRef = useRef(null); - if (!enableDebug) return null; + if (!enableDebug) { + return null; + } - if (!deltakerSummary) return null; + return ; +} - const summaryUtenTotal = { - "Påbegynt registrering": deltakerSummary.pabegyntRegistrering, - "Venter på oppstart": deltakerSummary.antallDeltakereSomVenter, - Deltar: deltakerSummary.antallAktiveDeltakere, - "Har sluttet": deltakerSummary.antallAvsluttedeDeltakere, - "Ikke aktuelle": deltakerSummary.antallIkkeAktuelleDeltakere, - }; +function NokkeltallDeltakereGraph({ tiltaksgjennomforingId }: Props) { + const { data: deltakerSummary } = useTiltaksgjennomforingDeltakerSummary(tiltaksgjennomforingId); + const chartComponentRef = useRef(null); - const dataArray = Object.keys(summaryUtenTotal).map((key) => ({ - name: key, - y: summaryUtenTotal[key as keyof typeof summaryUtenTotal], + const dataArray = deltakerSummary.deltakereByStatus.map(({ status, count }) => ({ + name: status, + y: count, })); const blaafarge = "#66CBEC"; diff --git a/frontend/mr-admin-flate/src/components/tiltaksgjennomforinger/SelectOppstartstype.tsx b/frontend/mr-admin-flate/src/components/tiltaksgjennomforinger/SelectOppstartstype.tsx index ce51c4478e..fdd8cd292f 100644 --- a/frontend/mr-admin-flate/src/components/tiltaksgjennomforinger/SelectOppstartstype.tsx +++ b/frontend/mr-admin-flate/src/components/tiltaksgjennomforinger/SelectOppstartstype.tsx @@ -3,8 +3,7 @@ import { TiltaksgjennomforingOppstartstype } from "@mr/api-client"; import { ControlledSokeSelect } from "@mr/frontend-common"; import { useController } from "react-hook-form"; import { useTiltaksgjennomforingDeltakerSummary } from "@/api/tiltaksgjennomforing/useTiltaksgjennomforingDeltakerSummary"; -import { Laster } from "../laster/Laster"; -import { useGetTiltaksgjennomforingIdFromUrl } from "../../hooks/useGetTiltaksgjennomforingIdFromUrl"; +import { useGetTiltaksgjennomforingIdFromUrl } from "@/hooks/useGetTiltaksgjennomforingIdFromUrl"; interface SelectOppstartstypeProps { name: string; @@ -48,17 +47,9 @@ interface OppstartstypePropsWarning { } function OppstartstypeWarning({ gjennomforingId }: OppstartstypePropsWarning) { - const { - data: summary, - isPending, - isError, - } = useTiltaksgjennomforingDeltakerSummary(gjennomforingId); + const { data: summary } = useTiltaksgjennomforingDeltakerSummary(gjennomforingId); - if (isPending) { - return ; - } - - return isError || summary.antallDeltakere > 0 ? ( + return summary.antallDeltakere > 0 ? ( Deltakerstatus påvirkes av oppstartstypen. Hvis du endrer oppstartstypen så kan deltakelser som er avsluttet få en ny status. Statusen vises i aktivitetsplanen og deltakeroversikten.{" "} diff --git a/frontend/mr-admin-flate/src/pages/tiltaksgjennomforinger/TiltaksgjennomforingDetaljer.tsx b/frontend/mr-admin-flate/src/pages/tiltaksgjennomforinger/TiltaksgjennomforingDetaljer.tsx index b253283c84..26b6d916a5 100644 --- a/frontend/mr-admin-flate/src/pages/tiltaksgjennomforinger/TiltaksgjennomforingDetaljer.tsx +++ b/frontend/mr-admin-flate/src/pages/tiltaksgjennomforinger/TiltaksgjennomforingDetaljer.tsx @@ -25,7 +25,7 @@ import { DetaljerContainer } from "@/pages/DetaljerContainer"; import { DetaljerInfoContainer } from "@/pages/DetaljerInfoContainer"; import { ArrangorKontaktinfoContainer } from "@/pages/arrangor/ArrangorKontaktinfoContainer"; import { isKursTiltak } from "@mr/frontend-common/utils/utils"; -import { ProgramomradeOgUtdanningerDetaljer } from "../../components/utdanning/ProgramomradeOgUtdanningerDetaljer"; +import { ProgramomradeOgUtdanningerDetaljer } from "@/components/utdanning/ProgramomradeOgUtdanningerDetaljer"; interface Props { tiltaksgjennomforing: TiltaksgjennomforingDto; diff --git a/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/routes/v1/TiltaksgjennomforingRoutes.kt b/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/routes/v1/TiltaksgjennomforingRoutes.kt index 2547462810..3d0f452c53 100644 --- a/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/routes/v1/TiltaksgjennomforingRoutes.kt +++ b/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/routes/v1/TiltaksgjennomforingRoutes.kt @@ -23,7 +23,6 @@ import no.nav.mulighetsrommet.api.services.ExcelService import no.nav.mulighetsrommet.api.services.TiltaksgjennomforingService import no.nav.mulighetsrommet.domain.dbo.TiltaksgjennomforingOppstartstype import no.nav.mulighetsrommet.domain.dto.* -import no.nav.mulighetsrommet.domain.dto.amt.AmtDeltakerStatus import no.nav.mulighetsrommet.domain.serializers.AvbruttAarsakSerializer import no.nav.mulighetsrommet.domain.serializers.LocalDateSerializer import no.nav.mulighetsrommet.domain.serializers.UUIDSerializer @@ -174,43 +173,14 @@ fun Route.tiltaksgjennomforingRoutes() { val id: UUID by call.parameters val deltakereForGjennomforing = deltakere.getAll(id) - val groupedDeltakere = deltakereForGjennomforing.groupBy { it.status.type } - // TODO vis en graf per mulige status i stedet + val summary = TiltaksgjennomforingDeltakerSummary( antallDeltakere = deltakereForGjennomforing.size, - antallAktiveDeltakere = groupedDeltakere.count { (key) -> - key == AmtDeltakerStatus.Type.DELTAR - }, - antallDeltakereSomVenter = groupedDeltakere.count { (key) -> - key in listOf( - AmtDeltakerStatus.Type.KLADD, - AmtDeltakerStatus.Type.VENTER_PA_OPPSTART, - AmtDeltakerStatus.Type.SOKT_INN, - AmtDeltakerStatus.Type.VURDERES, - AmtDeltakerStatus.Type.VENTELISTE, - ) - }, - antallAvsluttedeDeltakere = groupedDeltakere.count { (key) -> - key in listOf( - AmtDeltakerStatus.Type.HAR_SLUTTET, - AmtDeltakerStatus.Type.AVBRUTT, - AmtDeltakerStatus.Type.FULLFORT, - ) - }, - antallIkkeAktuelleDeltakere = groupedDeltakere.count { (key) -> - key in listOf( - AmtDeltakerStatus.Type.IKKE_AKTUELL, - AmtDeltakerStatus.Type.FEILREGISTRERT, - AmtDeltakerStatus.Type.AVBRUTT_UTKAST, - - ) - }, - pabegyntRegistrering = groupedDeltakere.count { (key) -> - key in listOf( - AmtDeltakerStatus.Type.PABEGYNT_REGISTRERING, - AmtDeltakerStatus.Type.UTKAST_TIL_PAMELDING, - ) - }, + deltakereByStatus = deltakereForGjennomforing + .groupBy { it.status.type } + .map { (status, deltakere) -> + DeltakerStatusSummary(status = status.name, count = deltakere.size) + }, ) call.respond(summary) @@ -258,11 +228,13 @@ fun PipelineContext.getAdminTiltaksgjennomforingsF @Serializable data class TiltaksgjennomforingDeltakerSummary( val antallDeltakere: Int, - val antallAktiveDeltakere: Int, - val antallDeltakereSomVenter: Int, - val antallAvsluttedeDeltakere: Int, - val antallIkkeAktuelleDeltakere: Int, - val pabegyntRegistrering: Int, + val deltakereByStatus: List, +) + +@Serializable +data class DeltakerStatusSummary( + val status: String, + val count: Int, ) @Serializable diff --git a/mulighetsrommet-api/src/main/resources/web/openapi.yaml b/mulighetsrommet-api/src/main/resources/web/openapi.yaml index 20dce68289..54d18d4280 100644 --- a/mulighetsrommet-api/src/main/resources/web/openapi.yaml +++ b/mulighetsrommet-api/src/main/resources/web/openapi.yaml @@ -3921,23 +3921,21 @@ components: properties: antallDeltakere: type: number - antallAktiveDeltakere: - type: number - antallDeltakereSomVenter: - type: number - antallAvsluttedeDeltakere: - type: number - antallIkkeAktuelleDeltakere: - type: number - pabegyntRegistrering: - type: number + deltakereByStatus: + type: array + items: + type: object + properties: + status: + type: string + count: + type: integer + required: + - status + - count required: - antallDeltakere - - antallAktiveDeltakere - - antallDeltakereSomVenter - - antallAvsluttedeDeltakere - - antallIkkeAktuelleDeltakere - - pabegyntRegistrering + - deltakereByStatus TiltaksgjennomforingKontaktperson: type: object From d067f8e5de2b4f5c4f32543f0ced093f0f16a128 Mon Sep 17 00:00:00 2001 From: Sondre Lefsaker Date: Thu, 10 Oct 2024 14:04:49 +0200 Subject: [PATCH 2/2] fix mocks --- .../mocks/endpoints/tiltaksgjennomforingHandlers.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/frontend/mr-admin-flate/src/mocks/endpoints/tiltaksgjennomforingHandlers.ts b/frontend/mr-admin-flate/src/mocks/endpoints/tiltaksgjennomforingHandlers.ts index 3b1bebd717..66624e8d4e 100644 --- a/frontend/mr-admin-flate/src/mocks/endpoints/tiltaksgjennomforingHandlers.ts +++ b/frontend/mr-admin-flate/src/mocks/endpoints/tiltaksgjennomforingHandlers.ts @@ -138,12 +138,14 @@ export const tiltaksgjennomforingHandlers = [ "*/api/v1/intern/tiltaksgjennomforinger/:id/deltaker-summary", () => { const deltakerSummary: TiltaksgjennomforingDeltakerSummary = { - antallAktiveDeltakere: 15, - antallAvsluttedeDeltakere: 3, - antallDeltakereSomVenter: 10, - antallIkkeAktuelleDeltakere: 2, - pabegyntRegistrering: 6, antallDeltakere: 36, + deltakereByStatus: [ + { status: "Deltar", count: 15 }, + { status: "Avsluttet", count: 3 }, + { status: "Venter", count: 10 }, + { status: "Ikke aktuell", count: 2 }, + { status: "Påbegynt registrering", count: 6 }, + ], }; return HttpResponse.json(deltakerSummary); },