Skip to content

Commit ee50179

Browse files
authored
Flexjar (#1407)
Add Flexjar
1 parent 7760ea5 commit ee50179

18 files changed

+704
-0
lines changed

nais/nais-dev.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ spec:
6666
value: "false"
6767
- name: RUNTIME_ENVIRONMENT
6868
value: dev
69+
- name: FLEXJAR_HOST
70+
value: "http://flexjar-backend.flex"
71+
- name: FLEXJAR_BACKEND_CLIENT_ID
72+
value: dev-gcp:flex:flexjar-backend
6973
accessPolicy:
7074
outbound:
7175
rules:
@@ -75,5 +79,7 @@ spec:
7579
namespace: personbruker
7680
- application: oppfolgingsplan-backend
7781
- application: dinesykmeldte-backend
82+
- application: flexjar-backend
83+
namespace: flex
7884
external:
7985
- host: syfooppfolgingsplanservice.dev-fss-pub.nais.io

nais/nais-prod.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ spec:
6666
value: "false"
6767
- name: RUNTIME_ENVIRONMENT
6868
value: prod
69+
- name: FLEXJAR_HOST
70+
value: "http://flexjar-backend.flex"
71+
- name: FLEXJAR_BACKEND_CLIENT_ID
72+
value: prod-gcp:flex:flexjar-backend
6973
accessPolicy:
7074
outbound:
7175
rules:
@@ -75,6 +79,8 @@ spec:
7579
namespace: personbruker
7680
- application: oppfolgingsplan-backend
7781
- application: dinesykmeldte-backend
82+
- application: flexjar-backend
83+
namespace: flex
7884
external:
7985
- host: www.nav.no
8086
- host: syfooppfolgingsplanservice.prod-fss-pub.nais.io

package-lock.json

+49
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
"@navikt/ds-react": "^5.18.3",
3030
"@navikt/nav-dekoratoren-moduler": "^3.1.3",
3131
"@navikt/next-logger": "^1.35.0",
32+
"@navikt/oasis": "^3.7.0",
3233
"@tanstack/react-query": "^5.62.2",
3334
"@tanstack/react-query-devtools": "^5.62.2",
3435
"@types/http-errors": "^2.0.4",

src/components/blocks/wrappers/ArbeidsgiverSide.tsx

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { PageContainer } from "@navikt/dinesykmeldte-sidemeny";
66
import { Sykmeldt } from "../../../schema/sykmeldtSchema";
77
import { addSpaceAfterEverySixthCharacter } from "../../../utils/stringUtils";
88
import { PersonIcon } from "@navikt/aksel-icons";
9+
import { FlexJarModal } from "../../flexjar/FlexJarModal";
910

1011
const getSykmeldtHeader = (sykmeldt?: Sykmeldt) => {
1112
if (sykmeldt?.navn && sykmeldt.fnr) {
@@ -36,12 +37,14 @@ interface SideProps {
3637
title: string;
3738
heading: string;
3839
children: ReactNode;
40+
displayFlexjar?: boolean;
3941
}
4042

4143
const ArbeidsgiverSide = ({
4244
title,
4345
heading,
4446
children,
47+
displayFlexjar = false,
4548
}: SideProps): ReactElement => {
4649
const sykmeldt = useDineSykmeldte();
4750

@@ -52,6 +55,7 @@ const ArbeidsgiverSide = ({
5255
navigation={<ArbeidsgiverSideMenu sykmeldt={sykmeldt.data} />}
5356
>
5457
<>
58+
{displayFlexjar && <FlexJarModal />}
5559
<PageHeading title={title} heading={heading} />
5660
{children}
5761
</>
+147
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
import React, { useRef } from "react";
2+
import { MagnifyingGlassIcon } from "@navikt/aksel-icons";
3+
import {
4+
Alert,
5+
BodyLong,
6+
Button,
7+
GuidePanel,
8+
HStack,
9+
Modal,
10+
Textarea,
11+
} from "@navikt/ds-react";
12+
import { TakkForTilbakemeldingen } from "./TakkForTilbakemeldingen";
13+
import { SubmitHandler, useForm } from "react-hook-form";
14+
import { useOpprettFlexjarFeedback } from "./queryhooks/useOpprettFlexjarFeedback";
15+
import { OpprettFeedbackData } from "../../pages/api/flexjar";
16+
import { EmoQuestion } from "./emoji/EmoQuestion";
17+
18+
export type FlexjarFormValues = {
19+
endretFraDagensOppfolgingsplan: string;
20+
hvordanFolgeOppSykmeldte: string;
21+
};
22+
23+
export const FlexJarModal = () => {
24+
const ref = useRef<HTMLDialogElement>(null);
25+
const {
26+
register,
27+
handleSubmit,
28+
formState: { errors, isSubmitSuccessful },
29+
} = useForm<FlexjarFormValues>();
30+
const [activeRating, setActiveRating] = React.useState<number | null>(null);
31+
const sendFeedbackMutation = useOpprettFlexjarFeedback();
32+
33+
const onSubmit: SubmitHandler<FlexjarFormValues> = (data) => {
34+
const feedbackData: OpprettFeedbackData = {
35+
feedback: data.endretFraDagensOppfolgingsplan,
36+
svar: activeRating!,
37+
hvordanFolgeOppSykmeldte: data.hvordanFolgeOppSykmeldte,
38+
feedbackId: "oppfolgingsplan-arbeidsgiver",
39+
};
40+
sendFeedbackMutation.mutate(feedbackData);
41+
};
42+
43+
return (
44+
<>
45+
<GuidePanel className="mb-8">
46+
<HStack gap="4">
47+
<BodyLong>
48+
Hei! Vi jobber med en ny og forbedret oppfølgingsplan i 2025. Vi
49+
ønsker å lære av deg, for å forstå hva dine behov er. Har du to
50+
minutter?
51+
</BodyLong>
52+
<Button onClick={() => ref.current?.showModal()}>
53+
Åpne spørreskjema
54+
</Button>
55+
</HStack>
56+
</GuidePanel>
57+
58+
<Modal
59+
ref={ref}
60+
header={{
61+
icon: <MagnifyingGlassIcon aria-hidden={true} />,
62+
heading: "Innspill til utvikling av ny oppfølgingsplan",
63+
}}
64+
>
65+
<Modal.Body>
66+
<section>
67+
{!isSubmitSuccessful && (
68+
<form
69+
id="flexjar-skjema"
70+
onSubmit={handleSubmit(onSubmit)}
71+
className="w-full"
72+
>
73+
<div>
74+
<BodyLong>
75+
Svarene du sender inn er anonyme, og blir sendt til
76+
utviklingsteamet i Nav som har ansvaret for
77+
oppfølgingsplanen.
78+
</BodyLong>
79+
80+
<div className="py-4">
81+
<div className="mt-6 w-full space-y-6">
82+
<EmoQuestion
83+
question="Hvordan opplever du dagens oppfølgingsplan?"
84+
activeState={activeRating}
85+
setActiveState={setActiveRating}
86+
/>
87+
88+
{activeRating != null && (
89+
<>
90+
<Textarea
91+
{...register("endretFraDagensOppfolgingsplan", {
92+
required:
93+
"Tilbakemeldingen kan ikke være tom. Legg til tekst i feltet.",
94+
})}
95+
label="Hvis du kunne endre på noe i dagens oppfølgingsplan, hva ville det vært?"
96+
error={
97+
errors.endretFraDagensOppfolgingsplan?.message
98+
}
99+
maxLength={1000}
100+
minRows={2}
101+
/>
102+
103+
<Textarea
104+
{...register("hvordanFolgeOppSykmeldte", {
105+
required:
106+
"Tilbakemeldingen kan ikke være tom. Legg til tekst i feltet.",
107+
})}
108+
label="Hva trenger du for at oppfølgingsplanen skal være til hjelp med å følge opp dine sykmeldte?"
109+
error={errors.hvordanFolgeOppSykmeldte?.message}
110+
maxLength={1000}
111+
minRows={2}
112+
/>
113+
114+
<Alert variant="warning" className="mt-4">
115+
Ikke skriv inn navn eller andre personopplysninger.
116+
Dette blir kun brukt til å lage en best mulig ny
117+
oppfølgingsplan.
118+
</Alert>
119+
</>
120+
)}
121+
</div>
122+
</div>
123+
</div>
124+
</form>
125+
)}
126+
{isSubmitSuccessful && <TakkForTilbakemeldingen />}
127+
</section>
128+
</Modal.Body>
129+
130+
<Modal.Footer>
131+
{!isSubmitSuccessful && (
132+
<Button disabled={activeRating == null} form="flexjar-skjema">
133+
Send tilbakemelding
134+
</Button>
135+
)}
136+
<Button
137+
type="button"
138+
variant="secondary"
139+
onClick={() => ref.current?.close()}
140+
>
141+
Lukk
142+
</Button>
143+
</Modal.Footer>
144+
</Modal>
145+
</>
146+
);
147+
};
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { BodyShort, Label } from "@navikt/ds-react";
2+
import React, { ReactElement } from "react";
3+
4+
export const HeadingSection = (): ReactElement => {
5+
return (
6+
<div className="bg-surface-subtle p-6 flex gap-4 items-center">
7+
<div>
8+
<Label as="h3" className="mb-2">
9+
Hjelp oss med å gjøre denne siden bedre
10+
</Label>
11+
<BodyShort>Anonym tilbakemelding på tjenesten</BodyShort>
12+
</div>
13+
</div>
14+
);
15+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import React, { ReactElement } from "react";
2+
import { Heading } from "@navikt/ds-react";
3+
import { FaceSmileIcon } from "@navikt/aksel-icons";
4+
5+
export const TakkForTilbakemeldingen = (): ReactElement => {
6+
return (
7+
<div aria-live="polite">
8+
<div className="mt-2 border-4 border-green-100 rounded-medium bg-green-100 p-6">
9+
<Heading size="small" as="p" className="flex items-center">
10+
Takk for tilbakemeldingen din!{" "}
11+
<FaceSmileIcon
12+
className="ml-2"
13+
aria-label="smilefjes"
14+
></FaceSmileIcon>
15+
</Heading>
16+
</div>
17+
</div>
18+
);
19+
};

0 commit comments

Comments
 (0)