Skip to content

Commit

Permalink
IS-1710: Add trengerOppfolgingFrist to frist column (#383)
Browse files Browse the repository at this point in the history
* IS-1710: Add trengerOppfolgingFrist to frist column

* Fix PR feedback

* Fix pr feedback
  • Loading branch information
andersrognstad authored Dec 5, 2023
1 parent a55baae commit 92709c7
Show file tree
Hide file tree
Showing 6 changed files with 425 additions and 38 deletions.
20 changes: 20 additions & 0 deletions mock/data/personoversiktEnhetMock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
64 changes: 50 additions & 14 deletions src/components/FristColumn.tsx
Original file line number Diff line number Diff line change
@@ -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: () => <HourglassTopFilledIcon aria-hidden fontSize="1.5rem" />,
date: aktivitetskravVurderingFrist,
tooltip: texts.tooltipAvventer,
});
}
if (trengerOppfolgingFrist) {
frister.push({
icon: () => <FileTextIcon aria-hidden fontSize="1.5rem" />,
date: trengerOppfolgingFrist,
tooltip: texts.tooltipTrengerOppfolging,
});
}

return (
<FristColumnWrapper>
{showAvventerFrist && (
<>
<Tooltip content="Avventer" arrow={false}>
<HourglassTopFilledIcon aria-hidden fontSize="1.5rem" />
<>
{frister.sort(byFristAsc).map(({ date, icon, tooltip }, index) => (
<FristWrapper key={index}>
<Tooltip content={tooltip} arrow={false}>
{icon()}
</Tooltip>
{toReadableDate(personData.aktivitetskravVurderingFrist)}
</>
)}
</FristColumnWrapper>
{toReadableDate(date)}
</FristWrapper>
))}
</>
);
};
16 changes: 13 additions & 3 deletions src/utils/hendelseFilteringUtils.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -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;
Expand Down
22 changes: 22 additions & 0 deletions src/utils/personDataUtil.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,25 @@ export const firstCompanyNameFromPersonData = (
): string | undefined => {
return companyNamesFromPersonData(p).shift();
};

export const getEarliestFrist = (personData: PersonData): Date | null => {
const { aktivitetskravVurderingFrist, trengerOppfolgingFrist } = personData;
if (aktivitetskravVurderingFrist && trengerOppfolgingFrist) {
return aktivitetskravVurderingFrist < trengerOppfolgingFrist
? aktivitetskravVurderingFrist
: trengerOppfolgingFrist;
}

return aktivitetskravVurderingFrist || trengerOppfolgingFrist || null;
};

export const getLatestFrist = (personData: PersonData): Date | null => {
const { aktivitetskravVurderingFrist, trengerOppfolgingFrist } = personData;
if (aktivitetskravVurderingFrist && trengerOppfolgingFrist) {
return aktivitetskravVurderingFrist < trengerOppfolgingFrist
? trengerOppfolgingFrist
: aktivitetskravVurderingFrist;
}

return aktivitetskravVurderingFrist || trengerOppfolgingFrist || null;
};
98 changes: 98 additions & 0 deletions test/components/FristColumnTest.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
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';
import { toReadableDate } from '@/utils/dateUtils';

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,
};

const fristFormatRegex = /\b\d{2}\.\d{2}\.\d{4}\b/;

describe('FristColumn', () => {
it('viser ingen frister når person har hverken aktivitetskrav AVVENT med frist eller trenger oppfolging med frist', () => {
const personUtenFrister: PersonData = { ...defaultPersonData };
render(<FristColumn personData={personUtenFrister} />);

expect(screen.queryAllByText(fristFormatRegex)).to.be.empty;
});

it('viser ingen frist for person når aktivitetskrav har frist, men ikke AVVENT', () => {
const aktivitetskravVurderingFrist = new Date('2023-12-18');
const personForhandsvarselMedFrist: PersonData = {
...defaultPersonData,
aktivitetskrav: AktivitetskravStatus.FORHANDSVARSEL,
aktivitetskravVurderingFrist: aktivitetskravVurderingFrist,
};
render(<FristColumn personData={personForhandsvarselMedFrist} />);

expect(screen.queryByText(toReadableDate(aktivitetskravVurderingFrist))).to
.not.exist;
});

it('viser frist for person når aktivitetskrav AVVENT med frist', () => {
const aktivitetskravVurderingFrist = new Date('2023-12-18');
const personAvventerMedFrist: PersonData = {
...defaultPersonData,
aktivitetskrav: AktivitetskravStatus.AVVENT,
aktivitetskravVurderingFrist: aktivitetskravVurderingFrist,
};
render(<FristColumn personData={personAvventerMedFrist} />);

expect(screen.getByText(toReadableDate(aktivitetskravVurderingFrist))).to
.exist;
});

it('viser frist for person når trenger oppfolging frist-dato er satt', () => {
const trengerOppfolgingFrist = new Date('2023-12-31');
const personTrengerOppfolgingMedFrist: PersonData = {
...defaultPersonData,
trengerOppfolgingFrist: trengerOppfolgingFrist,
};
render(<FristColumn personData={personTrengerOppfolgingMedFrist} />);

expect(screen.getByText(toReadableDate(trengerOppfolgingFrist))).to.exist;
});

it('viser tidligste frist først når person har flere frister', () => {
const aktivitetskravVurderingFrist = new Date('2023-12-10');
const trengerOppfolgingFrist = new Date('2023-12-05');
const personMedFlereFrister: PersonData = {
...defaultPersonData,
aktivitetskrav: AktivitetskravStatus.AVVENT,
aktivitetskravVurderingFrist: aktivitetskravVurderingFrist,
trengerOppfolgingFrist: trengerOppfolgingFrist,
};

render(<FristColumn personData={personMedFlereFrister} />);

const allFrister = screen.getAllByText(fristFormatRegex);
expect(allFrister).to.have.length(2);
expect(allFrister[0]?.textContent).to.eq(
toReadableDate(trengerOppfolgingFrist)
);
expect(allFrister[1]?.textContent).to.eq(
toReadableDate(aktivitetskravVurderingFrist)
);
});
});
Loading

0 comments on commit 92709c7

Please sign in to comment.