Skip to content

Commit b47ee9f

Browse files
committed
FO-2760 La til filtrering på fnr og navn
1 parent 07aeb73 commit b47ee9f

17 files changed

+205
-17
lines changed

package-lock.json

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
"nav-frontend-alertstriper": "^3.0.11",
4646
"nav-frontend-alertstriper-style": "^2.0.9",
4747
"nav-frontend-core": "^4.0.11",
48+
"nav-frontend-etiketter": "^1.0.30",
49+
"nav-frontend-etiketter-style": "^0.3.19",
4850
"nav-frontend-ikoner-assets": "^1.0.5",
4951
"nav-frontend-js-utils": "^1.0.8",
5052
"nav-frontend-lenker": "^1.0.33",

src/app.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ import StoreProvider from './stores/store-provider';
33
import { Header } from './components/header/header';
44
import { InternflateDecorator } from './components/internflate-decorator/internflate-decorator';
55
import { Hovedside } from './hovedside/hovedside';
6+
import { FilterSync } from './components/filter-sync';
67

78
function App() {
89
return (
910
<StoreProvider>
1011
<InternflateDecorator />
1112
<Header />
1213
<Hovedside />
14+
<FilterSync />
1315
</StoreProvider>
1416
);
1517
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
.filter-etikett {
3+
padding: 0;
4+
background-color: transparent;
5+
border: none;
6+
cursor: pointer;
7+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import React from 'react';
2+
import { EtikettInfo } from 'nav-frontend-etiketter';
3+
import './filter-etikett.less';
4+
import { OnRemoveClicked } from '../filter-etiketter';
5+
6+
interface FilterEtikettProps {
7+
id: string;
8+
tekst: string;
9+
onRemoveClicked: OnRemoveClicked;
10+
}
11+
12+
export const FilterEtikett = (props: FilterEtikettProps) => {
13+
const {id, tekst, onRemoveClicked} = props;
14+
15+
return (
16+
<button className="filter-etikett" onClick={() => onRemoveClicked(id)}>
17+
<EtikettInfo>{tekst}</EtikettInfo>
18+
</button>
19+
);
20+
};
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
.filter-etiketter {
3+
margin-bottom: 1rem;
4+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import React from 'react';
2+
import { Filters, useFilterStore } from '../../stores/filter-store';
3+
import { FilterEtikett } from './etikett/filter-etikett';
4+
import './filter-etiketter.less';
5+
6+
export type OnRemoveClicked = (id: string) => void;
7+
8+
const NAVN_ELLER_FNR_FILTER = 'NAVN_ELLER_FNR_FILTER';
9+
10+
function lagFilterEtiketter(filters: Filters, onRemoveClicked: OnRemoveClicked) {
11+
const { fnrOrName } = filters;
12+
const filterEtiketter = [];
13+
14+
if (fnrOrName && fnrOrName.trim().length > 0) {
15+
filterEtiketter.push(
16+
<FilterEtikett id={NAVN_ELLER_FNR_FILTER} tekst="Søk på navn eller fnr" onRemoveClicked={onRemoveClicked} />
17+
);
18+
}
19+
20+
return filterEtiketter;
21+
}
22+
23+
export const FilterEtiketter = () => {
24+
const { filters, setFnrOrNameFilter } = useFilterStore();
25+
26+
function handleOnRemoveClicked(id: string) {
27+
if (id === NAVN_ELLER_FNR_FILTER) {
28+
setFnrOrNameFilter('');
29+
}
30+
}
31+
32+
const etiketter = lagFilterEtiketter(filters, handleOnRemoveClicked);
33+
34+
if (etiketter.length === 0) {
35+
return null;
36+
}
37+
38+
return (
39+
<div className="filter-etiketter">
40+
{etiketter}
41+
</div>
42+
);
43+
};

src/components/filter-sync.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { useEffect } from 'react';
2+
import { useFetchStore } from '../stores/fetch-store';
3+
import { useFilteredUsersStore } from '../stores/filtered-users-store';
4+
import { useFilterStore } from '../stores/filter-store';
5+
import { hasData } from '../rest/utils';
6+
import { filterUsers, hasFilters } from '../utils/filter-utils';
7+
8+
export const FilterSync = () => {
9+
const { brukere } = useFetchStore();
10+
const { setFilteredUsers } = useFilteredUsersStore();
11+
const { filters } = useFilterStore();
12+
13+
useEffect(() => {
14+
if (hasData(brukere) && !hasFilters(filters)) {
15+
setFilteredUsers(brukere.data);
16+
}
17+
// eslint-disable-next-line react-hooks/exhaustive-deps
18+
}, [brukere]);
19+
20+
useEffect(() => {
21+
if (hasData(brukere)) {
22+
setFilteredUsers(filterUsers(filters, brukere.data));
23+
}
24+
// eslint-disable-next-line react-hooks/exhaustive-deps
25+
}, [filters]);
26+
27+
return null;
28+
};
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
.sokefelt {
22
margin-bottom: 1rem;
3+
4+
input {
5+
font-size: 14px;
6+
text-overflow: ellipsis;
7+
}
38
}

src/components/sokefelt/sokefelt.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import React from 'react';
22
import { Input } from 'nav-frontend-skjema';
3-
import './sokefelt.less';
43
import { useFilterStore } from '../../stores/filter-store';
4+
import './sokefelt.less';
55

66
export const Sokefelt = () => {
7-
const { fnrOrNameFilter, setFnrOrNameFilter } = useFilterStore();
7+
const { filters, setFnrOrNameFilter } = useFilterStore();
88

99
function handleOnQueryChanged(e: React.ChangeEvent<HTMLInputElement>) {
1010
setFnrOrNameFilter(e.target.value);
@@ -16,7 +16,7 @@ export const Sokefelt = () => {
1616
label=""
1717
placeholder="Søk etter navn eller fødselsnummer"
1818
onChange={handleOnQueryChanged}
19-
value={fnrOrNameFilter}
19+
value={filters.fnrOrName}
2020
/>
2121
</div>
2222
);

0 commit comments

Comments
 (0)