Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ const AktivitetvisningContainer = () => {

return (
<DirtyProvider>
<AktivitetvisningModal aktivitet={valgtAktivitet} avhengigheter={avhengigheter}>
<AktivitetvisningModal avhengigheter={avhengigheter}>
{valgtAktivitet ? (
<Aktivitetvisning aktivitet={valgtAktivitet} tillatEndring={tillatEndring} laster={laster} />
) : (
Expand Down
5 changes: 3 additions & 2 deletions src/moduler/aktivitet/visning/AktivitetvisningModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,20 @@ import { selectErBruker } from '../../identitet/identitet-selector';
import { selectAktivitetFeilmeldinger } from '../aktivitet-selector';
import { selectArenaFeilmeldinger } from '../arena-aktivitet-selector';
import { skalMarkereForhaandsorienteringSomLest } from './avtalt-container/utilsForhaandsorientering';
import { useSelectedAktivitet } from './useSelectedAktivitet';

const DIALOG_TEKST = 'Alle endringer blir borte hvis du ikke lagrer. Er du sikker på at du vil lukke siden?';

interface Props {
aktivitet?: AlleAktiviteter;
avhengigheter: Avhengighet[];
children: React.ReactNode;
}

const emptySelector = () => [];

const AktivitetvisningModal = (props: Props) => {
const { aktivitet, avhengigheter, children } = props;
const { avhengigheter, children } = props;
const aktivitet = useSelectedAktivitet();
const dirty = useContext(DirtyContext);
const navigate = useNavigate();
const { hovedsideRoute } = useRoutes();
Expand Down
68 changes: 38 additions & 30 deletions src/moduler/aktivitet/visning/referat/ReferatContainer.tsx
Original file line number Diff line number Diff line change
@@ -1,67 +1,75 @@
import { isAfter, parseISO } from 'date-fns';
import { isBefore, parseISO, subMinutes } from 'date-fns';
import React, { useState } from 'react';
import { useSelector } from 'react-redux';

import { MOTE_TYPE, SAMTALEREFERAT_TYPE } from '../../../../constant';
import { Status } from '../../../../createGenericSlice';
import { MOTE_TYPE } from '../../../../constant';
import { AktivitetStatus } from '../../../../datatypes/aktivitetTypes';
import { MoteAktivitet, SamtalereferatAktivitet } from '../../../../datatypes/internAktivitetTypes';
import {
MoteAktivitet,
SamtalereferatAktivitet,
VeilarbAktivitetType,
} from '../../../../datatypes/internAktivitetTypes';
import useAppDispatch from '../../../../felles-komponenter/hooks/useAppDispatch';
import { useErVeileder } from '../../../../Provider';
import { selectErUnderOppfolging } from '../../../oppfolging-status/oppfolging-selector';
import { publiserReferat } from '../../aktivitet-actions';
import { selectAktivitetStatus } from '../../aktivitet-selector';
import OppdaterReferatForm from './OppdaterReferatForm';
import ReferatVisning from './ReferatVisning';

interface Props {
aktivitet: MoteAktivitet | SamtalereferatAktivitet;
}

const sjekkErFullførtEllerAvbrutt = (status: AktivitetStatus) =>
[AktivitetStatus.AVBRUTT, AktivitetStatus.FULLFOERT].includes(status);

const sjekKanIkkeHaReferat = (
aktivitetType: VeilarbAktivitetType.MOTE_TYPE | VeilarbAktivitetType.SAMTALEREFERAT_TYPE,
fraDato: string,
erFullfortEllerAvbrutt: boolean,
) => {
/* Kan ikke opprette referat på møter som ikke har vært */
if (aktivitetType === MOTE_TYPE && !erFullfortEllerAvbrutt) {
const now = new Date();
const fraDatoMedSlack = subMinutes(parseISO(fraDato), 15);
return isBefore(now, fraDatoMedSlack);
} else {
return false;
}
};

const ReferatContainer = (props: Props) => {
const { aktivitet } = props;
const { referat, erReferatPublisert, type: aktivitetType } = aktivitet;

const dispatch = useAppDispatch();
const [isOppdaterReferat, setOppdaterReferat] = useState(false);
const [oppdatererReferat, setOppdatererReferat] = useState(false);

const publiserer = useSelector(selectAktivitetStatus) === (Status.PENDING || Status.RELOADING);
const erVeileder = useErVeileder();
const underOppfolging = useSelector(selectErUnderOppfolging);

const { referat, erReferatPublisert, type: aktivitetType } = aktivitet;

const erFullførtEllerAvbrutt = [AktivitetStatus.AVBRUTT, AktivitetStatus.FULLFOERT].includes(aktivitet.status);
const kanHaReferat =
(aktivitetType === MOTE_TYPE && (isAfter(new Date(), parseISO(aktivitet.fraDato)) || erFullførtEllerAvbrutt)) ||
aktivitetType === SAMTALEREFERAT_TYPE;

const erAktivAktivitet =
!aktivitet.historisk &&
underOppfolging &&
aktivitet.status !== AktivitetStatus.AVBRUTT &&
aktivitet.status !== AktivitetStatus.FULLFOERT;

if (!kanHaReferat) return null;

const erFullførtEllerAvbrutt = sjekkErFullførtEllerAvbrutt(aktivitet.status);
const kanIkkeHaReferatEnda = sjekKanIkkeHaReferat(aktivitetType, aktivitet.fraDato, erFullførtEllerAvbrutt);
const erAktivAktivitet = !aktivitet.historisk && underOppfolging && !erFullførtEllerAvbrutt;
const manglerReferat = erVeileder && !referat && erAktivAktivitet;
if (manglerReferat || isOppdaterReferat) {
return <OppdaterReferatForm aktivitet={aktivitet} onFerdig={() => setOppdaterReferat(false)} />;
}

if (referat) {
if (kanIkkeHaReferatEnda) {
return null;
} else if (manglerReferat || oppdatererReferat) {
return <OppdaterReferatForm aktivitet={aktivitet} onFerdig={() => setOppdatererReferat(false)} />;
} else if (referat) {
return (
<ReferatVisning
referat={referat}
erAktivAktivitet={erAktivAktivitet}
dispatchPubliserReferat={() => dispatch(publiserReferat(aktivitet))}
publiserer={publiserer}
erReferatPublisert={erReferatPublisert}
startOppdaterReferat={() => setOppdaterReferat(true)}
startOppdaterReferat={() => setOppdatererReferat(true)}
/>
);
} else {
return null;
}

return null;
};

export default ReferatContainer;
9 changes: 5 additions & 4 deletions src/moduler/aktivitet/visning/referat/ReferatVisning.tsx
Original file line number Diff line number Diff line change
@@ -1,26 +1,27 @@
import { Alert, Button, Heading } from '@navikt/ds-react';
import React from 'react';
import { useSelector } from 'react-redux';
import { useDispatch, useSelector } from 'react-redux';

import EkspanderbartTekstomrade from '../../../../felles-komponenter/EkspanderbartTekstomrade';
import { div as HiddenIfDiv } from '../../../../felles-komponenter/hidden-if/hidden-if';
import { useErVeileder } from '../../../../Provider';
import { selectPubliserReferatFeil } from '../../../feilmelding/feil-selector';
import Feilmelding from '../../../feilmelding/Feilmelding';
import { selectAktivitetStatus } from '../../aktivitet-selector';
import { Status } from '../../../../createGenericSlice';

interface Props {
referat: string;
erAktivAktivitet: boolean;
dispatchPubliserReferat: () => void;
publiserer: boolean;
erReferatPublisert: boolean;
startOppdaterReferat: () => void;
}

const ReferatVisning = (props: Props) => {
const publiserer = useSelector(selectAktivitetStatus) === (Status.PENDING || Status.RELOADING);
const erVeileder = useErVeileder();
const { erAktivAktivitet, referat, dispatchPubliserReferat, publiserer, erReferatPublisert, startOppdaterReferat } =
props;
const { erAktivAktivitet, referat, dispatchPubliserReferat, erReferatPublisert, startOppdaterReferat } = props;

const feil = useSelector(selectPubliserReferatFeil);

Expand Down
10 changes: 10 additions & 0 deletions src/moduler/aktivitet/visning/useSelectedAktivitet.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { useParams } from 'react-router-dom';
import { useSelector } from 'react-redux';
import { selectAktivitetMedId } from '../aktivitetlisteSelector';
import { RootState } from '../../../store';

export const useSelectedAktivitet = () => {
const { id } = useParams<{ id: string }>();
const aktivitetId = id;
return useSelector((state: RootState) => (aktivitetId ? selectAktivitetMedId(state, aktivitetId) : undefined));
};
Loading