Skip to content

Commit 15288b2

Browse files
IS-1931: Add filter for frist (#390)
* IS-1931: Add filter for frist * IS-1931: Changed from select to checkbox group * IS-1931: Change naming of legend and choices * IS-1931: Added tests
1 parent 87dde96 commit 15288b2

File tree

10 files changed

+225
-0
lines changed

10 files changed

+225
-0
lines changed

src/components/PersonFilter.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import { PersonregisterState } from '@/api/types/personregisterTypes';
77
import { mapPersonregisterToCompanyList } from '@/utils/personDataUtil';
88
import { useFilters } from '@/context/filters/FilterContext';
99
import { ActionType } from '@/context/filters/filterContextActions';
10+
import { FristFilter } from '@/components/filters/FristFilter';
11+
import { FristFilterOption } from '@/utils/hendelseFilteringUtils';
1012

1113
const texts = {
1214
panelTitle: 'Filter',
@@ -48,6 +50,13 @@ export const PersonFilter = ({
4850
});
4951
};
5052

53+
const onFristFilterChange = (fristFilters: FristFilterOption[]) => {
54+
dispatchFilterAction({
55+
type: ActionType.SetSelectedFristFilter,
56+
selectedFristFilters: fristFilters,
57+
});
58+
};
59+
5160
return (
5261
<Ekspanderbartpanel
5362
apen={panelOpen}
@@ -65,6 +74,7 @@ export const PersonFilter = ({
6574
onSelect={onBirthDateChange}
6675
selectedDates={filterState.selectedBirthDates}
6776
/>
77+
<FristFilter onChange={onFristFilterChange} />
6878
</SpacedFilters>
6979
</Ekspanderbartpanel>
7080
);

src/components/Sokeresultat.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
filterOnBirthDates,
1111
filterOnCompany,
1212
filterOnFodselsnummerOrName,
13+
filterOnFrist,
1314
filterOnPersonregister,
1415
SortingType,
1516
} from '@/utils/hendelseFilteringUtils';
@@ -68,6 +69,7 @@ const Sokeresultat = ({ allEvents }: SokeresultatProps) => {
6869
const filteredEvents = allEvents
6970
.applyFilter((v) => filterOnCompany(v, filterState.selectedCompanies))
7071
.applyFilter((v) => filterOnBirthDates(v, filterState.selectedBirthDates))
72+
.applyFilter((v) => filterOnFrist(v, filterState.selectedFristFilters))
7173
.applyFilter((v) => filterOnPersonregister(v, selectedHendelsetypeFilter))
7274
.applyFilter((v) =>
7375
filterOnFodselsnummerOrName(v, filterState.tekstFilter)
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { CheckboxGroup, Checkbox } from '@navikt/ds-react';
2+
import { FristFilterOption } from '@/utils/hendelseFilteringUtils';
3+
import React from 'react';
4+
5+
const texts = {
6+
legend: 'Frist',
7+
option: {
8+
past: 'Før dagens dato',
9+
today: 'Dagens dato',
10+
future: 'Fremtidige datoer',
11+
},
12+
};
13+
14+
interface Props {
15+
onChange(value: FristFilterOption[]): void;
16+
}
17+
18+
export const FristFilter = ({ onChange }: Props) => {
19+
return (
20+
<CheckboxGroup
21+
legend={texts.legend}
22+
onChange={(val: FristFilterOption[]) => onChange(val)}
23+
size="small"
24+
>
25+
<Checkbox value={FristFilterOption.Past}>{texts.option.past}</Checkbox>
26+
<Checkbox value={FristFilterOption.Today}>{texts.option.today}</Checkbox>
27+
<Checkbox value={FristFilterOption.Future}>
28+
{texts.option.future}
29+
</Checkbox>
30+
</CheckboxGroup>
31+
);
32+
};

src/context/filters/filterContextActions.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import { HendelseTypeFilters } from '@/context/filters/filterContextState';
2+
import { FristFilterOption } from '@/utils/hendelseFilteringUtils';
23

34
export enum ActionType {
45
SetTekstFilter,
56
SetSelectedVeilederIdents,
67
SetSelectedOptions,
78
SetSelectedCompanies,
89
SetSelectedBirthDates,
10+
SetSelectedFristFilter,
911
SetSelectedHendelseType,
1012
ResetFilters,
1113
}
@@ -30,6 +32,11 @@ export interface SetSelectedCompanies {
3032
selectedCompanies: string[];
3133
}
3234

35+
export interface SetSelectedFristFilter {
36+
type: ActionType.SetSelectedFristFilter;
37+
selectedFristFilters: FristFilterOption[];
38+
}
39+
3340
export interface SetSelectedBirthDates {
3441
type: ActionType.SetSelectedBirthDates;
3542
selectedBirthDates: string[];
@@ -49,6 +56,7 @@ export type FilterActions =
4956
| SetSelectedVeilederIdents
5057
| SetSelectedOptions
5158
| SetSelectedCompanies
59+
| SetSelectedFristFilter
5260
| SetSelectedBirthDates
5361
| SetSelectedHendelseType
5462
| ResetFilters;

src/context/filters/filterContextReducer.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ export const filterReducer = (
4242
selectedCompanies: action.selectedCompanies,
4343
};
4444
}
45+
case ActionType.SetSelectedFristFilter: {
46+
return {
47+
...state,
48+
selectedFristFilters: action.selectedFristFilters,
49+
};
50+
}
4551
case ActionType.SetSelectedVeilederIdents: {
4652
return {
4753
...state,

src/context/filters/filterContextState.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { FristFilterOption } from '@/utils/hendelseFilteringUtils';
2+
13
export interface HendelseTypeFilters {
24
arbeidsgiverOnskerMote: boolean;
35
onskerMote: boolean;
@@ -17,6 +19,7 @@ export interface FilterState {
1719
selectedOptions: string[];
1820
selectedCompanies: string[];
1921
selectedBirthDates: string[];
22+
selectedFristFilters: FristFilterOption[];
2023
selectedHendelseType: HendelseTypeFilters;
2124
}
2225

@@ -26,6 +29,7 @@ export const filterInitialState: FilterState = {
2629
selectedOptions: [],
2730
selectedCompanies: [],
2831
selectedBirthDates: [],
32+
selectedFristFilters: [],
2933
selectedHendelseType: {
3034
arbeidsgiverOnskerMote: false,
3135
onskerMote: false,

src/utils/dateUtils.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,31 @@ export const toReadableDate = (dateArg: Date | null): string => {
77

88
return dayjs(dateArg).format('DD.MM.YYYY');
99
};
10+
11+
export function isPast(compareDate: Date): boolean {
12+
const currentDate = new Date();
13+
const date = new Date(compareDate);
14+
const isNotToday = !(
15+
date.getFullYear() === currentDate.getFullYear() &&
16+
date.getMonth() === currentDate.getMonth() &&
17+
date.getDate() === currentDate.getDate()
18+
);
19+
const isInThePast = date < currentDate;
20+
return isNotToday && isInThePast;
21+
}
22+
23+
export function isToday(compareDate: Date): boolean {
24+
const currentDate = new Date();
25+
const date = new Date(compareDate);
26+
return (
27+
date.getFullYear() === currentDate.getFullYear() &&
28+
date.getMonth() === currentDate.getMonth() &&
29+
date.getDate() === currentDate.getDate()
30+
);
31+
}
32+
33+
export function isFuture(compareDate: Date): boolean {
34+
const currentDate = new Date();
35+
const date = new Date(compareDate);
36+
return currentDate < date;
37+
}

src/utils/hendelseFilteringUtils.tsx

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
} from './personDataUtil';
1010
import { Veileder } from '@/api/types/veiledereTypes';
1111
import { HendelseTypeFilters } from '@/context/filters/filterContextState';
12+
import { isFuture, isPast, isToday } from '@/utils/dateUtils';
1213

1314
export class Filterable<T> {
1415
value: T;
@@ -81,6 +82,58 @@ export const filterOnBirthDates = (
8182
return Object.fromEntries(filtered);
8283
};
8384

85+
export enum FristFilterOption {
86+
Past = 'Past',
87+
Today = 'Today',
88+
Future = 'Future',
89+
}
90+
91+
export const filterOnFrist = (
92+
personregister: PersonregisterState,
93+
selectedFristFilters: FristFilterOption[]
94+
): PersonregisterState => {
95+
const isNoFilter = selectedFristFilters.length === 0;
96+
if (isNoFilter) {
97+
return personregister;
98+
}
99+
const filtered = Object.entries(personregister).filter(([, persondata]) => {
100+
const aktivitetskravVurderingFrist =
101+
persondata.aktivitetskravVurderingFrist;
102+
const oppfolgingsoppgaveFrist = persondata.trengerOppfolgingFrist;
103+
if (
104+
aktivitetskravVurderingFrist === null &&
105+
oppfolgingsoppgaveFrist === null
106+
) {
107+
return true;
108+
}
109+
const isOppfolgingsoppgaveVisible = oppfolgingsoppgaveFrist
110+
? isInFristFilter(selectedFristFilters, oppfolgingsoppgaveFrist)
111+
: false;
112+
const isAktivitetskravVisible = aktivitetskravVurderingFrist
113+
? isInFristFilter(selectedFristFilters, aktivitetskravVurderingFrist)
114+
: false;
115+
return isOppfolgingsoppgaveVisible || isAktivitetskravVisible;
116+
});
117+
118+
return Object.fromEntries(filtered);
119+
};
120+
121+
function isInFristFilter(
122+
selectedFilters: FristFilterOption[],
123+
fristDate: Date
124+
): boolean {
125+
return selectedFilters.some((fristFilter) => {
126+
switch (fristFilter) {
127+
case FristFilterOption.Past:
128+
return isPast(fristDate);
129+
case FristFilterOption.Today:
130+
return isToday(fristDate);
131+
case FristFilterOption.Future:
132+
return isFuture(fristDate);
133+
}
134+
});
135+
}
136+
84137
type HendelseTypeFilterKey = keyof HendelseTypeFilters;
85138

86139
const matchesFilter = (

test/components/Sokeresultat.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ describe('Sokeresultat', () => {
5555
selectedOptions: [],
5656
selectedCompanies: [],
5757
selectedBirthDates: [],
58+
selectedFristFilters: [],
5859
selectedHendelseType: {
5960
arbeidsgiverOnskerMote: false,
6061
onskerMote: false,

test/utils/hendelseFilteringUtilsTest.ts

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { expect } from 'chai';
22
import {
3+
filterOnFrist,
34
filterOnPersonregister,
5+
FristFilterOption,
46
getSortedEventsFromSortingType,
57
} from '@/utils/hendelseFilteringUtils';
68
import {
@@ -10,6 +12,7 @@ import {
1012
} from '@/api/types/personregisterTypes';
1113
import { testdata } from '../data/fellesTestdata';
1214
import { HendelseTypeFilters } from '@/context/filters/filterContextState';
15+
import { addWeeks, subWeeks } from 'date-fns';
1316

1417
const createPersonDataWithName = (name: string): PersonData => {
1518
return {
@@ -503,5 +506,83 @@ describe('hendelseFilteringUtils', () => {
503506
expect(Object.keys(filteredPersonregister).length).to.equal(1);
504507
expect(Object.keys(filteredPersonregister)[0]).to.equal('09128034883');
505508
});
509+
510+
describe('Frist filter', () => {
511+
const today = new Date();
512+
const oneWeekAgo = subWeeks(today, 1);
513+
const oneWeekFromToday = addWeeks(today, 1);
514+
515+
const oppfolgingsOppgaveFristBeforeToday: PersonData = {
516+
...createPersonDataWithName('Box Culder'),
517+
trengerOppfolging: true,
518+
trengerOppfolgingFrist: oneWeekAgo,
519+
};
520+
const aktivitetskravVurderingFristBeforeToday: PersonData = {
521+
...createPersonDataWithName('Cox Dulder'),
522+
aktivitetskravActive: true,
523+
aktivitetskravVurderingFrist: oneWeekAgo,
524+
};
525+
const oppfolgingsOppgaveFristToday: PersonData = {
526+
...createPersonDataWithName('Dox Fulder'),
527+
trengerOppfolging: true,
528+
trengerOppfolgingFrist: today,
529+
};
530+
const aktivitetskravVurderingFristToday: PersonData = {
531+
...createPersonDataWithName('Fox Gulder'),
532+
aktivitetskravActive: true,
533+
aktivitetskravVurderingFrist: today,
534+
};
535+
const oppfolgingsOppgaveFristFuture: PersonData = {
536+
...createPersonDataWithName('Gox Hulder'),
537+
trengerOppfolging: true,
538+
trengerOppfolgingFrist: oneWeekFromToday,
539+
};
540+
const aktivitetskravVurderingFristFuture: PersonData = {
541+
...createPersonDataWithName('Jox Kulder'),
542+
aktivitetskravActive: true,
543+
aktivitetskravVurderingFrist: oneWeekFromToday,
544+
};
545+
546+
const personregister: PersonregisterState = {
547+
'16614407794': oppfolgingsOppgaveFristBeforeToday,
548+
'16614407795': aktivitetskravVurderingFristBeforeToday,
549+
'16614407796': oppfolgingsOppgaveFristToday,
550+
'16614407797': aktivitetskravVurderingFristToday,
551+
'16614407798': oppfolgingsOppgaveFristFuture,
552+
'16614407799': aktivitetskravVurderingFristFuture,
553+
};
554+
555+
it('Only returns elements with frist dato before today', () => {
556+
const filteredPersonregister = filterOnFrist(personregister, [
557+
FristFilterOption.Past,
558+
]);
559+
560+
console.log(filteredPersonregister);
561+
562+
expect(Object.keys(filteredPersonregister).length).to.equal(2);
563+
expect(Object.keys(filteredPersonregister)[0]).to.equal('16614407794');
564+
expect(Object.keys(filteredPersonregister)[1]).to.equal('16614407795');
565+
});
566+
567+
it('Only returns elements with frist dato today', () => {
568+
const filteredPersonregister = filterOnFrist(personregister, [
569+
FristFilterOption.Today,
570+
]);
571+
572+
expect(Object.keys(filteredPersonregister).length).to.equal(2);
573+
expect(Object.keys(filteredPersonregister)[0]).to.equal('16614407796');
574+
expect(Object.keys(filteredPersonregister)[1]).to.equal('16614407797');
575+
});
576+
577+
it('Only returns elements with frist dato in the future', () => {
578+
const filteredPersonregister = filterOnFrist(personregister, [
579+
FristFilterOption.Future,
580+
]);
581+
582+
expect(Object.keys(filteredPersonregister).length).to.equal(2);
583+
expect(Object.keys(filteredPersonregister)[0]).to.equal('16614407798');
584+
expect(Object.keys(filteredPersonregister)[1]).to.equal('16614407799');
585+
});
586+
});
506587
});
507588
});

0 commit comments

Comments
 (0)