diff --git a/src/api/types/personoversiktTypes.ts b/src/api/types/personoversiktTypes.ts
index 53625d82..26cfa171 100644
--- a/src/api/types/personoversiktTypes.ts
+++ b/src/api/types/personoversiktTypes.ts
@@ -107,3 +107,19 @@ export enum Oppfolgingsgrunn {
VURDER_ANNEN_YTELSE = 'VURDER_ANNEN_YTELSE',
ANNET = 'ANNET',
}
+
+export const oppfolgingsgrunnToString = {
+ [Oppfolgingsgrunn.TA_KONTAKT_SYKEMELDT]: 'Ta kontakt med den sykmeldte',
+ [Oppfolgingsgrunn.TA_KONTAKT_ARBEIDSGIVER]: 'Ta kontakt med arbeidsgiver',
+ [Oppfolgingsgrunn.TA_KONTAKT_BEHANDLER]: 'Ta kontakt med behandler',
+ [Oppfolgingsgrunn.VURDER_DIALOGMOTE_SENERE]: 'Vurder behov for dialogmøte',
+ [Oppfolgingsgrunn.FOLG_OPP_ETTER_NESTE_SYKMELDING]:
+ 'Følg opp etter neste sykmelding',
+ [Oppfolgingsgrunn.VURDER_TILTAK_BEHOV]: 'Vurder behov for tiltak',
+ [Oppfolgingsgrunn.VURDER_ARBEIDSUFORHET]: 'Vurder §8-4 - Arbeidsuførhet',
+ [Oppfolgingsgrunn.FRISKMELDING_TIL_ARBEIDSFORMIDLING]:
+ 'Vurder §8-5 - Friskmelding til arbeidsformidling',
+ [Oppfolgingsgrunn.VURDER_14A]: 'Vurder §14a',
+ [Oppfolgingsgrunn.VURDER_ANNEN_YTELSE]: 'Vurder annen ytelse',
+ [Oppfolgingsgrunn.ANNET]: 'Annet',
+};
diff --git a/src/components/FristColumn.tsx b/src/components/FristDataCell.tsx
similarity index 63%
rename from src/components/FristColumn.tsx
rename to src/components/FristDataCell.tsx
index de7348fd..68947911 100644
--- a/src/components/FristColumn.tsx
+++ b/src/components/FristDataCell.tsx
@@ -5,12 +5,16 @@ import {
FileTextIcon,
HourglassTopFilledIcon,
} from '@navikt/aksel-icons';
-import React, { ReactElement } from 'react';
+import React, { ReactElement, useState } from 'react';
import {
AktivitetskravStatus,
- Oppfolgingsgrunn,
+ oppfolgingsgrunnToString,
} from '@/api/types/personoversiktTypes';
-import { Tooltip } from '@navikt/ds-react';
+import { Button, Table, Tooltip } from '@navikt/ds-react';
+import OppfolgingsoppgaveModal from '@/components/OppfolgingsoppgaveModal';
+import * as Amplitude from '@/utils/amplitude';
+import { useTabType } from '@/context/tab/TabTypeContext';
+import { OverviewTabType } from '@/konstanter';
const texts = {
tooltipAvventer: 'Avventer til',
@@ -21,8 +25,14 @@ const texts = {
aktivitetskravvarselFrist: 'Aktivitetskrav: Svarfrist forhåndsvarsel',
};
-interface FristColumnProps {
- personData: PersonData;
+function logOppfolgingsOppgaveModalOpenEvent() {
+ Amplitude.logEvent({
+ type: Amplitude.EventType.ButtonClick,
+ data: {
+ url: window.location.href,
+ tekst: 'Åpnet oppfølgingsoppgave modal',
+ },
+ });
}
type Frist = {
@@ -31,49 +41,21 @@ type Frist = {
tooltip: string;
};
-const byFristAsc = (fristA: Frist, fristB: Frist) => {
+function byFristAsc(fristA: Frist, fristB: Frist) {
return fristA.date > fristB.date ? 1 : -1;
-};
-
-const oppfolgingsgrunnTekster = (
- oppfolgingsgrunn: Oppfolgingsgrunn
-): string => {
- switch (oppfolgingsgrunn) {
- case Oppfolgingsgrunn.TA_KONTAKT_SYKEMELDT:
- return 'Ta kontakt med den sykmeldte';
- case Oppfolgingsgrunn.TA_KONTAKT_ARBEIDSGIVER:
- return 'Ta kontakt med arbeidsgiver';
- case Oppfolgingsgrunn.TA_KONTAKT_BEHANDLER:
- return 'Ta kontakt med behandler';
- case Oppfolgingsgrunn.VURDER_DIALOGMOTE_SENERE:
- return 'Vurder behov for dialogmøte';
- case Oppfolgingsgrunn.FOLG_OPP_ETTER_NESTE_SYKMELDING:
- return 'Følg opp etter neste sykmelding';
- case Oppfolgingsgrunn.VURDER_TILTAK_BEHOV:
- return 'Vurder behov for tiltak';
- case Oppfolgingsgrunn.VURDER_ARBEIDSUFORHET:
- return 'Vurder §8-4 - Arbeidsuførhet';
- case Oppfolgingsgrunn.FRISKMELDING_TIL_ARBEIDSFORMIDLING:
- return 'Vurder §8-5 - Friskmelding til arbeidsformidling';
- case Oppfolgingsgrunn.VURDER_14A:
- return 'Vurder §14a';
- case Oppfolgingsgrunn.VURDER_ANNEN_YTELSE:
- return 'Vurder annen ytelse';
- case Oppfolgingsgrunn.ANNET:
- return 'Annet';
- default:
- return 'Ukjent oppfølgingsgrunn';
- }
-};
+}
-export const FristColumn = ({ personData }: FristColumnProps) => {
- const {
+function fristerInfo(
+ {
oppfolgingsoppgave,
friskmeldingTilArbeidsformidlingFom,
arbeidsuforhetvurdering,
aktivitetskravvurdering,
manglendeMedvirkning,
- } = personData;
+ }: PersonData,
+ setIsModalOpen: (open: boolean) => void,
+ selectedTab: OverviewTabType
+): Frist[] {
const frister: Frist[] = [];
const aktivitetskravStatus = aktivitetskravvurdering?.status;
const aktivitetskravVurderingFrist =
@@ -108,11 +90,24 @@ export const FristColumn = ({ personData }: FristColumnProps) => {
}
if (oppfolgingsoppgave?.frist) {
frister.push({
- icon: () => ,
+ icon: () =>
+ selectedTab === OverviewTabType.MY_OVERVIEW ? (
+ }
+ className="mr-1"
+ onClick={() => {
+ logOppfolgingsOppgaveModalOpenEvent();
+ setIsModalOpen(true);
+ }}
+ />
+ ) : (
+
+ ),
date: oppfolgingsoppgave.frist,
- tooltip: `${oppfolgingsgrunnTekster(
- oppfolgingsoppgave.oppfolgingsgrunn
- )}`,
+ tooltip: `${
+ oppfolgingsgrunnToString[oppfolgingsoppgave.oppfolgingsgrunn]
+ }`,
});
}
@@ -139,9 +134,20 @@ export const FristColumn = ({ personData }: FristColumnProps) => {
tooltip: texts.manglendeMedvirkningVarselFrist,
});
}
+ return frister;
+}
+
+interface Props {
+ personData: PersonData;
+}
+
+export function FristDataCell({ personData }: Props) {
+ const [isModalOpen, setIsModalOpen] = useState(false);
+ const { selectedTab } = useTabType();
+ const frister: Frist[] = fristerInfo(personData, setIsModalOpen, selectedTab);
return (
- <>
+
{frister.sort(byFristAsc).map(({ date, icon, tooltip }, index) => (
@@ -150,6 +156,14 @@ export const FristColumn = ({ personData }: FristColumnProps) => {
{toReadableDate(date)}
))}
- >
+ {personData.oppfolgingsoppgave && (
+
+ )}
+
);
-};
+}
diff --git a/src/components/HendelseFilterPanel.tsx b/src/components/HendelseFilterPanel.tsx
index 48b875bd..d8670fa6 100644
--- a/src/components/HendelseFilterPanel.tsx
+++ b/src/components/HendelseFilterPanel.tsx
@@ -234,12 +234,12 @@ function CheckboxLabel({ labelText, antallHendelser }: CheckboxLabelProps) {
export function HendelseFilterPanel({ personRegister }: Props) {
const { toggles } = useFeatureToggles();
const { filterState, dispatch: dispatchFilterAction } = useFilters();
- const { tabType } = useTabType();
+ const { selectedTab } = useTabType();
const checkboxElements = hendelseCheckboxes(
personRegister,
filterState,
- tabType,
+ selectedTab,
toggles
).filter((checkboksElement) => checkboksElement.isVisible);
diff --git a/src/components/NewOversiktTable.tsx b/src/components/NewOversiktTable.tsx
index a0063079..5b35e9a6 100644
--- a/src/components/NewOversiktTable.tsx
+++ b/src/components/NewOversiktTable.tsx
@@ -4,7 +4,7 @@ import { VeilederColumn } from '@/components/VeilederColumn';
import { PersonData } from '@/api/types/personregisterTypes';
import { PersonRadVirksomhetColumn } from '@/components/PersonRadVirksomhetColumn';
import { OppfolgingstilfelleDTO } from '@/api/types/personoversiktTypes';
-import { FristColumn } from '@/components/FristColumn';
+import { FristDataCell } from '@/components/FristDataCell';
import { Sorting, SortingKey, useSorting } from '@/hooks/useSorting';
import { LinkSyfomodiaperson } from '@/components/LinkSyfomodiaperson';
import { toLastnameFirstnameFormat } from '@/utils/stringUtil';
@@ -14,13 +14,13 @@ import { OverviewTabType } from '@/konstanter';
import * as Amplitude from '@/utils/amplitude';
import { EventType } from '@/utils/amplitude';
-const getVarighetOppfolgingstilfelle = (
+function getVarighetOppfolgingstilfelle(
oppfolgingstilfelle: OppfolgingstilfelleDTO | undefined
-): string => {
+): string {
return oppfolgingstilfelle
? `${oppfolgingstilfelle.varighetUker} uker`
: 'Ukjent';
-};
+}
interface Props {
personListe: [string, PersonData][];
@@ -30,17 +30,17 @@ interface Props {
setSorting: (sorting: Sorting) => void;
}
-export const NewOversiktTable = ({
+export function NewOversiktTable({
personListe,
selectedRows,
setSelectedRows,
sorting,
setSorting,
-}: Props): ReactElement => {
+}: Props): ReactElement {
const { columns } = useSorting();
- const { tabType } = useTabType();
+ const { selectedTab } = useTabType();
- const handleSort = (sortKey: string | undefined) => {
+ function handleSort(sortKey: string | undefined) {
let direction: 'none' | 'ascending' | 'descending';
if (sortKey === sorting.orderBy && sorting.direction === 'descending') {
direction = 'none';
@@ -64,27 +64,27 @@ export const NewOversiktTable = ({
retning: direction,
},
});
- };
+ }
const allRowsSelected = personListe.length === selectedRows.length;
const anyRowsSelected = selectedRows.length > 0;
const isRowSelected = (fnr: string) => selectedRows.includes(fnr);
- const toggleSelectedRow = (fnr: string) => {
+ function toggleSelectedRow(fnr: string) {
if (isRowSelected(fnr)) {
setSelectedRows(selectedRows.filter((value) => value !== fnr));
} else {
setSelectedRows([...selectedRows, fnr]);
}
- };
+ }
- const toggleSelectAllRows = () => {
+ function toggleSelectAllRows() {
if (anyRowsSelected) {
setSelectedRows([]);
} else {
setSelectedRows(personListe.map(([fnr]) => fnr));
}
- };
+ }
return (
- tabType === OverviewTabType.ENHET_OVERVIEW ||
+ selectedTab === OverviewTabType.ENHET_OVERVIEW ||
column.sortKey !== 'VEILEDER'
)
.map((col, index) => (
@@ -156,7 +156,7 @@ export const NewOversiktTable = ({
- {tabType === OverviewTabType.ENHET_OVERVIEW && (
+ {selectedTab === OverviewTabType.ENHET_OVERVIEW && (
@@ -166,9 +166,7 @@ export const NewOversiktTable = ({
persondata.latestOppfolgingstilfelle
)}
-
-
-
+
);
-};
+}
diff --git a/src/components/OppfolgingsoppgaveModal.tsx b/src/components/OppfolgingsoppgaveModal.tsx
new file mode 100644
index 00000000..4795dff2
--- /dev/null
+++ b/src/components/OppfolgingsoppgaveModal.tsx
@@ -0,0 +1,55 @@
+import React from 'react';
+import { BodyLong, BodyShort, Label, Modal } from '@navikt/ds-react';
+import {
+ oppfolgingsgrunnToString,
+ OppfolgingsoppgaveDTO,
+} from '@/api/types/personoversiktTypes';
+import { toReadableDate } from '@/utils/dateUtils';
+
+const texts = {
+ header: 'Oppfølgingsoppgave',
+ oppfolgingsgrunn: 'Oppfølgingsgrunn',
+ frist: 'Frist',
+};
+
+interface Props {
+ isOpen: boolean;
+ setOpen: (open: boolean) => void;
+ oppfolgingsoppgave: OppfolgingsoppgaveDTO;
+ sykmeldtNavn: string;
+}
+
+export default function OppfolgingsoppgaveModal({
+ isOpen,
+ setOpen,
+ oppfolgingsoppgave,
+ sykmeldtNavn,
+}: Props) {
+ return (
+ setOpen(false)}
+ header={{
+ label: sykmeldtNavn,
+ heading: texts.header,
+ }}
+ >
+
+
+
+ {oppfolgingsgrunnToString[oppfolgingsoppgave.oppfolgingsgrunn]}
+
+ {oppfolgingsoppgave.tekst}
+
+ {toReadableDate(oppfolgingsoppgave.frist)}
+
+
+ );
+}
diff --git a/src/components/Sokeresultat.tsx b/src/components/Sokeresultat.tsx
index 230cf1ce..8cb5fc9a 100644
--- a/src/components/Sokeresultat.tsx
+++ b/src/components/Sokeresultat.tsx
@@ -34,7 +34,7 @@ const lagListe = (
const Sokeresultat = ({ allEvents }: SokeresultatProps) => {
const tildelVeileder = useTildelVeileder();
const { filterState } = useFilters();
- const { tabType } = useTabType();
+ const { selectedTab } = useTabType();
const [markertePersoner, setMarkertePersoner] = useState([]);
const [startItem, setStartItem] = useState(0);
@@ -42,10 +42,10 @@ const Sokeresultat = ({ allEvents }: SokeresultatProps) => {
useEffect(() => {
setMarkertePersoner([]);
- }, [tabType]);
+ }, [selectedTab]);
const selectedHendelsetypeFilter =
- tabType === OverviewTabType.MY_OVERVIEW
+ selectedTab === OverviewTabType.MY_OVERVIEW
? {
...filterState.selectedHendelseType,
ufordeltBruker: false,
diff --git a/src/components/toolbar/AssignVeileder/TildelVeileder.tsx b/src/components/toolbar/AssignVeileder/TildelVeileder.tsx
index ca003d3f..853732a0 100644
--- a/src/components/toolbar/AssignVeileder/TildelVeileder.tsx
+++ b/src/components/toolbar/AssignVeileder/TildelVeileder.tsx
@@ -35,11 +35,11 @@ const TildelVeileder = ({
const [showList, setShowList] = useState(false);
const [veilederIsChosen, setVeilederIsChosen] = useState(false);
const [showError, setShowError] = useState(false);
- const { tabType } = useTabType();
+ const { selectedTab } = useTabType();
useEffect(() => {
setShowList(false);
- }, [tabType]);
+ }, [selectedTab]);
const resetStateToDefault = () => {
setChosenVeilederIdent('');
diff --git a/src/components/toolbar/Toolbar.tsx b/src/components/toolbar/Toolbar.tsx
index c191f4e6..6ab299e7 100644
--- a/src/components/toolbar/Toolbar.tsx
+++ b/src/components/toolbar/Toolbar.tsx
@@ -45,7 +45,7 @@ interface ToolbarProps extends ToolbarWrapperProps {
}
const Toolbar = (props: ToolbarProps) => {
- const { tabType } = useTabType();
+ const { selectedTab } = useTabType();
return (
@@ -56,7 +56,7 @@ const Toolbar = (props: ToolbarProps) => {
handleTildelVeileder={props.buttonHandler}
handleSelectAll={props.checkAllHandler}
/>
- {tabType === OverviewTabType.ENHET_OVERVIEW && }
+ {selectedTab === OverviewTabType.ENHET_OVERVIEW && }
{
const aktivVeilederQuery = useAktivVeilederQuery();
const { filterState } = useFilters();
- const { tabType } = useTabType();
+ const { selectedTab } = useTabType();
const personData: PersonregisterState = toPersonData(
personoversiktData,
@@ -58,7 +58,7 @@ export const Oversikt = ({
);
const eventFilterValue =
- tabType === OverviewTabType.MY_OVERVIEW
+ selectedTab === OverviewTabType.MY_OVERVIEW
? [aktivVeilederQuery.data?.ident || '']
: filterState.selectedVeilederIdents;
diff --git a/src/context/tab/TabTypeContext.tsx b/src/context/tab/TabTypeContext.tsx
index 8e663e82..60575216 100644
--- a/src/context/tab/TabTypeContext.tsx
+++ b/src/context/tab/TabTypeContext.tsx
@@ -5,10 +5,10 @@ import { OverviewTabType } from '@/konstanter';
type TabTypeProviderProps = { children: React.ReactNode };
export const TabTypeContext = React.createContext<{
- tabType: OverviewTabType;
+ selectedTab: OverviewTabType;
setTabType: (tabType: OverviewTabType) => void;
}>({
- tabType: OverviewTabType.ENHET_OVERVIEW,
+ selectedTab: OverviewTabType.ENHET_OVERVIEW,
setTabType: () => undefined,
});
@@ -16,7 +16,7 @@ const TabTypeProvider = ({ children }: TabTypeProviderProps) => {
const [tabType, setTabType] = useState(OverviewTabType.ENHET_OVERVIEW);
return (
-
+
{children}
);
diff --git a/test/components/FristColumnTest.tsx b/test/components/FristColumnTest.tsx
index 81e0b48f..865cc13f 100644
--- a/test/components/FristColumnTest.tsx
+++ b/test/components/FristColumnTest.tsx
@@ -1,5 +1,5 @@
import { render, screen } from '@testing-library/react';
-import { FristColumn } from '@/components/FristColumn';
+import { FristDataCell } from '@/components/FristDataCell';
import React from 'react';
import { PersonData, Skjermingskode } from '@/api/types/personregisterTypes';
import { testdata } from '../data/fellesTestdata';
@@ -33,7 +33,7 @@ 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 oppfolgingsoppgave med frist', () => {
const personUtenFrister: PersonData = { ...defaultPersonData };
- render();
+ render();
expect(screen.queryAllByText(fristFormatRegex)).to.be.empty;
});
@@ -52,7 +52,7 @@ describe('FristColumn', () => {
],
},
};
- render();
+ render();
expect(screen.getByText(toReadableDate(aktivitetskravVurderingFrist))).to
.exist;
@@ -64,9 +64,10 @@ describe('FristColumn', () => {
...defaultPersonData,
oppfolgingsoppgave,
};
- render();
+ render();
- expect(screen.getByText(toReadableDate(oppfolgingsoppgave.frist))).to.exist;
+ expect(screen.getAllByText(toReadableDate(oppfolgingsoppgave.frist))).to
+ .exist;
});
it('viser frist for person når friskmelding til arbeidsformidling fom-dato er satt', () => {
@@ -75,7 +76,9 @@ describe('FristColumn', () => {
...defaultPersonData,
friskmeldingTilArbeidsformidlingFom,
};
- render();
+ render(
+
+ );
expect(
screen.getByText(toReadableDate(friskmeldingTilArbeidsformidlingFom))
@@ -92,7 +95,7 @@ describe('FristColumn', () => {
},
},
};
- render();
+ render();
expect(screen.getByText(toReadableDate(svarfrist))).to.exist;
});
@@ -116,10 +119,10 @@ describe('FristColumn', () => {
friskmeldingTilArbeidsformidlingFom,
};
- render();
+ render();
const allFrister = screen.getAllByText(fristFormatRegex);
- expect(allFrister).to.have.length(3);
+ expect(allFrister).to.have.length(4); // 3 frister i oversikten + 1 i modal for oppfølgingsoppgave som finnes i DOM
expect(allFrister[0]?.textContent).to.eq(
toReadableDate(oppfolgingsoppgave.frist)
);
@@ -146,7 +149,7 @@ describe('FristColumn', () => {
],
},
};
- render();
+ render();
expect(screen.getByText(toReadableDate(aktivitetskravVurderingFrist))).to
.exist;
@@ -168,7 +171,7 @@ describe('FristColumn', () => {
],
},
};
- render();
+ render();
expect(
screen.getByText(toReadableDate(aktivitetskravSvarfristForhandsvarsel))
@@ -192,7 +195,7 @@ describe('FristColumn', () => {
],
},
};
- render();
+ render();
expect(screen.getByText(toReadableDate(svarfristForhandsvarselVis))).to
.exist;
@@ -217,7 +220,7 @@ describe('FristColumn', () => {
],
},
};
- render();
+ render();
expect(screen.getByText(toReadableDate(aktivitetskravAvventFristVis))).to
.exist;
diff --git a/test/components/HendelseTypeFilter.test.tsx b/test/components/HendelseTypeFilter.test.tsx
index e58d3461..c5d030bf 100644
--- a/test/components/HendelseTypeFilter.test.tsx
+++ b/test/components/HendelseTypeFilter.test.tsx
@@ -128,7 +128,7 @@ describe('HendelseTypeFilter', () => {
void 0,
}}
>