Skip to content

Commit 5d4a35d

Browse files
authored
Merge pull request #1356 from navikt/aksel-sortering-veilederoversikt
Rydd i sorteringa til Veilederoversikten
2 parents 17779ec + 0515a99 commit 5d4a35d

12 files changed

+131
-123
lines changed

src/ducks/portefoljestorrelser.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const OK = 'veilarbportefolje/portefoljestorrelser/OK';
66
const FEILET = 'veilarbportefolje/portefoljestorrelser/FEILET';
77
const PENDING = 'veilarbportefolje/portefoljestorrelser/PENDING';
88

9-
interface FacetResults {
9+
export interface FacetResults {
1010
value: string;
1111
count: number;
1212
}

src/ducks/sortering.js

Lines changed: 0 additions & 39 deletions
This file was deleted.

src/ducks/sortering.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
export enum VeilederoversiktSorteringsfelt {
2+
ETTERNAVN = 'etternavn',
3+
PORTEFOLJESTORRELSE = 'portefoljestorrelse'
4+
}
5+
6+
export enum SorteringsrekkefolgeVeilederoversikt {
7+
STIGENDE = 'ascending',
8+
SYNKENDE = 'decending',
9+
NA = 'none'
10+
}
11+
12+
export interface VeilederoversiktSortering {
13+
property: VeilederoversiktSorteringsfelt;
14+
direction: SorteringsrekkefolgeVeilederoversikt;
15+
}
16+
17+
// Actions
18+
export const SORTERT_PA = 'veilarbportefoljeflatefs/sortering/SORTERT_PA';
19+
export const RESET = 'veilarbportefoljeflatefs/sortering/SETUP';
20+
21+
const initialState: VeilederoversiktSortering = {
22+
property: VeilederoversiktSorteringsfelt.ETTERNAVN,
23+
direction: SorteringsrekkefolgeVeilederoversikt.STIGENDE
24+
};
25+
26+
// Reducer
27+
export function sorteringReducer(state = initialState, action) {
28+
switch (action.type) {
29+
case SORTERT_PA: {
30+
const {property} = action.data;
31+
32+
let direction = SorteringsrekkefolgeVeilederoversikt.STIGENDE;
33+
if (property === state.property) {
34+
direction =
35+
state.direction === SorteringsrekkefolgeVeilederoversikt.SYNKENDE
36+
? SorteringsrekkefolgeVeilederoversikt.STIGENDE
37+
: SorteringsrekkefolgeVeilederoversikt.SYNKENDE;
38+
}
39+
40+
return {property, direction};
41+
}
42+
case RESET:
43+
return {...initialState};
44+
default:
45+
return state;
46+
}
47+
}
48+
49+
// Action Creators
50+
export function sortBy(property) {
51+
return {type: SORTERT_PA, data: {property}};
52+
}
53+
54+
export function resetSort() {
55+
return {type: RESET};
56+
}

src/mocks/api/veilarbportefolje.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {tolkebehovSpraakMockData} from '../data/tolkebehovSpraak';
66
import {geografiskBostedListMockData} from '../data/geografiskBosted';
77
import {statustallEnhet, statustallVeileder} from '../data/statustall';
88
import {brukere, hentHuskelappForBruker, hentMockPlan} from '../data/portefolje';
9-
import {lagPortefoljeStorrelser} from '../data/portefoljestorrelser';
9+
import {lagPortefoljestorrelserForVeiledere} from '../data/portefoljestorrelser';
1010
import {tiltak} from '../data/tiltak';
1111
import {FargekategoriModell} from '../../typer/bruker-modell';
1212
import {withAuth} from './auth';
@@ -84,7 +84,7 @@ export const veilarbportefoljeHandlers: RequestHandler[] = [
8484
http.get(
8585
'/veilarbportefolje/api/enhet/:enhetId/portefoljestorrelser',
8686
withAuth(async () => {
87-
return HttpResponse.json(lagPortefoljeStorrelser());
87+
return HttpResponse.json(lagPortefoljestorrelserForVeiledere());
8888
})
8989
),
9090
http.post(
Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,9 @@
1-
import {innloggetVeileder, lagTilfeldigVeilederId} from './veiledere';
1+
import {FacetResults} from '../../ducks/portefoljestorrelser';
2+
import {veiledere} from './veiledere';
23
import {rnd} from '../utils';
34

4-
function lagPortefoljeStorrelse() {
5+
export function lagPortefoljestorrelserForVeiledere(): {facetResults: FacetResults[]} {
56
return {
6-
value: lagTilfeldigVeilederId(),
7-
count: rnd(0, 50)
8-
};
9-
}
10-
11-
export function lagPortefoljeStorrelser() {
12-
return {
13-
facetResults: new Array(40)
14-
.fill(lagPortefoljeStorrelse())
15-
.concat(new Array(1).fill({value: innloggetVeileder.ident, count: rnd(0, 50)}))
7+
facetResults: veiledere.map(veileder => ({value: veileder.ident, count: rnd(0, 120)}))
168
};
179
}

src/reducer.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import {Action, combineReducers} from 'redux';
2-
import {persistentReducer, LocalStorageScope} from './utils/persistentReducer';
2+
import {LocalStorageScope, persistentReducer} from './utils/persistentReducer';
33
import {valgtEnhetReducer, ValgtEnhetState} from './ducks/valgt-enhet';
44
import {portefoljeReducer, PortefoljeState} from './ducks/portefolje';
55
import {pagineringReducer} from './ducks/paginering';
6-
import {sorteringReducer} from './ducks/sortering';
6+
import {sorteringReducer, VeilederoversiktSortering} from './ducks/sortering';
77
import {veiledereReducer, VeiledereState} from './ducks/veiledere';
88
import {PortefoljeStorrelser, portefoljestorrelserReducer} from './ducks/portefoljestorrelser';
99
import {filtreringReducer, initialState} from './ducks/filtrering';
@@ -74,7 +74,7 @@ export interface AppState {
7474
valgtEnhet: ValgtEnhetState;
7575
portefolje: PortefoljeState;
7676
paginering: any;
77-
sortering: any;
77+
sortering: VeilederoversiktSortering;
7878
veiledere: VeiledereState;
7979
portefoljestorrelser: PortefoljeStorrelser;
8080
statustallVeileder: StatustallVeilederState;

src/utils/sortering.js

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/veilederoversikt/sortering.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import {SorteringsrekkefolgeVeilederoversikt, VeilederoversiktSorteringsfelt} from '../ducks/sortering';
2+
import {VeilederMedPortefoljestorrelse} from './veilederoversikt-sidevisning';
3+
4+
type Sorteringsfunksjon = (a: VeilederMedPortefoljestorrelse, b: VeilederMedPortefoljestorrelse) => number;
5+
6+
export function sorterVeilederoversikt(
7+
sorteringsfelt: VeilederoversiktSorteringsfelt,
8+
retning: SorteringsrekkefolgeVeilederoversikt
9+
): Sorteringsfunksjon {
10+
const retningsBias = retning === SorteringsrekkefolgeVeilederoversikt.SYNKENDE ? -1 : 1;
11+
12+
if (sorteringsfelt === VeilederoversiktSorteringsfelt.ETTERNAVN) {
13+
return (a, b): number => {
14+
return a.etternavn.localeCompare(b.etternavn) * retningsBias;
15+
};
16+
} else if (sorteringsfelt === VeilederoversiktSorteringsfelt.PORTEFOLJESTORRELSE) {
17+
return (a, b): number => {
18+
return (a.portefoljestorrelse - b.portefoljestorrelse) * retningsBias;
19+
};
20+
} else {
21+
throw new Error(
22+
`Not implemented yet: Det manglar sorteringsfunksjon i veilederoversikt for sorteringsfelt "${sorteringsfelt}"`
23+
);
24+
}
25+
}

src/veilederoversikt/veilederoversikt-side.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ export function VeilederoversiktSide() {
3939
return dispatch(slettEnkeltFilter(Filtervalg.veiledere, ident, oversiktType));
4040
};
4141
const veiledere = useSelector((state: AppState) => state.veiledere);
42-
const portefoljestorrelser = useSelector((state: AppState) => state.portefoljestorrelser);
4342
const id = 'veileder-oversikt';
4443

4544
useEffect(() => {
@@ -96,7 +95,6 @@ export function VeilederoversiktSide() {
9695
/>
9796
<VeilederoversiktSidevisning
9897
veiledere={veiledere.data.veilederListe}
99-
portefoljestorrelser={portefoljestorrelser}
10098
veilederFilter={filtervalg.veiledere}
10199
/>
102100
</div>

src/veilederoversikt/veilederoversikt-sidevisning.tsx

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,62 +2,60 @@ import {useMemo} from 'react';
22
import {useSelector} from 'react-redux';
33
import {Toolbar} from '../components/toolbar/toolbar';
44
import {VeilederoversiktTabell} from './veilederoversikt-tabell';
5-
import {sorter} from '../utils/sortering';
65
import {selectFraIndex, selectSeFlere, selectSidestorrelse} from '../components/toolbar/paginering/paginering-selector';
76
import {OversiktType} from '../ducks/ui/listevisning';
8-
import {PortefoljeStorrelser} from '../ducks/portefoljestorrelser';
97
import {VeilederModell} from '../typer/enhet-og-veiledere-modeller';
108
import {AppState} from '../reducer';
9+
import {sorterVeilederoversikt} from './sortering';
10+
import {FacetResults, PortefoljeStorrelser} from '../ducks/portefoljestorrelser';
1111
import './veilederoversikt.css';
1212

13-
function erValgtHvisFiltrering(veiledere: string[]) {
14-
if (veiledere?.length > 0) {
15-
return veileder => veiledere.includes(veileder.ident);
13+
function finnValgteVeiledere(valgteVeiledere: string[]): (veileder: VeilederModell) => boolean {
14+
if (valgteVeiledere?.length > 0) {
15+
return veileder => valgteVeiledere.includes(veileder.ident);
1616
}
1717
return () => true; // Ikke valgt noe filter, så alle skal være med.
1818
}
1919

20-
function medPortefoljestorrelse(portefoljeStorrelse) {
20+
export interface VeilederMedPortefoljestorrelse extends VeilederModell {
21+
portefoljestorrelse: number;
22+
}
23+
24+
function medPortefoljestorrelse(
25+
portefoljeStorrelse: PortefoljeStorrelser
26+
): (veileder: VeilederModell) => VeilederMedPortefoljestorrelse {
2127
if (portefoljeStorrelse.status !== 'OK') {
2228
// Før vi har fått portefoljestorrele har alle 0
23-
return veileder => ({...veileder, portefoljestorrelse: 0});
29+
return (veileder: VeilederModell) => ({...veileder, portefoljestorrelse: 0});
2430
}
25-
const storrelseMap = portefoljeStorrelse.data.facetResults.reduce(
26-
(acc, {value: ident, count}) => ({...acc, [ident]: count}),
31+
const mapIdentOgPortefoljestorrelser: {[ident: string]: number} = portefoljeStorrelse.data.facetResults.reduce(
32+
(acc: {[ident: string]: number}, {value: ident, count}: FacetResults) => ({...acc, [ident]: count}),
2733
{}
2834
);
2935

30-
return veileder => ({
36+
return (veileder: VeilederModell) => ({
3137
...veileder,
32-
portefoljestorrelse: storrelseMap[veileder.ident] || 0
38+
portefoljestorrelse: mapIdentOgPortefoljestorrelser[veileder.ident] || 0
3339
});
3440
}
3541

36-
function propertySort({property, direction}) {
37-
return sorter(property, direction);
38-
}
39-
4042
interface VeilederoversiktSidevisningProps {
4143
veilederFilter: string[];
4244
veiledere: VeilederModell[];
43-
portefoljestorrelser: PortefoljeStorrelser;
4445
}
4546

46-
export function VeilederoversiktSidevisning({
47-
veilederFilter,
48-
veiledere,
49-
portefoljestorrelser
50-
}: VeilederoversiktSidevisningProps) {
47+
export function VeilederoversiktSidevisning({veilederFilter, veiledere}: VeilederoversiktSidevisningProps) {
5148
const fra = useSelector(selectFraIndex);
5249
const sidestorrelse = useSelector(selectSidestorrelse);
5350
const seAlle = useSelector(selectSeFlere);
5451
const sortering = useSelector((state: AppState) => state.sortering);
52+
const portefoljestorrelser = useSelector((state: AppState) => state.portefoljestorrelser);
5553

5654
const veilederListe = useMemo(() => {
5755
return veiledere
58-
.filter(erValgtHvisFiltrering(veilederFilter))
56+
.filter(finnValgteVeiledere(veilederFilter))
5957
.map(medPortefoljestorrelse(portefoljestorrelser))
60-
.sort(propertySort(sortering));
58+
.sort(sorterVeilederoversikt(sortering.property, sortering.direction));
6159
}, [veilederFilter, portefoljestorrelser, veiledere, sortering]);
6260

6361
function getValgteVeiledere() {

0 commit comments

Comments
 (0)