Skip to content

Commit df05fb0

Browse files
authored
Merge pull request #3917 from navikt/feature/lagre-siste-soek
Feature/lagre siste soek
2 parents ebf1a76 + 333c8e7 commit df05fb0

31 files changed

+1039
-259
lines changed

apps/dolly-frontend/src/main/js/__tests__/KodeverkSelect.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ dollyTest(
1313

1414
expect(screen.getByText('Tester kodeverk')).toBeInTheDocument()
1515

16-
expect(screen.getByText('Henter verdier ...')).toBeInTheDocument()
16+
expect(screen.getByText('Laster ...')).toBeInTheDocument()
1717

1818
worker.use(
1919
// override the initial kodeverk request handler to return non-empty list

apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/datepicker/DateInput.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ export const DateInput = ({
7070
useEffect(() => {
7171
if (!fieldValue) {
7272
setFormattedValue('')
73+
} else {
74+
setFormattedValue(formatDate(fieldValue))
7375
}
7476
}, [fieldValue])
7577

apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/monthpicker/Monthpicker.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Label } from '@/components/ui/form/inputs/label/Label'
22
import { InputWrapper } from '@/components/ui/form/inputWrapper/InputWrapper'
33
import { MonthPicker, useMonthpicker } from '@navikt/ds-react'
4-
import { addYears, isDate, subYears } from 'date-fns'
4+
import { addYears, isDate, isSameDay, subYears } from 'date-fns'
55
import { useFormContext } from 'react-hook-form'
66
import * as _ from 'lodash-es'
77
import { useEffect } from 'react'
@@ -35,7 +35,7 @@ export const Monthpicker = ({
3535
? date
3636
: new Date(date)
3737

38-
const { monthpickerProps, inputProps, reset } = useMonthpicker({
38+
const { monthpickerProps, inputProps, reset, setSelected } = useMonthpicker({
3939
fromDate: minDate || subYears(new Date(), 125),
4040
toDate: maxDate || addYears(new Date(), 5),
4141
onMonthChange: (selectedDate) => {
@@ -52,6 +52,11 @@ export const Monthpicker = ({
5252
useEffect(() => {
5353
if (!eksisterendeVerdi && inputProps.value) {
5454
reset()
55+
} else if (
56+
eksisterendeVerdi &&
57+
!isSameDay(new Date(formattedDate), new Date(monthpickerProps.selected))
58+
) {
59+
setSelected(formattedDate)
5560
}
5661
}, [eksisterendeVerdi])
5762

apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/select/Select.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ export const Select = ({
106106

107107
const getPlaceholder = () => {
108108
if (isLoading) {
109-
return 'Henter verdier ...'
109+
return 'Laster ...'
110110
} else if (options?.length === 0) {
111111
return 'Ingen tilgjengelige verdier'
112112
}

apps/dolly-frontend/src/main/js/src/components/ui/form/inputs/textInput/TextInput.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,7 @@ export const TextInput = ({
9595
setFieldValue(formValue || '')
9696
} else if (!useControlled) {
9797
const propValue = value
98-
if (propValue !== undefined) {
99-
setFieldValue(propValue || '')
100-
}
98+
setFieldValue(propValue || '')
10199
}
102100
}, [value, formValue, useControlled])
103101

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import { useHentLagredeSoek } from '@/utils/hooks/useSoek'
2+
import { Chips, VStack } from '@navikt/ds-react'
3+
import * as _ from 'lodash-es'
4+
import { isDate, isSameDay, isValid } from 'date-fns'
5+
6+
export enum soekType {
7+
dolly = 'DOLLY',
8+
tenor = 'TENOR',
9+
}
10+
11+
const listOptions = [
12+
'registreRequest',
13+
'miljoer',
14+
'utenlandskPersonIdentifikasjon',
15+
'roller',
16+
'inntekt.inntektstyper',
17+
'inntekt.forskuddstrekk',
18+
]
19+
20+
export const SisteSoek = ({ type, formValues, handleChange, handleChangeList }) => {
21+
const { lagredeSoek } = useHentLagredeSoek(type)
22+
23+
const lagredeSoekData = []
24+
lagredeSoek?.forEach((soek) => {
25+
Object.entries(soek?.soekVerdi)?.forEach((verdi) => {
26+
if (listOptions.includes(verdi[0]) && Array.isArray(verdi[1])) {
27+
verdi[1]?.forEach((item) => {
28+
if (!lagredeSoekData?.some((i) => i.value === item.value)) {
29+
lagredeSoekData.push(item)
30+
}
31+
})
32+
} else if (verdi[1]?.path && !lagredeSoekData?.some((item) => item.path === verdi[1]?.path)) {
33+
lagredeSoekData.push(verdi[1])
34+
}
35+
})
36+
})
37+
38+
const isSelected = (option) => {
39+
const { path, value } = option
40+
const formValue = _.get(formValues, path)
41+
if (listOptions.includes(path)) {
42+
return formValue?.includes(value)
43+
} else if (
44+
formValue?.length > 8 &&
45+
isDate(new Date(formValue)) &&
46+
isValid(new Date(formValue))
47+
) {
48+
return isSameDay(new Date(formValue), new Date(value))
49+
}
50+
return formValue === value
51+
}
52+
53+
const handleClick = (option) => {
54+
const formValue = _.get(formValues, option.path)
55+
if (listOptions.includes(option.path)) {
56+
const listValues = formValue || []
57+
handleChangeList(
58+
!listValues?.includes(option.value)
59+
? [...listValues, option.value]
60+
: listValues?.filter((item) => item !== option.value),
61+
option.path,
62+
option.label,
63+
)
64+
} else if (
65+
formValue?.length > 8 &&
66+
isDate(new Date(formValue)) &&
67+
isValid(new Date(formValue))
68+
) {
69+
handleChange(
70+
!isSameDay(new Date(formValue), new Date(option.value)) ? option.value : null,
71+
option.path,
72+
option.label,
73+
)
74+
} else {
75+
handleChange(formValue !== option.value ? option.value : null, option.path, option.label)
76+
}
77+
}
78+
79+
return (
80+
<VStack gap="3" style={{ marginBottom: '15px' }}>
81+
<Chips>
82+
{lagredeSoekData?.slice(0, 10).map((option, idx) => (
83+
<Chips.Toggle
84+
key={option.label}
85+
selected={isSelected(option)}
86+
onClick={() => handleClick(option)}
87+
>
88+
{option.label}
89+
</Chips.Toggle>
90+
))}
91+
</Chips>
92+
</VStack>
93+
)
94+
}

apps/dolly-frontend/src/main/js/src/pages/brukerPage/BrukernavnVelger.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ export default ({ eksisterendeBrukernavn, organisasjon, addToSession }: Brukerna
5353
resolver: yupResolver(validation),
5454
mode: 'onChange',
5555
})
56+
5657
const [loading, setLoading] = useState(false)
5758
const [error, setError] = useState(null as string | null)
5859

@@ -115,8 +116,15 @@ export default ({ eksisterendeBrukernavn, organisasjon, addToSession }: Brukerna
115116
size="large"
116117
defaultValue={eksisterendeBrukernavn}
117118
isDisabled={loading || !!eksisterendeBrukernavn}
119+
useControlled
120+
/>
121+
<DollyTextInput
122+
name="epost"
123+
label="Epost"
124+
size="large"
125+
isDisabled={loading}
126+
useControlled
118127
/>
119-
<DollyTextInput name="epost" label="Epost" size="large" isDisabled={loading} />
120128
<ButtonDiv>
121129
<NavButton
122130
type="submit"
Lines changed: 105 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,97 @@
11
import Title from '../../components/title'
22
import { Hjelpetekst } from '@/components/hjelpetekst/Hjelpetekst'
33
import { bottom } from '@popperjs/core'
4-
import { SoekForm } from '@/pages/dollySoek/SoekForm'
4+
import { dollySoekLocalStorageKey, SoekForm } from '@/pages/dollySoek/SoekForm'
5+
import { SisteSoek, soekType } from '@/components/ui/soekForm/SisteSoek'
6+
import { useEffect, useRef, useState } from 'react'
7+
import { useForm } from 'react-hook-form'
8+
import * as _ from 'lodash-es'
9+
import { dollySoekInitialValues } from '@/pages/dollySoek/dollySoekInitialValues'
10+
import { DollyApi } from '@/service/Api'
11+
import { codeToNorskLabel } from '@/utils/DataFormatter'
512

613
export default () => {
14+
const [lagreSoekRequest, setLagreSoekRequest] = useState({})
15+
const lagreSoekRequestRef = useRef(lagreSoekRequest)
16+
17+
useEffect(() => {
18+
lagreSoekRequestRef.current = lagreSoekRequest
19+
}, [lagreSoekRequest])
20+
21+
useEffect(() => {
22+
return () => {
23+
if (Object.keys(lagreSoekRequestRef.current).length > 0) {
24+
DollyApi.lagreSoek(lagreSoekRequestRef.current, soekType.dolly)
25+
.then((response) => console.log(response))
26+
.catch((error) => console.error(error))
27+
}
28+
}
29+
}, [])
30+
31+
const localStorageValue = localStorage.getItem(dollySoekLocalStorageKey)
32+
const initialValues = localStorageValue ? JSON.parse(localStorageValue) : dollySoekInitialValues
33+
34+
const initialValuesClone = _.cloneDeep(initialValues)
35+
const formMethods = useForm({
36+
mode: 'onChange',
37+
defaultValues: initialValuesClone,
38+
})
39+
40+
const [formRequest, setFormRequest] = useState(initialValues)
41+
42+
const setRequest = (request: any) => {
43+
localStorage.setItem(dollySoekLocalStorageKey, JSON.stringify(request))
44+
setFormRequest(request)
45+
}
46+
47+
const { watch, reset } = formMethods
48+
const values = watch()
49+
50+
const handleChange = (value: any, path: string, label: string) => {
51+
const updatedRequest = { ...values, side: 0, seed: null }
52+
_.set(updatedRequest, path, value)
53+
reset(updatedRequest)
54+
setRequest(updatedRequest)
55+
if (value) {
56+
setLagreSoekRequest({
57+
...lagreSoekRequest,
58+
[path]: {
59+
path: path,
60+
value: value,
61+
label: label,
62+
},
63+
})
64+
} else {
65+
setLagreSoekRequest({
66+
...lagreSoekRequest,
67+
[path]: undefined,
68+
})
69+
}
70+
}
71+
72+
const handleChangeList = (value: any, path: string, label: string) => {
73+
const list = value?.map((item: any) => item.value ?? item)
74+
const updatedRequest = { ...values, [path]: list, side: 0, seed: null }
75+
reset(updatedRequest)
76+
setRequest(updatedRequest)
77+
if (value?.length > 0) {
78+
const request = value.map((i) => ({
79+
path: path,
80+
value: i.value ?? i,
81+
label: label?.includes(':') ? label : `${label}: ${i.label ?? codeToNorskLabel(i)}`,
82+
}))
83+
setLagreSoekRequest({
84+
...lagreSoekRequest,
85+
[path]: request,
86+
})
87+
} else {
88+
setLagreSoekRequest({
89+
...lagreSoekRequest,
90+
[path]: [],
91+
})
92+
}
93+
}
94+
795
return (
896
<div>
997
<div className="flexbox--align-center--justify-start">
@@ -13,7 +101,22 @@ export default () => {
13101
eksisterende personer til nye formål.
14102
</Hjelpetekst>
15103
</div>
16-
<SoekForm />
104+
<SisteSoek
105+
type={soekType.dolly}
106+
formValues={formMethods.watch()}
107+
handleChange={handleChange}
108+
handleChangeList={handleChangeList}
109+
/>
110+
<SoekForm
111+
formMethods={formMethods}
112+
localStorageValue={localStorageValue}
113+
handleChange={handleChange}
114+
handleChangeList={handleChangeList}
115+
setRequest={setRequest}
116+
formRequest={formRequest}
117+
lagreSoekRequest={lagreSoekRequest}
118+
setLagreSoekRequest={setLagreSoekRequest}
119+
/>
17120
</div>
18121
)
19122
}

0 commit comments

Comments
 (0)