Skip to content

Commit a3be252

Browse files
committed
Tweaker tilpasset søk
1 parent b386d34 commit a3be252

File tree

5 files changed

+86
-58
lines changed

5 files changed

+86
-58
lines changed

common/contentSearch.ts

+1
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@ export type ContentSearchParams = {
2626
type?: ContentSearchType;
2727
withChildCategories?: boolean;
2828
categoryKeys?: string[];
29+
isCustom?: boolean;
2930
};

src/components/left-section/search/search-input/SearchInput.tsx

+7-9
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { ContentSearchParams, ContentSearchResult } from '../../../../../common/
44
import { useApiFetch } from '../../../../fetch/useApiFetch';
55
import { classNames } from '../../../../utils/classNames';
66
import { SearchSettings } from './search-settings/SearchSettings';
7-
import { getInitialSearchParams, persistSearchParams } from './params-initial-state';
7+
import { getInitialSearchParams, initialSearchParams } from './params-initial-state';
88
import { useAppState } from '../../../../state/useAppState';
99

1010
import style from './SearchInput.module.css';
@@ -23,17 +23,15 @@ export const SearchInput = ({ setSearchResult, className }: Props) => {
2323
getInitialSearchParams(basePath)
2424
);
2525

26-
const setSearchParamsPartial = (params: Partial<ContentSearchParams>) => {
27-
const newParams = { ...searchParams, ...params };
28-
persistSearchParams(newParams, basePath);
29-
setSearchParams(newParams);
30-
};
31-
3226
const { fetchSearch } = useApiFetch();
3327

3428
return (
3529
<div className={classNames(style.search, className)}>
36-
<SearchSettings searchParams={searchParams} setSearchParams={setSearchParamsPartial} />
30+
<SearchSettings
31+
searchParams={searchParams}
32+
setSearchParams={setSearchParams}
33+
reset={() => setSearchParams({ ...initialSearchParams, query: searchParams.query })}
34+
/>
3735
<form
3836
role={'search'}
3937
onSubmit={(e) => {
@@ -60,7 +58,7 @@ export const SearchInput = ({ setSearchResult, className }: Props) => {
6058
hideLabel={true}
6159
size={'small'}
6260
ref={inputRef}
63-
onChange={(value) => setSearchParamsPartial({ query: value })}
61+
onChange={(value) => setSearchParams({ ...searchParams, query: value })}
6462
/>
6563
</form>
6664
</div>

src/components/left-section/search/search-input/params-initial-state.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Cookies from 'js-cookie';
33

44
const getCookieKey = (basePath: string) => `cms-archive-search-settings${basePath}`;
55

6-
const initialParamsRequired: ContentSearchParams = {
6+
export const initialSearchParams: ContentSearchParams = {
77
from: 0,
88
size: 50,
99
withChildCategories: true,
@@ -18,14 +18,14 @@ export const getInitialSearchParams = (basePath: string): ContentSearchParams =>
1818

1919
return {
2020
...parsed,
21-
...initialParamsRequired,
21+
...initialSearchParams,
2222
};
2323
} catch (e) {
2424
console.error(`Failed to parse search params from cookie - ${e}`);
2525
}
2626
}
2727

28-
return initialParamsRequired;
28+
return initialSearchParams;
2929
};
3030

3131
export const persistSearchParams = (params: ContentSearchParams, basePath: string) => {

src/components/left-section/search/search-input/search-settings/SearchSettings.module.css

+7-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
width: 100%;
33
}
44

5-
.labels {
5+
.topRow {
66
display: flex;
77
justify-content: space-between;
88
align-items: center;
@@ -49,6 +49,11 @@
4949
}
5050
}
5151

52+
.radioGroups {
53+
display: grid;
54+
grid-template-columns: 1fr 1fr;
55+
}
56+
5257
.searchFields {
5358
display: flex;
5459
align-items: center;
@@ -67,6 +72,6 @@
6772
.categoriesSelector {
6873
ul {
6974
gap: 0.25rem;
70-
font-size: 0.75rem;
75+
font-size: 0.875rem;
7176
}
7277
}

src/components/left-section/search/search-input/search-settings/SearchSettings.tsx

+68-44
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,97 @@
11
import React, { useState } from 'react';
22
import { Button, HelpText, Label, Radio, RadioGroup, UNSAFE_Combobox } from '@navikt/ds-react';
3-
import { ChevronDownIcon } from '@navikt/aksel-icons';
3+
import { ChevronDownIcon, XMarkIcon } from '@navikt/aksel-icons';
44
import { ContentSearchParams } from '../../../../../../common/contentSearch';
55
import { classNames } from '../../../../../utils/classNames';
66
import { useAppState } from '../../../../../state/useAppState';
77
import { CmsCategoryListItem } from '../../../../../../common/cms-documents/category';
8+
import { persistSearchParams } from '../params-initial-state';
89

910
import style from './SearchSettings.module.css';
1011

1112
type Props = {
1213
searchParams: ContentSearchParams;
13-
setSearchParams: (params: Partial<ContentSearchParams>) => void;
14+
setSearchParams: (params: ContentSearchParams) => void;
15+
reset: () => void;
1416
};
1517

16-
export const SearchSettings = ({ searchParams, setSearchParams }: Props) => {
18+
export const SearchSettings = ({ searchParams, setSearchParams, reset }: Props) => {
1719
const [isOpen, setIsOpen] = useState(false);
1820

1921
const { appContext } = useAppState();
22+
const { rootCategories, basePath } = appContext;
2023

21-
const { sort, categoryKeys, type } = searchParams;
24+
const { sort, categoryKeys, type, isCustom } = searchParams;
2225

23-
const { titlesToKeys, keysToTitles } = createKeysTitlesMaps(appContext.rootCategories);
26+
const { titlesToKeys, keysToTitles } = createKeysTitlesMaps(rootCategories);
2427
const categoryKeysSelected = new Set<string>(categoryKeys);
2528
const categoryTitlesSelected = [...categoryKeysSelected].map((key) => keysToTitles[key]);
2629
const categoryTitlesAll = Object.keys(titlesToKeys);
2730

31+
const updateSearchParams = (params: Partial<ContentSearchParams>) => {
32+
const newParams: ContentSearchParams = { ...searchParams, ...params, isCustom: true };
33+
persistSearchParams(newParams, basePath);
34+
setSearchParams(newParams);
35+
};
36+
2837
return (
2938
<div className={style.container}>
30-
<div className={style.labels}>
39+
<div className={style.topRow}>
3140
<Label size={'small'}>{'Søk'}</Label>
32-
<Button
33-
size={'xsmall'}
34-
variant={'tertiary'}
35-
className={style.toggle}
36-
onClick={() => setIsOpen(!isOpen)}
37-
>
38-
{'Tilpass søket'}
39-
<ChevronDownIcon className={classNames(style.icon, isOpen && style.open)} />
40-
</Button>
41+
<div>
42+
{isCustom && (
43+
<Button
44+
size={'xsmall'}
45+
variant={'tertiary'}
46+
className={style.toggle}
47+
onClick={reset}
48+
>
49+
{'Nullstill'}
50+
<XMarkIcon />
51+
</Button>
52+
)}
53+
<Button
54+
size={'xsmall'}
55+
variant={'tertiary'}
56+
className={style.toggle}
57+
onClick={() => setIsOpen(!isOpen)}
58+
>
59+
{'Tilpass søket'}
60+
<ChevronDownIcon className={classNames(style.icon, isOpen && style.open)} />
61+
</Button>
62+
</div>
4163
</div>
4264
<div className={classNames(style.settings, isOpen && style.open)}>
43-
<RadioGroup
44-
size={'small'}
45-
legend={'Søk etter...'}
46-
value={type || 'titles'}
47-
onChange={(value) => setSearchParams({ type: value })}
48-
>
49-
<Radio value={'titles'}>{'Tittel'}</Radio>
50-
<span className={style.withHelp}>
51-
<Radio value={'locations'}>{'URL'}</Radio>
52-
<HelpText wrapperClassName={style.help}>
53-
{'Prefix-søk på pathname. F.eks. vil '}
54-
<code>{'https://www.nav.no/no/person/arbeid'}</code>
55-
{' gi treff på alle sider med en path som starter med '}
56-
<code>{'/no/person/arbeid'}</code>
57-
</HelpText>
58-
</span>
59-
<Radio value={'all'}>{'Alt innhold'}</Radio>
60-
</RadioGroup>
61-
<RadioGroup
62-
size={'small'}
63-
legend={'Sortering'}
64-
value={sort || 'score'}
65-
onChange={(value) => setSearchParams({ sort: value })}
66-
>
67-
<Radio value={'score'}>{'Beste treff'}</Radio>
68-
<Radio value={'name'}>{'Tittel'}</Radio>
69-
<Radio value={'datetime'}>{'Sist endret'}</Radio>
70-
</RadioGroup>
65+
<div className={style.radioGroups}>
66+
<RadioGroup
67+
size={'small'}
68+
legend={'Søk etter...'}
69+
value={type || 'titles'}
70+
onChange={(value) => updateSearchParams({ type: value })}
71+
>
72+
<Radio value={'titles'}>{'Tittel'}</Radio>
73+
<span className={style.withHelp}>
74+
<Radio value={'locations'}>{'URL'}</Radio>
75+
<HelpText wrapperClassName={style.help}>
76+
{'Prefix-søk på pathname. F.eks. vil '}
77+
<code>{'https://www.nav.no/no/person/arbeid'}</code>
78+
{' gi treff på alle sider med en path som starter med '}
79+
<code>{'/no/person/arbeid'}</code>
80+
</HelpText>
81+
</span>
82+
<Radio value={'all'}>{'Alt innhold'}</Radio>
83+
</RadioGroup>
84+
<RadioGroup
85+
size={'small'}
86+
legend={'Sortering'}
87+
value={sort || 'score'}
88+
onChange={(value) => updateSearchParams({ sort: value })}
89+
>
90+
<Radio value={'score'}>{'Beste treff'}</Radio>
91+
<Radio value={'name'}>{'Tittel'}</Radio>
92+
<Radio value={'datetime'}>{'Sist endret'}</Radio>
93+
</RadioGroup>
94+
</div>
7195
<UNSAFE_Combobox
7296
label={'Avgrens til valgte kategorier'}
7397
size={'small'}
@@ -85,7 +109,7 @@ export const SearchSettings = ({ searchParams, setSearchParams }: Props) => {
85109
categoryKeysSelected.delete(key);
86110
}
87111

88-
setSearchParams({ categoryKeys: [...categoryKeysSelected] });
112+
updateSearchParams({ categoryKeys: [...categoryKeysSelected] });
89113
}}
90114
/>
91115
</div>

0 commit comments

Comments
 (0)