diff --git a/mock/data/personoversiktEnhetMock.ts b/mock/data/personoversiktEnhetMock.ts
index 3fcc80db..206c1569 100644
--- a/mock/data/personoversiktEnhetMock.ts
+++ b/mock/data/personoversiktEnhetMock.ts
@@ -85,6 +85,26 @@ export const personoversiktEnhetMock: PersonOversiktStatusDTO[] = [
trengerOppfolgingFrist: new Date('2024-01-01'),
behandlerBerOmBistandUbehandlet: false,
},
+ {
+ fnr: '99999911125',
+ navn: 'Frist Fristersen',
+ enhet: '0316',
+ veilederIdent: null,
+ motebehovUbehandlet: true,
+ aktivitetskrav: AktivitetskravStatus.AVVENT,
+ aktivitetskravActive: true,
+ aktivitetskravSistVurdert: new Date('2022-12-01T10:12:05.913826'),
+ aktivitetskravVurderingFrist: new Date('2022-12-08'),
+ oppfolgingsplanLPSBistandUbehandlet: null,
+ dialogmotekandidat: undefined,
+ motestatus: undefined,
+ dialogmotesvarUbehandlet: false,
+ behandlerdialogUbehandlet: false,
+ aktivitetskravVurderStansUbehandlet: false,
+ trengerOppfolging: true,
+ trengerOppfolgingFrist: new Date('2024-01-01'),
+ behandlerBerOmBistandUbehandlet: false,
+ },
{
fnr: '18049911120',
navn: 'Bent Behandlerbistandsen',
diff --git a/src/components/FristColumn.tsx b/src/components/FristColumn.tsx
index c2a47d33..d35ff523 100644
--- a/src/components/FristColumn.tsx
+++ b/src/components/FristColumn.tsx
@@ -1,34 +1,70 @@
import { PersonData } from '@/api/types/personregisterTypes';
import { toReadableDate } from '@/utils/dateUtils';
-import { HourglassTopFilledIcon } from '@navikt/aksel-icons';
-import React from 'react';
+import { FileTextIcon, HourglassTopFilledIcon } from '@navikt/aksel-icons';
+import React, { ReactElement } from 'react';
import { AktivitetskravStatus } from '@/api/types/personoversiktTypes';
import { Tooltip } from '@navikt/ds-react';
import styled from 'styled-components';
-const FristColumnWrapper = styled.div`
+const FristWrapper = styled.div`
display: flex;
flex-wrap: wrap;
`;
+const texts = {
+ tooltipAvventer: 'Avventer',
+ tooltipTrengerOppfolging: 'Trenger oppfølging',
+};
+
interface FristColumnProps {
personData: PersonData;
}
+type Frist = {
+ icon: () => ReactElement;
+ date: Date;
+ tooltip: string;
+};
+
+const byFristAsc = (fristA: Frist, fristB: Frist) => {
+ return fristA.date > fristB.date ? 1 : -1;
+};
+
export const FristColumn = ({ personData }: FristColumnProps) => {
- const showAvventerFrist =
- personData.aktivitetskrav === AktivitetskravStatus.AVVENT;
+ const {
+ aktivitetskrav,
+ aktivitetskravVurderingFrist,
+ trengerOppfolgingFrist,
+ } = personData;
+ const frister: Frist[] = [];
+ if (
+ aktivitetskrav === AktivitetskravStatus.AVVENT &&
+ aktivitetskravVurderingFrist
+ ) {
+ frister.push({
+ icon: () => ,
+ date: aktivitetskravVurderingFrist,
+ tooltip: texts.tooltipAvventer,
+ });
+ }
+ if (trengerOppfolgingFrist) {
+ frister.push({
+ icon: () => ,
+ date: trengerOppfolgingFrist,
+ tooltip: texts.tooltipTrengerOppfolging,
+ });
+ }
return (
-
- {showAvventerFrist && (
- <>
-
-
+ <>
+ {frister.sort(byFristAsc).map(({ date, icon, tooltip }, index) => (
+
+
+ {icon()}
- {toReadableDate(personData.aktivitetskravVurderingFrist)}
- >
- )}
-
+ {toReadableDate(date)}
+
+ ))}
+ >
);
};
diff --git a/src/utils/hendelseFilteringUtils.tsx b/src/utils/hendelseFilteringUtils.tsx
index 0c24c3e4..e4401d73 100644
--- a/src/utils/hendelseFilteringUtils.tsx
+++ b/src/utils/hendelseFilteringUtils.tsx
@@ -2,7 +2,11 @@ import {
PersonData,
PersonregisterState,
} from '@/api/types/personregisterTypes';
-import { firstCompanyNameFromPersonData } from './personDataUtil';
+import {
+ firstCompanyNameFromPersonData,
+ getEarliestFrist,
+ getLatestFrist,
+} from './personDataUtil';
import { Veileder } from '@/api/types/veiledereTypes';
import { HendelseTypeFilters } from '@/context/filters/filterContextState';
@@ -312,8 +316,14 @@ const sortEventsOnFrist = (
): PersonregisterState => {
const sorted = Object.entries(personregister).sort(
([, persondataA], [, persondataB]) => {
- const fristDateA = persondataA.aktivitetskravVurderingFrist;
- const fristDateB = persondataB.aktivitetskravVurderingFrist;
+ const fristDateA =
+ order === 'DATO_ASC'
+ ? getEarliestFrist(persondataA)
+ : getLatestFrist(persondataA);
+ const fristDateB =
+ order === 'DATO_ASC'
+ ? getEarliestFrist(persondataB)
+ : getLatestFrist(persondataB);
if (!fristDateA) return order === 'DATO_ASC' ? 1 : -1;
if (!fristDateB) return order === 'DATO_ASC' ? -1 : 1;
if (fristDateA > fristDateB) return order === 'DATO_ASC' ? 1 : -1;
diff --git a/src/utils/personDataUtil.ts b/src/utils/personDataUtil.ts
index 2abbdc7a..9c67e8ad 100644
--- a/src/utils/personDataUtil.ts
+++ b/src/utils/personDataUtil.ts
@@ -45,3 +45,29 @@ export const firstCompanyNameFromPersonData = (
): string | undefined => {
return companyNamesFromPersonData(p).shift();
};
+
+export const getEarliestFrist = (p: PersonData): Date | null => {
+ const { aktivitetskravVurderingFrist, trengerOppfolgingFrist } = p;
+ if (aktivitetskravVurderingFrist && trengerOppfolgingFrist) {
+ return aktivitetskravVurderingFrist < trengerOppfolgingFrist
+ ? aktivitetskravVurderingFrist
+ : trengerOppfolgingFrist;
+ }
+
+ return aktivitetskravVurderingFrist
+ ? aktivitetskravVurderingFrist
+ : trengerOppfolgingFrist;
+};
+
+export const getLatestFrist = (p: PersonData): Date | null => {
+ const { aktivitetskravVurderingFrist, trengerOppfolgingFrist } = p;
+ if (aktivitetskravVurderingFrist && trengerOppfolgingFrist) {
+ return aktivitetskravVurderingFrist < trengerOppfolgingFrist
+ ? trengerOppfolgingFrist
+ : aktivitetskravVurderingFrist;
+ }
+
+ return aktivitetskravVurderingFrist
+ ? aktivitetskravVurderingFrist
+ : trengerOppfolgingFrist;
+};
diff --git a/test/components/FristColumnTest.tsx b/test/components/FristColumnTest.tsx
new file mode 100644
index 00000000..d183993b
--- /dev/null
+++ b/test/components/FristColumnTest.tsx
@@ -0,0 +1,75 @@
+/*
+Test at de to ulike fristdatoene vises gitt betingelsene
+Test at begge vises og den tidligste først dersom personen har begge fristene.
+ */
+
+import { render, screen } from '@testing-library/react';
+import { FristColumn } from '@/components/FristColumn';
+import React from 'react';
+import { PersonData, Skjermingskode } from '@/api/types/personregisterTypes';
+import { testdata } from '../data/fellesTestdata';
+import { expect } from 'chai';
+import { AktivitetskravStatus } from '@/api/types/personoversiktTypes';
+
+const defaultPersonData: PersonData = {
+ navn: testdata.navn1,
+ harMotebehovUbehandlet: false,
+ harDialogmotesvar: false,
+ skjermingskode: testdata.skjermingskode.diskresjonsmerket as Skjermingskode,
+ markert: false,
+ harOppfolgingsplanLPSBistandUbehandlet: false,
+ tildeltEnhetId: '123',
+ tildeltVeilederIdent: '234',
+ aktivitetskrav: null,
+ aktivitetskravSistVurdert: null,
+ aktivitetskravActive: false,
+ aktivitetskravVurderingFrist: null,
+ harBehandlerdialogUbehandlet: false,
+ harAktivitetskravVurderStansUbehandlet: false,
+ trengerOppfolging: false,
+ trengerOppfolgingFrist: null,
+ behandlerBerOmBistandUbehandlet: false,
+};
+
+describe('FristColumn', () => {
+ it('viser ingen frister når person har hverken aktivitetskrav AVVENT med frist eller trenger oppfolging med frist', () => {
+ const personAvventerMedFrist: PersonData = { ...defaultPersonData };
+ render();
+
+ expect(screen.queryAllByText(/2023/)).to.be.empty;
+ });
+ it('viser frist for person når aktivitetskrav AVVENT med frist', () => {
+ const personAvventerMedFrist: PersonData = {
+ ...defaultPersonData,
+ aktivitetskrav: AktivitetskravStatus.AVVENT,
+ aktivitetskravVurderingFrist: new Date('2023-12-18'),
+ };
+ render();
+
+ expect(screen.getByText('18.12.2023')).to.exist;
+ });
+ it('viser frist for person når trenger oppfolging frist-dato er satt', () => {
+ const personTrengerOppfolgingMedFrist: PersonData = {
+ ...defaultPersonData,
+ trengerOppfolgingFrist: new Date('2023-12-31'),
+ };
+ render();
+
+ expect(screen.getByText('31.12.2023')).to.exist;
+ });
+ it('viser tidligste frist først når person har flere frister', () => {
+ const personMedFlereFrister: PersonData = {
+ ...defaultPersonData,
+ aktivitetskrav: AktivitetskravStatus.AVVENT,
+ aktivitetskravVurderingFrist: new Date('2023-12-10'),
+ trengerOppfolgingFrist: new Date('2023-12-05'),
+ };
+
+ render();
+
+ const allFrister = screen.getAllByText(/2023/);
+ expect(allFrister).to.have.length(2);
+ expect(allFrister[0]?.textContent).to.eq('05.12.2023');
+ expect(allFrister[1]?.textContent).to.eq('10.12.2023');
+ });
+});
diff --git a/test/utils/hendelseFilteringUtilsTest.ts b/test/utils/hendelseFilteringUtilsTest.ts
index 40cc8d3e..815794d7 100644
--- a/test/utils/hendelseFilteringUtilsTest.ts
+++ b/test/utils/hendelseFilteringUtilsTest.ts
@@ -84,52 +84,238 @@ describe('hendelseFilteringUtils', () => {
});
describe('sort by frist', () => {
it('Sorts by aktivitetskrav avventer-frist ascending', () => {
- const personWithFirstAvventerFrist: PersonData = {
+ const personWithEarliestFrist: PersonData = {
...createPersonDataWithName('Agnes Agnes'),
aktivitetskravVurderingFrist: new Date('2023-12-05'),
};
- const personWithAvventerFrist: PersonData = {
+ const personWithLatestFrist: PersonData = {
...createPersonDataWithName('Bjarne Bjarne'),
aktivitetskravVurderingFrist: new Date('2023-12-10'),
};
const personWithNoFrist = createPersonDataWithName('Navn Navnesen');
const personregisterState: PersonregisterState = {
- '09128034883': personWithFirstAvventerFrist,
+ '09128034883': personWithEarliestFrist,
'16624407794': personWithNoFrist,
- '16614407794': personWithAvventerFrist,
+ '16614407794': personWithLatestFrist,
};
const result = getSortedEventsFromSortingType(
personregisterState,
[],
'DATO_ASC'
);
- expect(Object.keys(result)[0]).to.deep.equal('09128034883');
- expect(Object.keys(result)[1]).to.deep.equal('16614407794');
- expect(Object.keys(result)[2]).to.deep.equal('16624407794');
+ expect(Object.values(result)[0]?.navn).to.deep.equal(
+ personWithEarliestFrist.navn
+ );
+ expect(Object.values(result)[1]?.navn).to.deep.equal(
+ personWithLatestFrist.navn
+ );
+ expect(Object.values(result)[2]?.navn).to.deep.equal(
+ personWithNoFrist.navn
+ );
});
it('Sorts by aktivitetskrav avventer-frist descending', () => {
- const personWithFirstAvventerFrist: PersonData = {
+ const personWithEarliestFrist: PersonData = {
...createPersonDataWithName('Agnes Agnes'),
aktivitetskravVurderingFrist: new Date('2023-12-05'),
};
- const personWithAvventerFrist: PersonData = {
+ const personWithLatestFrist: PersonData = {
...createPersonDataWithName('Bjarne Bjarne'),
aktivitetskravVurderingFrist: new Date('2023-12-10'),
};
const personWithNoFrist = createPersonDataWithName('Navn Navnesen');
const personregisterState: PersonregisterState = {
- '09128034883': personWithFirstAvventerFrist,
+ '09128034883': personWithEarliestFrist,
+ '16624407794': personWithNoFrist,
+ '16614407794': personWithLatestFrist,
+ };
+ const result = getSortedEventsFromSortingType(
+ personregisterState,
+ [],
+ 'DATO_DESC'
+ );
+ expect(Object.values(result)[0]?.navn).to.deep.equal(
+ personWithNoFrist.navn
+ );
+ expect(Object.values(result)[1]?.navn).to.deep.equal(
+ personWithLatestFrist.navn
+ );
+ expect(Object.values(result)[2]?.navn).to.deep.equal(
+ personWithEarliestFrist.navn
+ );
+ });
+ it('Sorts by trenger oppfolging-frist ascending', () => {
+ const personWithEarliestFrist: PersonData = {
+ ...createPersonDataWithName('Agnes Agnes'),
+ trengerOppfolgingFrist: new Date('2023-12-05'),
+ };
+ const personWithLatestFrist: PersonData = {
+ ...createPersonDataWithName('Bjarne Bjarne'),
+ trengerOppfolgingFrist: new Date('2023-12-10'),
+ };
+ const personWithNoFrist = createPersonDataWithName('Navn Navnesen');
+ const personregisterState: PersonregisterState = {
+ '09128034883': personWithEarliestFrist,
+ '16624407794': personWithNoFrist,
+ '16614407794': personWithLatestFrist,
+ };
+ const result = getSortedEventsFromSortingType(
+ personregisterState,
+ [],
+ 'DATO_ASC'
+ );
+ expect(Object.values(result)[0]?.navn).to.deep.equal(
+ personWithEarliestFrist.navn
+ );
+ expect(Object.values(result)[1]?.navn).to.deep.equal(
+ personWithLatestFrist.navn
+ );
+ expect(Object.values(result)[2]?.navn).to.deep.equal(
+ personWithNoFrist.navn
+ );
+ });
+ it('Sorts by trenger oppfolging-frist descending', () => {
+ const personWithEarliestFrist: PersonData = {
+ ...createPersonDataWithName('Agnes Agnes'),
+ trengerOppfolgingFrist: new Date('2023-12-05'),
+ };
+ const personWithLatestFrist: PersonData = {
+ ...createPersonDataWithName('Bjarne Bjarne'),
+ trengerOppfolgingFrist: new Date('2023-12-10'),
+ };
+ const personWithNoFrist = createPersonDataWithName('Navn Navnesen');
+ const personregisterState: PersonregisterState = {
+ '09128034883': personWithEarliestFrist,
+ '16624407794': personWithNoFrist,
+ '16614407794': personWithLatestFrist,
+ };
+ const result = getSortedEventsFromSortingType(
+ personregisterState,
+ [],
+ 'DATO_DESC'
+ );
+ expect(Object.values(result)[0]?.navn).to.deep.equal(
+ personWithNoFrist.navn
+ );
+ expect(Object.values(result)[1]?.navn).to.deep.equal(
+ personWithLatestFrist.navn
+ );
+ expect(Object.values(result)[2]?.navn).to.deep.equal(
+ personWithEarliestFrist.navn
+ );
+ });
+ it('Sorts by avventer and trenger oppfolging-frist ascending', () => {
+ const personWithEarliestFrist: PersonData = {
+ ...createPersonDataWithName('Agnes Agnes'),
+ aktivitetskravVurderingFrist: new Date('2023-12-05'),
+ };
+ const personWithLatestFrist: PersonData = {
+ ...createPersonDataWithName('Bjarne Bjarne'),
+ trengerOppfolgingFrist: new Date('2023-12-10'),
+ };
+ const personWithNoFrist = createPersonDataWithName('Navn Navnesen');
+ const personregisterState: PersonregisterState = {
+ '09128034883': personWithEarliestFrist,
'16624407794': personWithNoFrist,
- '16614407794': personWithAvventerFrist,
+ '16614407794': personWithLatestFrist,
+ };
+ const result = getSortedEventsFromSortingType(
+ personregisterState,
+ [],
+ 'DATO_ASC'
+ );
+ expect(Object.values(result)[0]?.navn).to.deep.equal(
+ personWithEarliestFrist.navn
+ );
+ expect(Object.values(result)[1]?.navn).to.deep.equal(
+ personWithLatestFrist.navn
+ );
+ expect(Object.values(result)[2]?.navn).to.deep.equal(
+ personWithNoFrist.navn
+ );
+ });
+ it('Sorts by avventer and trenger oppfolging-frist descending', () => {
+ const personWithEarliestFrist: PersonData = {
+ ...createPersonDataWithName('Agnes Agnes'),
+ aktivitetskravVurderingFrist: new Date('2023-12-05'),
+ };
+ const personWithLatestFrist: PersonData = {
+ ...createPersonDataWithName('Bjarne Bjarne'),
+ trengerOppfolgingFrist: new Date('2023-12-10'),
+ };
+ const personWithNoFrist = createPersonDataWithName('Navn Navnesen');
+ const personregisterState: PersonregisterState = {
+ '09128034883': personWithEarliestFrist,
+ '16624407794': personWithNoFrist,
+ '16614407794': personWithLatestFrist,
};
const result = getSortedEventsFromSortingType(
personregisterState,
[],
'DATO_DESC'
);
- expect(Object.keys(result)[0]).to.deep.equal('16624407794');
- expect(Object.keys(result)[1]).to.deep.equal('16614407794');
- expect(Object.keys(result)[2]).to.deep.equal('09128034883');
+ expect(Object.values(result)[0]?.navn).to.deep.equal(
+ personWithNoFrist.navn
+ );
+ expect(Object.values(result)[1]?.navn).to.deep.equal(
+ personWithLatestFrist.navn
+ );
+ expect(Object.values(result)[2]?.navn).to.deep.equal(
+ personWithEarliestFrist.navn
+ );
+ });
+ it('Sorts ascending by earliest frist per person when person have both frist', () => {
+ const personWithEarliestFrist: PersonData = {
+ ...createPersonDataWithName('Agnes Agnes'),
+ aktivitetskravVurderingFrist: new Date('2023-12-05'),
+ trengerOppfolgingFrist: new Date('2023-12-10'),
+ };
+ const personWithLatestFrist: PersonData = {
+ ...createPersonDataWithName('Bjarne Bjarne'),
+ aktivitetskravVurderingFrist: new Date('2023-12-08'),
+ trengerOppfolgingFrist: new Date('2023-12-15'),
+ };
+ const personregisterState: PersonregisterState = {
+ '09128034883': personWithEarliestFrist,
+ '16614407794': personWithLatestFrist,
+ };
+ const result = getSortedEventsFromSortingType(
+ personregisterState,
+ [],
+ 'DATO_ASC'
+ );
+ expect(Object.values(result)[0]?.navn).to.deep.equal(
+ personWithEarliestFrist.navn
+ );
+ expect(Object.values(result)[1]?.navn).to.deep.equal(
+ personWithLatestFrist.navn
+ );
+ });
+ it('Sorts descending by earliest frist per person when person have both frist', () => {
+ const personWithEarliestFrist: PersonData = {
+ ...createPersonDataWithName('Agnes Agnes'),
+ aktivitetskravVurderingFrist: new Date('2023-12-05'),
+ trengerOppfolgingFrist: new Date('2023-12-10'),
+ };
+ const personWithLatestFrist: PersonData = {
+ ...createPersonDataWithName('Bjarne Bjarne'),
+ aktivitetskravVurderingFrist: new Date('2023-12-08'),
+ trengerOppfolgingFrist: new Date('2023-12-15'),
+ };
+ const personregisterState: PersonregisterState = {
+ '09128034883': personWithEarliestFrist,
+ '16614407794': personWithLatestFrist,
+ };
+ const result = getSortedEventsFromSortingType(
+ personregisterState,
+ [],
+ 'DATO_DESC'
+ );
+ expect(Object.values(result)[0]?.navn).to.deep.equal(
+ personWithLatestFrist.navn
+ );
+ expect(Object.values(result)[1]?.navn).to.deep.equal(
+ personWithEarliestFrist.navn
+ );
});
});