Skip to content

Commit b471a2d

Browse files
committed
IS-3017: Tydeliggjøre søket
1 parent 3d4c1d5 commit b471a2d

File tree

2 files changed

+122
-44
lines changed

2 files changed

+122
-44
lines changed

src/sider/sokperson/SokPerson.tsx

+95-32
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import React, { useState } from 'react';
22
import {
33
Alert,
4-
BodyShort,
4+
BodyLong,
55
Box,
66
Button,
77
ErrorMessage,
88
Heading,
9-
HStack,
9+
HelpText,
10+
Label,
1011
TextField,
1112
VStack,
1213
} from '@navikt/ds-react';
@@ -20,10 +21,39 @@ import * as Amplitude from '@/utils/amplitude';
2021

2122
const texts = {
2223
header: 'Søk etter sykmeldt',
23-
info:
24-
'Her kan du søke opp sykmeldte personer basert på initialer og fødselsdato.',
24+
info: 'Her kan du søke for å finne brukere med aktivt sykefravær.',
25+
label: {
26+
initials: 'Initialer (valgfri)',
27+
birthdate: 'Fødselsdato (obligatorisk)',
28+
},
29+
helpText: {
30+
info: {
31+
title: 'Hvordan søke etter sykmeldt?',
32+
p1:
33+
'Fyll inn fødselsdato for å finne en sykmeldt du har tilgang til, vedkommende må ha et aktivt sykefravær. ',
34+
p2:
35+
'Ønsker man et mer nøyaktig søk kan man legge til initialer til den sykmeldte, men dette er valgfritt. Det er ikke mulig å søke på initialer uten å skrive inn fødselsdato. Dette er for å minimere risiko for feil søkeresultat, og at du finner akkurat den personen du er på leting etter.',
36+
},
37+
initials: {
38+
title: 'Hvordan fyller jeg inn initialer?',
39+
text:
40+
'Her kan du fylle inn initialene til den du vil søke opp. Feltet krever forbokstaven for fornavn og etternavn. Det er mulig å legge til forbokstavene for mellomnavn for mer nøyaktig søkeresultat. ',
41+
},
42+
birthdate: {
43+
title: 'Hvordan fyller jeg inn fødselsdato?',
44+
text: (
45+
<>
46+
Her kan du fylle inn fødselsdato til den du vil søke opp. For å kunne
47+
søke må sifrene fylles inn på formatet:
48+
<strong> dag måned år</strong>, i den rekkefølgen. Ønsker man et mer
49+
nøyaktig søk kan man legge til initialer til den sykmeldte i initial
50+
feltet.
51+
</>
52+
),
53+
},
54+
},
2555
validation: {
26-
initials: 'Vennligst angi gyldige initialer',
56+
initials: 'Vennligst angi to til fire initialer',
2757
birthdate: 'Vennligst angi en gyldig fødselsdato',
2858
},
2959
error: 'Noe gikk galt under søket. Vennligst prøv igjen.',
@@ -55,6 +85,30 @@ function logSokPersonResults(amount: number, requestDTO: SokDTO) {
5585
});
5686
}
5787

88+
function InitialerLabel() {
89+
return (
90+
<div className="flex gap-2">
91+
{texts.label.initials}
92+
<HelpText title={texts.helpText.initials.title}>
93+
<Label>{texts.helpText.initials.title}</Label>
94+
<BodyLong>{texts.helpText.initials.text}</BodyLong>
95+
</HelpText>
96+
</div>
97+
);
98+
}
99+
100+
function FodselsdatoLabel() {
101+
return (
102+
<div className="flex gap-2">
103+
{texts.label.birthdate}
104+
<HelpText title={texts.helpText.birthdate.title}>
105+
<Label>{texts.helpText.birthdate.title}</Label>
106+
<BodyLong>{texts.helpText.birthdate.text}</BodyLong>
107+
</HelpText>
108+
</div>
109+
);
110+
}
111+
58112
export default function SokPerson() {
59113
const [initials, setInitials] = useState<string>('');
60114
const [birthdate, setBirthdate] = useState<string>('');
@@ -78,14 +132,15 @@ export default function SokPerson() {
78132
};
79133

80134
const isValidInitials = (initials: string): boolean => {
81-
return initials === '' || (initials.length <= 3 && initials.length > 1);
135+
return initials === '' || (initials.length <= 4 && initials.length > 1);
82136
};
83137

84138
const handleSubmit = () => {
85139
const parsedBirthdate = parseBirthdate(birthdate);
140+
const parsedInitials = removePunctuation(initials);
86141
if (isValidInitials(initials) && !!parsedBirthdate) {
87142
const requestDTO: SokDTO = {
88-
initials: initials.toLowerCase(),
143+
initials: parsedInitials.toLowerCase(),
89144
birthdate: parsedBirthdate,
90145
};
91146
mutate(requestDTO, {
@@ -109,46 +164,54 @@ export default function SokPerson() {
109164
handleSubmit();
110165
}}
111166
>
112-
<Heading level="2" size="medium">
113-
{texts.header}
114-
</Heading>
167+
<div className="flex gap-2 items-center">
168+
<Heading level="2" size="medium">
169+
{texts.header}
170+
</Heading>
171+
<HelpText title={texts.helpText.info.title}>
172+
<Label>{texts.helpText.info.title}</Label>
173+
<BodyLong>{texts.helpText.info.p1}</BodyLong>
174+
<BodyLong className="pt-2">{texts.helpText.info.p2}</BodyLong>
175+
</HelpText>
176+
</div>
115177
<VStack gap="4">
116-
<BodyShort>{texts.info}</BodyShort>
117-
<HStack gap="8" align="end">
178+
<BodyLong>{texts.info}</BodyLong>
179+
<div className="grid grid-cols-[auto,auto,auto] gap-x-8 gap-y-2 align-end max-w-max">
118180
<TextField
119-
label="Initialer"
120-
description="AB"
181+
label={<FodselsdatoLabel />}
182+
description="ddmmåå"
121183
htmlSize={10}
122184
type="text"
123-
onChange={(e) => setInitials(e.target.value)}
124-
error={isFormError && !isValidInitials(initials)}
185+
onChange={(e) => setBirthdate(e.target.value)}
186+
error={isInvalidBirthdate}
125187
/>
126188
<TextField
127-
label="Fødselsdato"
128-
description="ddmmåå"
129-
htmlSize={14}
189+
label={<InitialerLabel />}
190+
description="Eks: Oline Nordmann blir ON"
191+
htmlSize={6}
130192
type="text"
131-
onChange={(e) => setBirthdate(e.target.value)}
132-
error={isInvalidBirthdate}
193+
onChange={(e) => setInitials(e.target.value)}
194+
error={isFormError && !isValidInitials(initials)}
133195
/>
134196
<Button
135197
loading={isLoading}
136198
icon={<MagnifyingGlassIcon />}
137199
type="submit"
200+
className="self-end max-w-max"
138201
>
139202
Søk
140203
</Button>
141-
</HStack>
142-
{isInvalidInitials && (
143-
<ErrorMessage size="small">
144-
{texts.validation.initials}
145-
</ErrorMessage>
146-
)}
147-
{isInvalidBirthdate && (
148-
<ErrorMessage size="small">
149-
{texts.validation.birthdate}
150-
</ErrorMessage>
151-
)}
204+
{isInvalidBirthdate && (
205+
<ErrorMessage size="small">
206+
{texts.validation.birthdate}
207+
</ErrorMessage>
208+
)}
209+
{isInvalidInitials && (
210+
<ErrorMessage size="small" className="col-start-2 col-end-4">
211+
{texts.validation.initials}
212+
</ErrorMessage>
213+
)}
214+
</div>
152215
{isError && (
153216
<Alert variant="error" size="small">
154217
{texts.error}

test/components/SokPersonTest.tsx

+27-12
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,21 @@ describe('SokPerson', () => {
3838
.exist;
3939
expect(
4040
screen.getByText(
41-
'Her kan du søke opp sykmeldte personer basert på initialer og fødselsdato.'
41+
'Her kan du søke for å finne brukere med aktivt sykefravær.'
4242
)
4343
).to.exist;
44-
expect(screen.getByRole('textbox', { name: 'Initialer' })).to.exist;
45-
expect(screen.getByRole('textbox', { name: 'Fødselsdato' })).to.exist;
44+
expect(
45+
screen.getByRole('textbox', {
46+
name:
47+
'Initialer (valgfri) Hvordan fyller jeg inn initialer? Hvordan fyller jeg inn initialer?',
48+
})
49+
).to.exist;
50+
expect(
51+
screen.getByRole('textbox', {
52+
name:
53+
'Fødselsdato (obligatorisk) Hvordan fyller jeg inn fødselsdato? Hvordan fyller jeg inn fødselsdato?',
54+
})
55+
).to.exist;
4656
expect(screen.getByRole('button', { name: 'Søk' })).to.exist;
4757
});
4858

@@ -52,23 +62,26 @@ describe('SokPerson', () => {
5262
await userEvent.click(screen.getByRole('button', { name: 'Søk' }));
5363

5464
expect(screen.getByText('Vennligst angi en gyldig fødselsdato')).to.exist;
55-
expect(screen.queryByText('Vennligst angi gyldige initialer')).to.not.exist;
65+
expect(screen.queryByText('Vennligst angi to til fire initialer')).to.not
66+
.exist;
5667
});
5768
it('should render validation error for initialer when blank and too many characters', async () => {
5869
renderSokPerson();
5970

60-
const initialsInput = screen.getByRole('textbox', { name: 'Initialer' });
71+
const initialsInput = screen.getByRole('textbox', { name: /^Initialer/ });
6172
fireEvent.change(initialsInput, { target: { value: ' ' } });
6273
await userEvent.click(screen.getByRole('button', { name: 'Søk' }));
63-
expect(screen.getByText('Vennligst angi gyldige initialer')).to.exist;
64-
fireEvent.change(initialsInput, { target: { value: 'ABCD' } });
65-
expect(screen.getByText('Vennligst angi gyldige initialer')).to.exist;
74+
expect(screen.getByText('Vennligst angi to til fire initialer')).to.exist;
75+
fireEvent.change(initialsInput, { target: { value: 'ABCDE' } });
76+
expect(screen.getByText('Vennligst angi to til fire initialer')).to.exist;
6677
});
6778
it('should send correct parameters', async () => {
6879
renderSokPerson();
6980

70-
const initialsInput = screen.getByRole('textbox', { name: 'Initialer' });
71-
const birthdateInput = screen.getByRole('textbox', { name: 'Fødselsdato' });
81+
const initialsInput = screen.getByRole('textbox', { name: /^Initialer/ });
82+
const birthdateInput = screen.getByRole('textbox', {
83+
name: /^Fødselsdato/,
84+
});
7285

7386
const initialsValue = 'kk';
7487
const birthdateValue = '101010';
@@ -104,8 +117,10 @@ describe('SokPerson', () => {
104117
it('should show correct results', async () => {
105118
renderSokPerson();
106119

107-
const initialsInput = screen.getByRole('textbox', { name: 'Initialer' });
108-
const birthdateInput = screen.getByRole('textbox', { name: 'Fødselsdato' });
120+
const initialsInput = screen.getByRole('textbox', { name: /^Initialer/ });
121+
const birthdateInput = screen.getByRole('textbox', {
122+
name: /^Fødselsdato/,
123+
});
109124

110125
const initialsValue = 'kh';
111126
const birthdateValue = '101010';

0 commit comments

Comments
 (0)