Skip to content

Commit

Permalink
Feat/404 (#1259)
Browse files Browse the repository at this point in the history
* feat. fikset routing og satt opp data-routing fra react-router

* feat. Håndtere 404 feil fra API og la opp default route for 404

* feat. få annullering av avtaler i retur
eirikv authored Oct 23, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
1 parent f95f3b8 commit 603cce1
Showing 33 changed files with 467 additions and 385 deletions.
122 changes: 4 additions & 118 deletions src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,124 +1,10 @@
import AvtaleFetcher from '@/AvtaleSide/AvtaleFetcher';
import AlleredeOpprettetAvtaleProvider from '@/komponenter/alleredeOpprettetTiltak/api/AlleredeOpprettetAvtaleProvider';
import Oversikt from '@/Oversikt';
import * as React from 'react';
import { BrowserRouter, Route, Routes } from 'react-router-dom';
import AdvarselBannerTestversjon from './AdvarselBannerTestversjon/AdvarselBannerTestversjon';
import AvtaleProvider from './AvtaleProvider';
import AvtaleSide from './AvtaleSide/AvtaleSide';
import BeslutterSide from './BeslutterSide/BeslutterSide';
import { FeatureToggleProvider } from './FeatureToggleProvider';
import { FeilVarselProvider } from './FeilVarselProvider';
import Informasjonsside from './Informasjonsside/Informasjonsside';
import InnloggingBoundary from './InnloggingBoundary/InnloggingBoundary';
import { VarselOmNedetid } from './InnloggingBoundary/VarselOmNedetid';
import ErrorBoundary from './komponenter/ErrorBoundary';
import Slettemerk from './komponenter/Slettemerk';
import { NotifikasjonWidgetProvider } from './NotifikasjonWidgetProvider';
import OpprettAvtaleArbeidsgiver from './OpprettAvtale/OpprettAvtaleArbeidsgiver/OpprettAvtaleArbeidsgiver';
import OpprettAvtaleVeileder from './OpprettAvtale/OpprettAvtaleVeileder/OpprettAvtaleVeileder';
import { RouterProvider } from 'react-router-dom';

import {
basename,
pathTilAvtale,
pathTilInformasjonssideInnlogget,
pathTilInformasjonssideUinnlogget,
pathTilOpprettAvtale,
pathTilOpprettAvtaleArbeidsgiver,
pathTilStegIAvtale,
} from './paths';
import RedirectEtterLogin from './RedirectEtterLogin';
import router from './Router';

class App extends React.Component {
render() {
return (
<ErrorBoundary>
<BrowserRouter basename={basename}>
<AdvarselBannerTestversjon />
<VarselOmNedetid />
<Routes>
<Route path={pathTilInformasjonssideUinnlogget} element={<Informasjonsside />} />
<Route
path="*"
element={
<FeilVarselProvider>
<InnloggingBoundary>
<FeatureToggleProvider>
<RedirectEtterLogin>
<AlleredeOpprettetAvtaleProvider>
<NotifikasjonWidgetProvider>
<Routes>
<Route path="/" element={<Oversikt />} />
<Route
path={pathTilInformasjonssideInnlogget}
element={<Informasjonsside />}
/>
<Route
path={pathTilOpprettAvtale}
element={<OpprettAvtaleVeileder />}
/>
<Route
path={pathTilOpprettAvtaleArbeidsgiver}
element={<OpprettAvtaleArbeidsgiver />}
/>
</Routes>
<Routes>
<Route
path={pathTilAvtale(':avtaleId/*')}
element={
<AvtaleProvider>
<AvtaleFetcher>
<Routes>
<Route
path="/"
element={<AvtaleSide />}
/>
<Route
path="/:stegPath"
element={<AvtaleSide />}
/>

<Route
path={`/beslutte/`}
element={<BeslutterSide />}
/>

<Route
path={`/beslutte/:tilskuddsperiodeId`}
element={<BeslutterSide />}
/>

<Route
path={`/slett`}
element={<Slettemerk />}
/>

<Route
path={pathTilStegIAvtale(
':avtaleId',
':stegPath',
)}
element={<AvtaleSide />}
/>
</Routes>
</AvtaleFetcher>
</AvtaleProvider>
}
/>
</Routes>
</NotifikasjonWidgetProvider>
</AlleredeOpprettetAvtaleProvider>
</RedirectEtterLogin>
</FeatureToggleProvider>
</InnloggingBoundary>
</FeilVarselProvider>
}
/>
</Routes>
</BrowserRouter>
</ErrorBoundary>
);
}
function App() {
return <RouterProvider router={router} />;
}

export default App;
47 changes: 24 additions & 23 deletions src/AvtaleOversikt/AvtaleOversikt.tsx
Original file line number Diff line number Diff line change
@@ -1,35 +1,36 @@
import { FunctionComponent, useContext, useEffect, useState } from 'react';
import { useSearchParams } from 'react-router-dom';
import { Pagination, Select } from '@navikt/ds-react';
import omit from 'lodash.omit';
import isEqual from 'lodash.isequal';

import './AvtaleOversikt.less';
import ArbeidsgiverFiltrering from '@/AvtaleOversikt/Filtrering/ArbeidsgiverFiltrering';
import AvtaleOversiktArbeidsgiverInformasjon from '@/AvtaleOversikt/AvtaleOversiktArbeidsgiverInformasjon';
import Avtaler from '@/AvtaleOversikt/Avtaler';
import ArbeidsgiverFiltrering from '@/AvtaleOversikt/Filtrering/ArbeidsgiverFiltrering';
import VeilederFiltrering from '@/AvtaleOversikt/Filtrering/VeilederFiltrering';
import { useFilter } from '@/AvtaleOversikt/Filtrering/useFilter';
import LesMerOmLøsningen from '@/AvtaleOversikt/LesMerOmLøsningen/LesMerOmLøsningen';
import useAvtaleOversiktLayout from '@/AvtaleOversikt/useAvtaleOversiktLayout';
import { InnloggetBrukerContext } from '@/InnloggingBoundary/InnloggingBoundary';
import PlussIkon from '@/assets/ikoner/pluss-tegn.svg?react';
import BEMHelper from '@/utils/bem';
import Banner from '@/komponenter/Banner/Banner';
import BannerNAVAnsatt from '@/komponenter/Banner/BannerNAVAnsatt';
import Dokumenttittel from '@/komponenter/Dokumenttittel';
import VerticalSpacer from '@/komponenter/layout/VerticalSpacer';
import LenkeKnapp from '@/komponenter/lenkeknapp/LenkeKnapp';
import { pathTilOpprettAvtale, pathTilOpprettAvtaleArbeidsgiver } from '@/paths';
import LesMerOmLøsningen from '@/AvtaleOversikt/LesMerOmLøsningen/LesMerOmLøsningen';
import PlussIkon from '@/assets/ikoner/pluss-tegn.svg?react';
import VeilederFiltrering from '@/AvtaleOversikt/Filtrering/VeilederFiltrering';
import VerticalSpacer from '@/komponenter/layout/VerticalSpacer';
import useAvtaleOversiktLayout from '@/AvtaleOversikt/useAvtaleOversiktLayout';
import { Avtale, PageableAvtale } from '@/types/avtale';
import { FiltreringContext } from './Filtrering/FiltreringProvider';
import { InnloggetBrukerContext } from '@/InnloggingBoundary/InnloggingBoundary';
import { Path } from '@/Router';
import { Status } from '@/types/nettressurs';
import { Varsel } from '@/types/varsel';
import { fjernTommeFelterFraObjekt, litenForbokstav } from '@/utils/stringUtils';
import { useFilter } from '@/AvtaleOversikt/Filtrering/useFilter';
import {
hentAvtalerForInnloggetBrukerMedPost,
hentAvtalerForInnloggetBrukerMedSokId,
hentUlesteVarsler,
} from '@/services/rest-service';
import { Avtale, PageableAvtale } from '@/types/avtale';
import { Status } from '@/types/nettressurs';
import { Varsel } from '@/types/varsel';
import BEMHelper from '@/utils/bem';
import { fjernTommeFelterFraObjekt, litenForbokstav } from '@/utils/stringUtils';
import { Pagination, Select } from '@navikt/ds-react';
import isEqual from 'lodash.isequal';
import omit from 'lodash.omit';
import { FunctionComponent, useContext, useEffect, useState } from 'react';
import { useSearchParams } from 'react-router-dom';
import './AvtaleOversikt.less';
import { FiltreringContext } from './Filtrering/FiltreringProvider';

const cls = BEMHelper('avtaleoversikt');
const clsPagination = BEMHelper('avtaleoversikt-pagination');
@@ -215,7 +216,7 @@ const AvtaleOversikt: FunctionComponent = () => {
{innloggetBruker.rolle === 'VEILEDER' && (
<aside style={layout.stylingAvFilter}>
<div style={{ margin: '0.2rem 0 1rem 0' }}>
<LenkeKnapp path={pathTilOpprettAvtale} icon={<PlussIkon />}>
<LenkeKnapp path={Path.OPPRETT_AVTALE} icon={<PlussIkon />}>
Opprett ny avtale
</LenkeKnapp>
</div>
@@ -228,7 +229,7 @@ const AvtaleOversikt: FunctionComponent = () => {
<aside style={layout.stylingAvFilter}>
{harTilgangerSomArbeidsgiver && (
<div style={{ margin: '0.2rem 0 1rem 0' }}>
<LenkeKnapp path={pathTilOpprettAvtaleArbeidsgiver} icon={<PlussIkon />}>
<LenkeKnapp path={Path.OPPRETT_AVTALE_ARBEIDSGIVER} icon={<PlussIkon />}>
Opprett ny avtale
</LenkeKnapp>
</div>
23 changes: 12 additions & 11 deletions src/AvtaleOversikt/AvtaleTabell.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
import React, { FunctionComponent, useState } from 'react';
import { useNavigate, generatePath } from 'react-router-dom';
import MediaQuery from 'react-responsive';

import './AvtaleTabell.less';
import AvtaleTabellRadHeader from '@/AvtaleOversikt/AvtaleTabellRadHeader';
import BEMHelper from '@/utils/bem';
import StatusIkon from '@/komponenter/StatusIkon/StatusIkon';
import { avtaleStatusTekst, tiltakstypeTekstKort } from '@/messages';
import { pathTilAvtaleNy } from '@/paths';
import TaushetserklæringModal from './Taushetserklæring/Taushetserklæring';
import { AvtaleMinimalListeVisning } from '@/types/avtale';
import { InnloggetBruker } from '@/types/innlogget-bruker';
import { Varsel } from '@/types/varsel';
import BEMHelper from '@/utils/bem';
import { BodyShort, Table } from '@navikt/ds-react';
import React, { FunctionComponent, useState } from 'react';
import MediaQuery from 'react-responsive';
import { useNavigate } from 'react-router-dom';
import TaushetserklæringModal from './Taushetserklæring/Taushetserklæring';
import './AvtaleTabell.less';
import { ChevronRightIcon } from '@navikt/aksel-icons';
import { InnloggetBruker } from '@/types/innlogget-bruker';
import { Path } from '@/Router';
import { Varsel } from '@/types/varsel';
import { avtaleStatusTekst, tiltakstypeTekstKort } from '@/messages';
import { kunStorForbokstav } from '@/utils/stringUtils';

const cls = BEMHelper('avtaletabell');
@@ -80,7 +81,7 @@ const AvtaleTabell: FunctionComponent<{
e.preventDefault();
} else {
navigate({
pathname: pathTilAvtaleNy(avtale.id, innloggetBruker.rolle),
pathname: generatePath(Path.AVTALE, { avtaleId: avtale.id }),
search: window.location.search,
});
}
21 changes: 11 additions & 10 deletions src/AvtaleOversikt/AvtalekortMobil.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import { Fragment, FunctionComponent, useState } from 'react';
import { useNavigate, generatePath } from 'react-router-dom';
import { LinkPanel, Heading, Ingress, BodyShort } from '@navikt/ds-react';
import moment from 'moment';

import './AvtalekortMobil.less';
import BEMHelper from '@/utils/bem';
import StatusIkon from '@/komponenter/StatusIkon/StatusIkon';
import TaushetserklæringModal from '@/AvtaleOversikt/Taushetserklæring/Taushetserklæring';
import VerticalSpacer from '@/komponenter/layout/VerticalSpacer';
import StatusIkon from '@/komponenter/StatusIkon/StatusIkon';
import { avtaleStatusTekst } from '@/messages';
import { pathTilAvtaleNy } from '@/paths';
import { AvtaleMinimalListeVisning } from '@/types/avtale';
import { InnloggetBruker } from '@/types/innlogget-bruker';
import { Path } from '@/Router';
import { Varsel } from '@/types/varsel';
import BEMHelper from '@/utils/bem';
import { LinkPanel, Heading, Ingress, BodyShort } from '@navikt/ds-react';
import moment from 'moment';
import { Fragment, FunctionComponent, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import './AvtalekortMobil.less';
import { avtaleStatusTekst } from '@/messages';

const cls = BEMHelper('avtalekortMobil');

@@ -43,7 +44,7 @@ const AvtalekortMobil: FunctionComponent<{
e.preventDefault();
} else {
navigate({
pathname: pathTilAvtaleNy(avtale.id),
pathname: generatePath(Path.AVTALE, { avtaleId: avtale.id }),
search: window.location.search,
});
}
11 changes: 6 additions & 5 deletions src/AvtaleOversikt/LesMerOmLøsningen/LesMerOmLøsningen.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import Info from '@/assets/ikoner/info.svg?react';
import { pathTilInformasjonssideInnloggetNy } from '@/paths';
import BEMHelper from '@/utils/bem';
import { LinkPanel, BodyShort } from '@navikt/ds-react';
import React, { FunctionComponent } from 'react';
import { LinkPanel, BodyShort } from '@navikt/ds-react';

import './LesMerOmLøsningen.less';
import BEMHelper from '@/utils/bem';
import Info from '@/assets/ikoner/info.svg?react';
import { basename, Path } from '@/Router';

const cls = BEMHelper('les-mer-om-løsningen');

const LesMerOmLøsningen: FunctionComponent = () => (
<>
<LinkPanel href={pathTilInformasjonssideInnloggetNy} className={cls.className}>
<LinkPanel href={`${basename}/${Path.INFORMASJONSSIDE}`} className={cls.className}>
<LinkPanel.Title>
<div style={{ display: 'flex' }}>
<Info width="24" height="24" />
4 changes: 2 additions & 2 deletions src/AvtaleProvider.tsx
Original file line number Diff line number Diff line change
@@ -119,9 +119,9 @@ const AvtaleProvider: FunctionComponent<PropsWithChildren> = (props) => {
RestService.hentAvtale(avtaleId).then(setAvtale);

const annullerAvtale = async (annullerGrunn: string): Promise<void> => {
await RestService.annullerAvtale(avtale, annullerGrunn);
const annullertAvtale = await RestService.annullerAvtale(avtale, annullerGrunn);
sendToAmplitude('#tiltak-avtale-annullert');
await hentAvtale();
setAvtale(annullertAvtale);
};

const overtaAvtale = async (): Promise<void> => {
5 changes: 5 additions & 0 deletions src/AvtaleSide/AvtaleFetcher.module.less
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
.container {
display: flex;
justify-content: center;
margin-top: 10rem;
}
48 changes: 32 additions & 16 deletions src/AvtaleSide/AvtaleFetcher.tsx
Original file line number Diff line number Diff line change
@@ -1,28 +1,44 @@
import { AvtaleContext } from '@/AvtaleProvider';
import amplitude from '@/utils/amplitude';
import React, { FunctionComponent, PropsWithChildren, useContext, useEffect, useState } from 'react';
import React, { FunctionComponent, PropsWithChildren, useEffect, useRef, useState } from 'react';
import { useParams } from 'react-router-dom';

import { useAvtale } from '@/AvtaleProvider';
import amplitude from '@/utils/amplitude';
import { useAsyncError } from '@/komponenter/useError';
import { Loader } from '@navikt/ds-react';

import { container } from './AvtaleFetcher.module.less';

const AvtaleFetcher: FunctionComponent<PropsWithChildren> = (props) => {
const [lastetOk, setLastetOk] = useState<boolean>(false);
const [laster, setLaster] = useState<boolean>(true);
const { avtaleId } = useParams<any>();
const { hentAvtale } = useContext(AvtaleContext);
const { hentAvtale } = useAvtale();
const ref = useRef<string>();
const throwError = useAsyncError();

useEffect(() => {
hentAvtale(avtaleId)
.then(() => {
setLastetOk(true);
const run = async () => {
setLaster(true);
try {
await hentAvtale(avtaleId);
setLaster(false);
amplitude.logEvent('#tiltak-avtale-lastet');
})
.catch((error) => {
setLastetOk(false);
} catch (error) {
amplitude.logEvent('#tiltak-avtale-lastet-feilet');
});
// eslint-disable-next-line
}, [avtaleId]);
throwError(error);
}
};
if (avtaleId !== ref.current) {
run();
}
ref.current = avtaleId;
}, [avtaleId, ref, hentAvtale, setLaster, throwError]);

if (!lastetOk) {
return null;
if (laster) {
return (
<div className={container}>
<Loader variant="neutral" size="xlarge" />
</div>
);
}

return <>{props.children}</>;
10 changes: 5 additions & 5 deletions src/AvtaleSide/AvtaleSide.tsx
Original file line number Diff line number Diff line change
@@ -6,7 +6,7 @@ import BannerNAVAnsatt from '@/komponenter/Banner/BannerNAVAnsatt';
import Dokumenttittel from '@/komponenter/Dokumenttittel';
import Dialog from '@/komponenter/brukerdialog/Dialog';
import { avtaleTittel } from '@/messages';
import { pathTilOversikt } from '@/paths';
import { Path } from '@/Router';
import BEMHelper from '@/utils/bem';
import hentAvtaleSteg from '@/utils/hentAvtaleSteg';
import React, { FunctionComponent, useContext, useEffect, useState } from 'react';
@@ -46,7 +46,7 @@ const AvtaleSide: FunctionComponent = () => {
let avtaleSteg: StegInfo[] = hentAvtaleSteg[avtale.tiltakstype];
if (innloggetBruker.rolle === 'MENTOR') avtaleSteg = hentAvtaleSteg.MENTOR_INNSYN;
const navigate = useNavigate();
const { stegPath } = useParams<any>();
const { steg } = useParams<any>();

const erDesktop = windowSize > 768;
const godkjentAvVeileder = avtale.godkjentAvVeileder !== null;
@@ -69,9 +69,9 @@ const AvtaleSide: FunctionComponent = () => {
});

useEffect(() => {
const getFilterType = () => (!erAvtaleLaast ? stegPath : 'godkjenning');
const getFilterType = () => (!erAvtaleLaast ? steg : 'godkjenning');
setAktivtSteg(avtaleSteg.find((steg) => steg.id === getFilterType()) || avtaleSteg[0]);
}, [stegPath, avtaleSteg, erAvtaleLaast]);
}, [steg, avtaleSteg, erAvtaleLaast]);
return aktivtSteg ? (
<>
<Dokumenttittel tittel={sideTittel} />
@@ -84,7 +84,7 @@ const AvtaleSide: FunctionComponent = () => {
searchParams.delete('sokId');
if (avtale.bedriftNr !== org) {
navigate({
pathname: pathTilOversikt,
pathname: Path.OVERSIKT,
search: searchParams.toString(),
});
}
9 changes: 5 additions & 4 deletions src/AvtaleSide/DelLenkeTilAvtalen/SendVarselModal.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import { AvtaleContext } from '@/AvtaleProvider';
import LagreKnapp from '@/komponenter/LagreKnapp/LagreKnapp';
import VerticalSpacer from '@/komponenter/layout/VerticalSpacer';
import { pathTilOversiktISelvbetjeningProd } from '@/paths';
import { delAvtaleMedAvtalepart } from '@/services/rest-service';
import BEMHelper from '@/utils/bem';
import { Heading, Link, Modal, Button, BodyLong, List } from '@navikt/ds-react';
import { Heading, Link, Modal, Button, List } from '@navikt/ds-react';
import React, { useContext } from 'react';
import { copyTextToClipboard } from '@/utils/copyTextToClipboard';
import './SendVarselModal.less';
@@ -64,13 +63,15 @@ const SendVarselModal: React.FunctionComponent<Props> = (props) => {
</Heading>
<div className={cls.element('lenkedeling')}>
<div className={cls.element('lenke')}>
<Link href={pathTilOversiktISelvbetjeningProd}>{pathTilOversiktISelvbetjeningProd}</Link>
<Link href="https://arbeidsgiver.nav.no/tiltaksgjennomforing">
https://arbeidsgiver.nav.no/tiltaksgjennomforing
</Link>
</div>
<Button
variant="secondary"
size="small"
className={cls.element('kopierKnapp')}
onClick={() => copyTextToClipboard(pathTilOversiktISelvbetjeningProd)}
onClick={() => copyTextToClipboard('https://arbeidsgiver.nav.no/tiltaksgjennomforing')}
>
Kopier lenke
</Button>
21 changes: 14 additions & 7 deletions src/AvtaleSide/NesteForrige/NesteForrige.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { AvtaleContext } from '@/AvtaleProvider';
import { pathTilStegIAvtale } from '@/paths';
import { Next, Back } from '@navikt/ds-icons';
import React, { FunctionComponent, useContext } from 'react';
import { Link } from 'react-router-dom';
import { StegInfo } from '../AvtaleSide';
import { Link, generatePath } from 'react-router-dom';
import { Next, Back } from '@navikt/ds-icons';

import './NesteForrige.less';
import { AvtaleContext } from '@/AvtaleProvider';
import { Path } from '@/Router';
import { StegInfo } from '@/AvtaleSide/AvtaleSide';

export interface Props {
avtaleSteg: StegInfo[];
@@ -38,7 +39,10 @@ const NesteForrige: FunctionComponent<Props> = (props) => {
{forrigeSteg && (
<Link
to={{
pathname: pathTilStegIAvtale(avtaleContext.avtale.id, forrigeSteg.id),
pathname: generatePath(Path.AVTALE_STEG, {
avtaleId: avtaleContext.avtale.id,
steg: forrigeSteg.id,
}),
search: window.location.search,
}}
onClick={avtaleContext.endretSteg}
@@ -54,7 +58,10 @@ const NesteForrige: FunctionComponent<Props> = (props) => {
{nesteSteg && (
<Link
to={{
pathname: pathTilStegIAvtale(avtaleContext.avtale.id, nesteSteg.id),
pathname: generatePath(Path.AVTALE_STEG, {
avtaleId: avtaleContext.avtale.id,
steg: nesteSteg.id,
}),
search: window.location.search,
}}
className="nesteforrige__nesteknapp lenke"
10 changes: 6 additions & 4 deletions src/AvtaleSide/Stegmeny/Stegmeny.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { AvtaleContext } from '@/AvtaleProvider';
import { pathTilStegIAvtale } from '@/paths';
import React, { FunctionComponent, useContext } from 'react';
import { StegInfo } from '../AvtaleSide';
import { generatePath } from 'react-router-dom';

import './Stegmeny.less';
import StegmenyLenke from './StegmenyLenke/StegmenyLenke';
import { AvtaleContext } from '@/AvtaleProvider';
import { Path } from '@/Router';
import { StegInfo } from '@/AvtaleSide/AvtaleSide';

interface Props {
steg: StegInfo[];
@@ -17,7 +19,7 @@ const Stegmeny: FunctionComponent<Props> = (props: Props) => {
id={steg.id}
label={steg.label}
aktiv={props.aktivtSteg === steg}
url={pathTilStegIAvtale(avtale.id, steg.id)}
url={generatePath(Path.AVTALE_STEG, { avtaleId: avtale.id, steg: steg.id })}
key={steg.id}
/>
));
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { pathTilOversikt } from '@/paths';
import { Path } from '@/Router';
import BEMHelper from '@/utils/bem';
import { Back } from '@navikt/ds-icons';
import { FunctionComponent } from 'react';
@@ -14,7 +14,7 @@ const TilbakeTilOversiktLenke: FunctionComponent<Props> = (props) => {
const cls = BEMHelper('tilbaketiloversikt');
return (
<Link
to={{ pathname: pathTilOversikt, search: window.location.search }}
to={{ pathname: Path.OVERSIKT, search: window.location.search }}
className={cls.element('lenke')}
onClick={props.onClick}
role="menuitem"
60 changes: 28 additions & 32 deletions src/BeslutterOversikt/AvtaleTabellBeslutter.tsx
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
import { FunctionComponent } from 'react';
import { useNavigate, generatePath } from 'react-router-dom';
import { Table, BodyShort } from '@navikt/ds-react';

import '../AvtaleOversikt/AvtaleTabell.less';
import AvtaleTabellBeslutterHeader from '@/BeslutterOversikt/AvtaleTabellBeslutterHeader';
import BEMHelper from '@/utils/bem';
import EtikettStatus from '@/BeslutterSide/EtikettStatus';
import { pathTilAvtaleNy } from '@/paths';
import { AvtaleMinimalForBeslutter } from '@/types/avtale';
import { InnloggetBruker } from '@/types/innlogget-bruker';
import { ChevronRightIcon } from '@navikt/aksel-icons';
import { Path } from '@/Router';
import { Varsel } from '@/types/varsel';
import BEMHelper from '@/utils/bem';
import { Table, BodyShort } from '@navikt/ds-react';
import { FunctionComponent } from 'react';
import { useNavigate } from 'react-router-dom';
import '../AvtaleOversikt/AvtaleTabell.less';
import { tiltakstypeTekstKort } from '@/messages';
import { kunStorForbokstav } from '@/utils/stringUtils';
import { ChevronRightIcon } from '@navikt/aksel-icons';
import AvtaleTabellBeslutterHeader from '@/BeslutterOversikt/AvtaleTabellBeslutterHeader';
import { tiltakstypeTekstKort } from '@/messages';

const cls = BEMHelper('avtaletabell');

const AvtaleTabellBeslutter: FunctionComponent<{
interface Props {
avtaler: AvtaleMinimalForBeslutter[];
varsler: Varsel[];
innloggetBruker: InnloggetBruker;
}> = ({ avtaler, varsler, innloggetBruker }) => {
const navigate = useNavigate();
}

const erBeslutter: boolean = true;
const AvtaleTabellBeslutter = (props: Props) => {
const { avtaler, varsler } = props;
const navigate = useNavigate();

return (
<Table className={cls.className}>
@@ -35,7 +35,7 @@ const AvtaleTabellBeslutter: FunctionComponent<{
key={avtale.id + index}
onClick={(e) => {
navigate({
pathname: pathTilAvtaleNy(avtale.id, innloggetBruker.rolle),
pathname: generatePath(Path.AVTALE_BESLUTTER, { avtaleId: avtale.id }),
search: window.location.search,
});
}}
@@ -55,22 +55,18 @@ const AvtaleTabellBeslutter: FunctionComponent<{
{avtale.deltakerEtternavn || ''}
</BodyShort>
</Table.DataCell>
{innloggetBruker.erNavAnsatt && (
<Table.DataCell>
<BodyShort size="small">{avtale.veilederNavIdent || 'Ufordelt'}</BodyShort>
</Table.DataCell>
)}
{erBeslutter && (
<Table.DataCell>
<BodyShort size="small">
{new Date(avtale.startDato).toLocaleDateString('no-NB', {
day: 'numeric',
month: 'short',
year: '2-digit',
})}
</BodyShort>
</Table.DataCell>
)}
<Table.DataCell>
<BodyShort size="small">{avtale.veilederNavIdent || 'Ufordelt'}</BodyShort>
</Table.DataCell>
<Table.DataCell>
<BodyShort size="small">
{new Date(avtale.startDato).toLocaleDateString('no-NB', {
day: 'numeric',
month: 'short',
year: '2-digit',
})}
</BodyShort>
</Table.DataCell>
<Table.DataCell>
<EtikettStatus
tilskuddsperiodestatus={avtale.status}
8 changes: 1 addition & 7 deletions src/BeslutterOversikt/AvtalerBeslutter.tsx
Original file line number Diff line number Diff line change
@@ -22,13 +22,7 @@ export const AvtalerBeslutter: FunctionComponent<Props> = (props) => {
} else if (props.avtalelisteRessurs.status === Status.Lastet && props.avtalelisteRessurs.data.length === 0) {
return <IngenAvtaler />;
} else if (props.avtalelisteRessurs.status === Status.Lastet) {
return (
<AvtaleTabellBeslutter
avtaler={props.avtalelisteRessurs.data}
varsler={props.varsler}
innloggetBruker={props.innloggetBruker}
/>
);
return <AvtaleTabellBeslutter avtaler={props.avtalelisteRessurs.data} varsler={props.varsler} />;
} else if (props.avtalelisteRessurs.status === Status.Feil) {
handterFeil(props.avtalelisteRessurs.error, feilVarsel);
}
25 changes: 13 additions & 12 deletions src/Informasjonsside/Informasjonsside.tsx
Original file line number Diff line number Diff line change
@@ -1,24 +1,25 @@
import TilbakeTilOversiktLenke from '@/AvtaleSide/TilbakeTilOversiktLenke/TilbakeTilOversiktLenke';
import { FunctionComponent, useState } from 'react';
import { useLocation } from 'react-router-dom';
import { BodyShort, Heading, Label, Link } from '@navikt/ds-react';

import './informasjonsside.less';
import Altinn from '@/assets/ikoner/altinn.svg?react';
import AltinnVideoModal from '@/komponenter/modal/AltinnVideoModal';
import BEMHelper from '@/utils/bem';
import Banner from '@/komponenter/Banner/Banner';
import DigitalAvtale from '@/assets/ikoner/digitalAvtale.svg?react';
import DynamiskAvtale from '@/assets/ikoner/dynamiskAvtale.svg?react';
import EksternLenke from '@/komponenter/navigation/EksternLenke';
import Historikk from '@/assets/ikoner/historikk.svg?react';
import Keyboard from '@/assets/ikoner/keyboard.svg?react';
import Banner from '@/komponenter/Banner/Banner';
import IkonTekstRad from '@/komponenter/EkspanderbartPanelRad/IkonTekstRad';
import Keyboard from '@/assets/ikoner/keyboard.svg?react';
import TilbakeTilOversiktLenke from '@/AvtaleSide/TilbakeTilOversiktLenke/TilbakeTilOversiktLenke';
import VerticalSpacer from '@/komponenter/layout/VerticalSpacer';
import AltinnVideoModal from '@/komponenter/modal/AltinnVideoModal';
import EksternLenke from '@/komponenter/navigation/EksternLenke';
import { pathTilInformasjonssideInnlogget } from '@/paths';
import BEMHelper from '@/utils/bem';
import { BodyShort, Heading, Label, Link } from '@navikt/ds-react';
import { FunctionComponent, useState } from 'react';
import { useLocation } from 'react-router-dom';
import './informasjonsside.less';
import { Path } from '@/Router';

const cls = BEMHelper('informasjonsside');
const tilbakeTilOversikt = (pathName: string) => {
if (pathName === pathTilInformasjonssideInnlogget) {
if (pathName === Path.INFORMASJONSSIDE) {
return <TilbakeTilOversiktLenke />;
} else {
return <TilbakeTilOversiktLenke tekst={'Tilbake'} />;
2 changes: 2 additions & 0 deletions src/InnloggingBoundary/InnloggingBoundary.tsx
Original file line number Diff line number Diff line change
@@ -27,6 +27,8 @@ export const InnloggetBrukerContext = React.createContext<InnloggetBruker>({
navEnheter: [],
});

export const useInnloggetBruker = () => React.useContext(InnloggetBrukerContext);

const InnloggingBoundary: FunctionComponent<PropsWithChildren> = (props) => {
const [brukmeny, setbrukmeny] = useState<boolean>();
const [brukBackupmeny, setBrukBackupmeny] = useState<boolean>();
29 changes: 15 additions & 14 deletions src/InnloggingBoundary/Innloggingsside.tsx
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
import Koffert from '@/assets/ikoner/koffert.svg?react';
import { FeilVarselContext } from '@/FeilVarselProvider';
import VerticalSpacer from '@/komponenter/layout/VerticalSpacer';
import { useAsyncError } from '@/komponenter/useError';
import { pathTilInformasjonssideUinnlogget } from '@/paths';
import { INNLOGGET_PART } from '@/RedirectEtterLogin';
import { hentInnloggetBruker } from '@/services/rest-service';
import { AutentiseringError, FeilkodeError } from '@/types/errors';
import { Innloggingskilde } from '@/types/innlogget-bruker';
import { handterFeil } from '@/utils/apiFeilUtils';
import BEMHelper from '@/utils/bem';
import { Next } from '@navikt/ds-icons';
import { Ingress, Heading, BodyShort, Button } from '@navikt/ds-react';
import React, { useContext } from 'react';
import { useCookies } from 'react-cookie';
import MediaQuery from 'react-responsive';
import { Link } from 'react-router-dom';
import { Ingress, Heading, BodyShort, Button } from '@navikt/ds-react';

import './Innloggingsside.less';
import BEMHelper from '@/utils/bem';
import Koffert from '@/assets/ikoner/koffert.svg?react';
import VerticalSpacer from '@/komponenter/layout/VerticalSpacer';
import { AutentiseringError, FeilkodeError } from '@/types/errors';
import { FeilVarselContext } from '@/FeilVarselProvider';
import { INNLOGGET_PART } from '@/RedirectEtterLogin';
import { Innloggingskilde } from '@/types/innlogget-bruker';
import { Next } from '@navikt/ds-icons';
import { Path } from '@/Router';
import { handterFeil } from '@/utils/apiFeilUtils';
import { hentInnloggetBruker } from '@/services/rest-service';
import { useAsyncError } from '@/komponenter/useError';

const cls = BEMHelper('innloggingsside');

@@ -69,7 +70,7 @@ const Innloggingsside = (props: { innloggingskilder: Innloggingskilde[] }) => {
</Ingress>
<VerticalSpacer rem={2} />
<BodyShort size="small">
<Link to={pathTilInformasjonssideUinnlogget} className="lenke">
<Link to={Path.INFORMASJONSSIDE} className="lenke">
Her kan du lese mer om hvordan løsningen fungerer
<Next style={{ display: 'inline-block' }} />
</Link>
7 changes: 4 additions & 3 deletions src/NotifikasjonWidgetProvider.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { InnloggetBrukerContext } from '@/InnloggingBoundary/InnloggingBoundary';
import { basename } from '@/paths';
import * as NotifikasjonWidget from '@navikt/arbeidsgiver-notifikasjon-widget';
import { FunctionComponent, PropsWithChildren, useContext } from 'react';

import * as NotifikasjonWidget from '@navikt/arbeidsgiver-notifikasjon-widget';
import { InnloggetBrukerContext } from '@/InnloggingBoundary/InnloggingBoundary';
import { basename } from '@/Router';

const miljo = (() => {
switch (window.location.hostname) {
case 'arbeidsgiver.nav.no':
Original file line number Diff line number Diff line change
@@ -1,35 +1,30 @@
import TilbakeTilOversiktLenke from '@/AvtaleSide/TilbakeTilOversiktLenke/TilbakeTilOversiktLenke';
import { InnloggetBrukerContext } from '@/InnloggingBoundary/InnloggingBoundary';
import React, { FunctionComponent, useContext, useState } from 'react';
import { useNavigate, generatePath } from 'react-router-dom';
import { Alert, RadioGroup, BodyShort, Heading, Label, ErrorMessage, TextField } from '@navikt/ds-react';

import './OpprettAvtaleArbeidsgiver.less';
import BEMHelper from '@/utils/bem';
import Banner from '@/komponenter/Banner/Banner';
import Dokumenttittel from '@/komponenter/Dokumenttittel';
import EksternLenke from '@/komponenter/navigation/EksternLenke';
import Innholdsboks from '@/komponenter/Innholdsboks/Innholdsboks';
import LagreKnapp from '@/komponenter/LagreKnapp/LagreKnapp';
import RadioPanel from '@/komponenter/radiopanel/RadioPanel';
import TilbakeTilOversiktLenke from '@/AvtaleSide/TilbakeTilOversiktLenke/TilbakeTilOversiktLenke';
import VerticalSpacer from '@/komponenter/layout/VerticalSpacer';
import EksternLenke from '@/komponenter/navigation/EksternLenke';
import amplitude from '@/utils/amplitude';
import useValidering from '@/komponenter/useValidering';
import { tiltakstypeTekst } from '@/messages';
import { Avtalerolle } from '@/OpprettAvtale/OpprettAvtaleVeileder/OpprettAvtaleVeileder';
import {
basename,
pathTilInformasjonssideInnlogget,
inkludereIArbeidslivetLenke,
pathTilKontaktinformasjonSteg,
} from '@/paths';
import { opprettAvtaleSomArbeidsgiver, opprettMentorAvtale } from '@/services/rest-service';
import { TiltaksType } from '@/types/avtale';
import { Feilkode, Feilmeldinger } from '@/types/feilkode';
import amplitude from '@/utils/amplitude';
import BEMHelper from '@/utils/bem';
import { InnloggetBrukerContext } from '@/InnloggingBoundary/InnloggingBoundary';
import { Path, basename } from '@/Router';
import { TiltaksType } from '@/types/avtale';
import { opprettAvtaleSomArbeidsgiver, opprettMentorAvtale } from '@/services/rest-service';
import { setFnrBrukerOnChange, validatorer, validerFnr } from '@/utils/fnrUtils';
import { validerOrgnr } from '@/utils/orgnrUtils';
import { Alert, RadioGroup } from '@navikt/ds-react';
import { BodyShort, Heading, Label, ErrorMessage, TextField } from '@navikt/ds-react';
import React, { FunctionComponent, useContext, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import './OpprettAvtaleArbeidsgiver.less';
import RadioPanel from '@/komponenter/radiopanel/RadioPanel';
import { storForbokstav } from '@/utils/stringUtils';
import { tiltakstypeTekst } from '@/messages';
import { useFeatureToggles } from '@/FeatureToggleProvider';
import { validerOrgnr } from '@/utils/orgnrUtils';

const cls = BEMHelper('opprett-avtale-arbeidsgiver');

@@ -87,15 +82,15 @@ const OpprettAvtaleArbeidsgiver: FunctionComponent = () => {
Avtalerolle.ARBEIDSGIVER,
);
amplitude.logEvent('#tiltak-avtale-opprettet', { tiltakstype: valgtTiltaksType });
navigate(pathTilKontaktinformasjonSteg(mentorAvtale.id));
navigate(generatePath(Path.AVTALE_STEG, { avtaleId: mentorAvtale.id, steg: 'kontaktinformasjon' }));
return;
}
return;
}
const avtale = await opprettAvtaleSomArbeidsgiver(deltakerFnr, valgtBedriftNr, valgtTiltaksType);
amplitude.logEvent('#tiltak-avtale-opprettet-arbeidsgiver', { tiltakstype: valgtTiltaksType });
navigate({
pathname: pathTilKontaktinformasjonSteg(avtale.id),
pathname: generatePath(Path.AVTALE_STEG, { avtaleId: avtale.id, steg: 'kontaktinformasjon' }),
search: window.location.search,
});
return;
@@ -128,13 +123,13 @@ const OpprettAvtaleArbeidsgiver: FunctionComponent = () => {
</Heading>
<BodyShort size="small">
Er det første gang du skal opprette en avtale bør du lese gjennom {''}
<EksternLenke href={`${basename}${pathTilInformasjonssideInnlogget}`}>
<EksternLenke href={`${basename}${Path.INFORMASJONSSIDE}`}>
introduksjon til hvordan løsningen fungerer {''}
</EksternLenke>
og vite om{' '}
<EksternLenke
onClick={() => amplitude.logEvent('#tiltak-arbeidsgiver-alle-tiltak-link-apnet')}
href={inkludereIArbeidslivetLenke}
href="https://www.nav.no/arbeidsgiver/inkludere"
>
de ulike støtteordningene.
</EksternLenke>
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
import React from 'react';
import amplitude from '@/utils/amplitude';
import { BodyShort } from '@navikt/ds-react';

import EksternLenke from '@/komponenter/navigation/EksternLenke';
import Innholdsboks from '@/komponenter/Innholdsboks/Innholdsboks';
import { basename, inkludereIArbeidslivetLenke, pathTilInformasjonssideInnlogget } from '@/paths';
import amplitude from '@/utils/amplitude';
import { basename, Path } from '@/Router';

const InformasjonsboksTopVeilederOppretterAvtale: React.FC = () => {
return (
<Innholdsboks>
<BodyShort size="small">
Er det første gang du skal opprette en avtale bør du lese gjennom {''}
<EksternLenke href={`${basename}${pathTilInformasjonssideInnlogget}`}>
<EksternLenke href={`${basename}${Path.INFORMASJONSSIDE}`}>
introduksjon til hvordan løsningen fungerer {''}
</EksternLenke>
og vite om{' '}
<EksternLenke
onClick={() => amplitude.logEvent('#tiltak-veileder-alle-tiltak-link-apnet')}
href={inkludereIArbeidslivetLenke}
href="https://www.nav.no/arbeidsgiver/inkludere"
>
de ulike støtteordningene på NAV.no.
</EksternLenke>{' '}
43 changes: 22 additions & 21 deletions src/OpprettAvtale/OpprettAvtaleVeileder/OpprettAvtaleVeileder.tsx
Original file line number Diff line number Diff line change
@@ -1,34 +1,35 @@
import TilbakeTilOversiktLenke from '@/AvtaleSide/TilbakeTilOversiktLenke/TilbakeTilOversiktLenke';
import { AlleredeOpprettetAvtaleContext } from '@/komponenter/alleredeOpprettetTiltak/api/AlleredeOpprettetAvtaleProvider';
import OpprettAvtaleMedAlleredeOpprettetTiltak from '@/komponenter/alleredeOpprettetTiltak/OpprettAvtaleMedAlleredeOpprettetTiltak';
import { ChangeEvent, FunctionComponent, useContext, useEffect, useState } from 'react';
import { Alert, Heading } from '@navikt/ds-react';
import { useNavigate, generatePath } from 'react-router-dom';

import './OpprettAvtale.less';
import './opprettAvtaleVeileder.less';
import BEMHelper from '@/utils/bem';
import Dokumenttittel from '@/komponenter/Dokumenttittel';
import LagreKnapp from '@/komponenter/LagreKnapp/LagreKnapp';
import useValidering from '@/komponenter/useValidering';
import HvemSkalInngaaAvtalen from '@/OpprettAvtale/OpprettAvtaleVeileder/HvemSkalInngaaAvtalen';
import InformasjonsboksTopVeilederOppretterAvtale from '@/OpprettAvtale/OpprettAvtaleVeileder/InformasjonsboksTopVeilederOppretterAvtale';
import LagreKnapp from '@/komponenter/LagreKnapp/LagreKnapp';
import OpprettAvtaleMedAlleredeOpprettetTiltak from '@/komponenter/alleredeOpprettetTiltak/OpprettAvtaleMedAlleredeOpprettetTiltak';
import TilbakeTilOversiktLenke from '@/AvtaleSide/TilbakeTilOversiktLenke/TilbakeTilOversiktLenke';
import TiltaksTypeRadioPanel from '@/OpprettAvtale/OpprettAvtaleVeileder/TiltaksTypeRadioPanel';
import { pathTilKontaktinformasjonSteg } from '@/paths';
import VerticalSpacer from '@/komponenter/layout/VerticalSpacer';
import amplitude from '@/utils/amplitude';
import useValidering from '@/komponenter/useValidering';
import { AlleredeOpprettetAvtaleContext } from '@/komponenter/alleredeOpprettetTiltak/api/AlleredeOpprettetAvtaleProvider';
import { AlleredeRegistrertAvtale, TiltaksType } from '@/types/avtale';
import { FeilVarselContext } from '@/FeilVarselProvider';
import { Feilkode, Feilmeldinger } from '@/types/feilkode';
import { Path } from '@/Router';
import { handterFeil } from '@/utils/apiFeilUtils';
import {
hentBedriftBrreg,
opprettAvtaleSomVeileder,
opprettMentorAvtale,
sjekkOmDeltakerAlleredeErRegistrertPaaTiltak,
} from '@/services/rest-service';
import { AlleredeRegistrertAvtale, TiltaksType } from '@/types/avtale';
import { Feilkode, Feilmeldinger } from '@/types/feilkode';
import amplitude from '@/utils/amplitude';
import { handterFeil } from '@/utils/apiFeilUtils';
import BEMHelper from '@/utils/bem';
import { useFeatureToggles } from '@/FeatureToggleProvider';
import { validatorer, validerFnr } from '@/utils/fnrUtils';
import { validerOrgnr } from '@/utils/orgnrUtils';
import { Alert, Heading } from '@navikt/ds-react';
import { ChangeEvent, FunctionComponent, useContext, useEffect, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import './OpprettAvtale.less';
import './opprettAvtaleVeileder.less';
import { FeilVarselContext } from '@/FeilVarselProvider';
import { useFeatureToggles } from '@/FeatureToggleProvider';
import VerticalSpacer from '@/komponenter/layout/VerticalSpacer';

const cls = BEMHelper('opprett-avtale');

@@ -141,14 +142,14 @@ const OpprettAvtaleVeileder: FunctionComponent = () => {
Avtalerolle.VEILEDER,
);
amplitude.logEvent('#tiltak-avtale-opprettet', { tiltakstype: valgtTiltaksType });
navigate(pathTilKontaktinformasjonSteg(mentorAvtale.id));
navigate(generatePath(Path.AVTALE_STEG, { avtaleId: mentorAvtale.id, steg: 'kontaktinformasjon' }));
return;
}
return;
}
const avtale = await opprettAvtaleSomVeileder(deltakerFnr, bedriftNr, valgtTiltaksType);
amplitude.logEvent('#tiltak-avtale-opprettet', { tiltakstype: valgtTiltaksType });
navigate(pathTilKontaktinformasjonSteg(avtale.id));
navigate(generatePath(Path.AVTALE_STEG, { avtaleId: avtale.id, steg: 'kontaktinformasjon' }));
return;
}

Original file line number Diff line number Diff line change
@@ -2,7 +2,6 @@ import Innholdsboks from '@/komponenter/Innholdsboks/Innholdsboks';
import EksternLenke from '@/komponenter/navigation/EksternLenke';
import RadioPanel from '@/komponenter/radiopanel/RadioPanel';
import { tiltakstypeTekst } from '@/messages';
import { inkludereIArbeidslivetLenke } from '@/paths';
import { TiltaksType } from '@/types/avtale';
import { Feilmeldinger } from '@/types/feilkode';
import amplitude from '@/utils/amplitude';
@@ -65,7 +64,7 @@ const TiltaksTypeRadioPanel: FunctionComponent<Props> = ({
Ønsker du å vite mer om de ulike støtteordningene finner du informasjon på NAV sine sider{' '}
<EksternLenke
onClick={() => amplitude.logEvent('#tiltak-veileder-hvordan-kan-nav-hjelpe-med-inkludering-apnet')}
href={inkludereIArbeidslivetLenke}
href="https://www.nav.no/arbeidsgiver/inkludere"
>
hvordan kan NAV hjelpe med inkludering
</EksternLenke>
18 changes: 18 additions & 0 deletions src/Router/AvtaleRouteError.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { useRouteError } from 'react-router-dom';

import { IkkeFunnetError } from '@/types/errors';
import IkkeFunnet404 from '@/Router/IkkeFunnet404';
import { useInnloggetBruker } from '@/InnloggingBoundary/InnloggingBoundary';

function AvtaleRouteError() {
const error = useRouteError();
const { rolle } = useInnloggetBruker();

if (error instanceof IkkeFunnetError) {
return <IkkeFunnet404 rolle={rolle} />;
}

throw error;
}

export default AvtaleRouteError;
51 changes: 51 additions & 0 deletions src/Router/IkkeFunnet404.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { Link } from 'react-router-dom';
import { Button, BodyShort, Box, Heading, List, Page, VStack } from '@navikt/ds-react';

import Innholdsboks from '@/komponenter/Innholdsboks/Innholdsboks';
import { Path } from '@/Router';
import { Rolle } from '@/types/innlogget-bruker';

interface Props {
rolle?: Rolle;
}

function IkkeFunnet404(props: Props) {
const { rolle = 'INGEN_ROLLE' } = props;

return (
<Page.Block as="main" width="xl" gutters>
<Box paddingBlock="20 16" data-aksel-template="404-v2">
<Innholdsboks>
<VStack gap="12" align="start">
<div>
<Heading level="1" size="large" spacing>
Beklager, vi fant ikke siden
</Heading>
<BodyShort>
Denne siden kan være slettet eller flyttet, eller det er en feil i lenken.
</BodyShort>
<List>
<List.Item>Bruk gjerne søket eller menyen</List.Item>
<List.Item>
<Link to={Path.OVERSIKT}>Gå til forsiden</Link>
</List.Item>
</List>
</div>
{rolle === 'DELTAKER' && (
<Button as="a" href="https://www.nav.no/minside">
Gå til Min side
</Button>
)}
{rolle === 'ARBEIDSGIVER' && (
<Button as="a" href="https://arbeidsgiver.nav.no/min-side-arbeidsgiver">
Gå til Min side
</Button>
)}
</VStack>
</Innholdsboks>
</Box>
</Page.Block>
);
}

export default IkkeFunnet404;
130 changes: 130 additions & 0 deletions src/Router/Router.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
import * as React from 'react';
import { createBrowserRouter, Outlet } from 'react-router-dom';

import AdvarselBannerTestversjon from '@/AdvarselBannerTestversjon/AdvarselBannerTestversjon';
import AlleredeOpprettetAvtaleProvider from '@/komponenter/alleredeOpprettetTiltak/api/AlleredeOpprettetAvtaleProvider';
import AvtaleFetcher from '@/AvtaleSide/AvtaleFetcher';
import AvtaleProvider from '@/AvtaleProvider';
import AvtaleSide from '@/AvtaleSide/AvtaleSide';
import BeslutterSide from '@/BeslutterSide/BeslutterSide';
import IkkeFunnet404 from '@/Router/IkkeFunnet404';
import Informasjonsside from '@/Informasjonsside/Informasjonsside';
import InnloggingBoundary from '@/InnloggingBoundary/InnloggingBoundary';
import OpprettAvtaleArbeidsgiver from '@/OpprettAvtale/OpprettAvtaleArbeidsgiver/OpprettAvtaleArbeidsgiver';
import OpprettAvtaleVeileder from '@/OpprettAvtale/OpprettAvtaleVeileder/OpprettAvtaleVeileder';
import Oversikt from '@/Oversikt';
import RedirectEtterLogin from '@/RedirectEtterLogin';
import Slettemerk from '@/komponenter/Slettemerk';
import { FeatureToggleProvider } from '@/FeatureToggleProvider';
import { FeilVarselProvider } from '@/FeilVarselProvider';
import { NotifikasjonWidgetProvider } from '@/NotifikasjonWidgetProvider';
import { VarselOmNedetid } from '@/InnloggingBoundary/VarselOmNedetid';
import ErrorBoundary from '@/komponenter/ErrorBoundary';
import AvtaleRouteError from '@/Router/AvtaleRouteError';

export const basename = '/tiltaksgjennomforing';

export enum Path {
OVERSIKT = '/',
INFORMASJONSSIDE = '/informasjonsside',
OPPRETT_AVTALE = '/opprett-avtale',
OPPRETT_AVTALE_ARBEIDSGIVER = '/opprett-avtale-arbeidsgiver',
AVTALE = '/avtale/:avtaleId',
AVTALE_STEG = '/avtale/:avtaleId/:steg',
AVTALE_BESLUTTER = '/avtale/:avtaleId/beslutter',
AVTALE_BESLUTTER_TILSKUDDSPERIODE = '/avtale/:avtaleId/beslutter/:tilskuddsperiodeId',
AVTALE_SLETT = '/avtale/:avtaleId/slett',
}

const router = createBrowserRouter(
[
{
path: Path.OVERSIKT,
element: (
<ErrorBoundary>
<AdvarselBannerTestversjon />
<VarselOmNedetid />
<Outlet />
</ErrorBoundary>
),
children: [
{
path: '/*',
element: <IkkeFunnet404 />,
},
{
path: Path.INFORMASJONSSIDE,
element: <Informasjonsside />,
},
{
path: Path.OVERSIKT,
element: (
<FeilVarselProvider>
<InnloggingBoundary>
<FeatureToggleProvider>
<RedirectEtterLogin>
<AlleredeOpprettetAvtaleProvider>
<NotifikasjonWidgetProvider>
<Outlet />
</NotifikasjonWidgetProvider>
</AlleredeOpprettetAvtaleProvider>
</RedirectEtterLogin>
</FeatureToggleProvider>
</InnloggingBoundary>
</FeilVarselProvider>
),
children: [
{
path: Path.OVERSIKT,
element: <Oversikt />,
},
{
path: Path.OPPRETT_AVTALE,
element: <OpprettAvtaleVeileder />,
},
{
path: Path.OPPRETT_AVTALE_ARBEIDSGIVER,
element: <OpprettAvtaleArbeidsgiver />,
},
{
path: Path.AVTALE,
element: (
<AvtaleProvider>
<AvtaleFetcher>
<Outlet />
</AvtaleFetcher>
</AvtaleProvider>
),
errorElement: <AvtaleRouteError />,
children: [
{
path: Path.AVTALE,
element: <AvtaleSide />,
},
{
path: Path.AVTALE_STEG,
element: <AvtaleSide />,
},
{
path: Path.AVTALE_BESLUTTER,
element: <BeslutterSide />,
},
{
path: Path.AVTALE_BESLUTTER_TILSKUDDSPERIODE,
element: <BeslutterSide />,
},
{
path: Path.AVTALE_SLETT,
element: <Slettemerk />,
},
],
},
],
},
],
},
],
{ basename },
);

export default router;
4 changes: 4 additions & 0 deletions src/Router/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import Router from './Router';
export * from './Router';

export default Router;
3 changes: 2 additions & 1 deletion src/komponenter/brukerdialog/useBrukerDialog.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { useContext } from 'react';

import { AvtaleContext } from '@/AvtaleProvider';
import { basename } from '@/paths';
import { basename } from '@/Router';

const useBrukerDialog = () => {
const { avtale } = useContext(AvtaleContext);
40 changes: 0 additions & 40 deletions src/paths.ts

This file was deleted.

2 changes: 2 additions & 0 deletions src/react-app-env.d.ts
Original file line number Diff line number Diff line change
@@ -3,3 +3,5 @@ declare module '*.mp4' {
const src: string;
export default src;
}

declare module '*.module.less';
33 changes: 18 additions & 15 deletions src/services/rest-service.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
import { Filtrering } from '@/AvtaleOversikt/Filtrering/filtrering';
import axios from 'axios';
import axiosRetry from 'axios-retry';
import { mutate } from 'swr';

import { ApiError, AutentiseringError, FeilkodeError, IkkeFunnetError } from '@/types/errors';
import { Avtalerolle } from '@/OpprettAvtale/OpprettAvtaleVeileder/OpprettAvtaleVeileder';
import { EndreBeregning } from '@/AvtaleSide/steg/GodkjenningSteg/endringAvAvtaleInnhold/endreTilskudd/EndreTilskuddsberegning';
import { Kostnadssted } from '@/AvtaleSide/steg/KontaktInformasjonSteg/kontorInfo/OppdatereKostnadssted';
import { Feature, FeatureToggles } from '@/FeatureToggleProvider';
import { Avtalerolle } from '@/OpprettAvtale/OpprettAvtaleVeileder/OpprettAvtaleVeileder';
import { basename } from '@/paths';
import { Filtrering } from '@/AvtaleOversikt/Filtrering/filtrering';
import { Hendelse } from '@/types/hendelse';
import { InnloggetBruker, Rolle } from '@/types/innlogget-bruker';
import { Kostnadssted } from '@/AvtaleSide/steg/KontaktInformasjonSteg/kontorInfo/OppdatereKostnadssted';
import { SIDE_FOER_INNLOGGING } from '@/RedirectEtterLogin';
import { Variants } from '@/types/unleash-variant';
import { Varsel } from '@/types/varsel';
import { basename } from '@/Router';
import {
AlleredeRegistrertAvtale,
Returårsaker,
@@ -24,16 +33,6 @@ import {
TiltaksType,
Varighet,
} from '@/types/avtale';
import { ApiError, AutentiseringError, FeilkodeError } from '@/types/errors';
import { Hendelse } from '@/types/hendelse';
import { InnloggetBruker, Rolle } from '@/types/innlogget-bruker';
import { Variants } from '@/types/unleash-variant';
import { Varsel } from '@/types/varsel';
import axios from 'axios';
import axiosRetry from 'axios-retry';
import { mutate } from 'swr';

export const API_URL = '/tiltaksgjennomforing/api';

const api = axios.create({
baseURL: '/tiltaksgjennomforing/api',
@@ -56,6 +55,9 @@ api.interceptors.response.use(
if (error.response?.status === 400 && error.response?.headers.feilkode) {
throw new FeilkodeError(error.response?.headers.feilkode);
}
if (error.response?.status === 404) {
throw new IkkeFunnetError('Fant ikke ressursen.');
}
throw new ApiError('Feil ved kontakt mot baksystem.');
},
);
@@ -287,7 +289,7 @@ export const opphevGodkjenninger = async (avtaleId: string) => {

export const annullerAvtale = async (avtale: Avtale, annullertGrunn: string) => {
const uri = `/avtaler/${avtale.id}/annuller`;
await api.post(
const response = await api.post<Avtale>(
uri,
{ annullertGrunn },
{
@@ -296,6 +298,7 @@ export const annullerAvtale = async (avtale: Avtale, annullertGrunn: string) =>
},
},
);
return response.data;
};

export const sjekkOmDeltakerAlleredeErRegistrertPaaTiltak = async (
2 changes: 1 addition & 1 deletion src/services/use-rest.ts
Original file line number Diff line number Diff line change
@@ -6,7 +6,7 @@ import { ApiError, AutentiseringError, FeilkodeError } from '@/types/errors';
import { AvtaleVersjon } from '@/types/avtale';
import { Enhet } from '@/types/enhet';
import { SIDE_FOER_INNLOGGING } from '@/RedirectEtterLogin';
import { basename } from '@/paths';
import { basename } from '@/Router';

const api = axios.create({
baseURL: '/tiltaksgjennomforing/api',
3 changes: 2 additions & 1 deletion src/types/errors.ts
Original file line number Diff line number Diff line change
@@ -2,4 +2,5 @@ export class ApiError extends Error {}
export class AutentiseringError extends ApiError {}
export class AdresseError extends ApiError {}
export class UfullstendigError extends Error {}
export class FeilkodeError extends Error {}
export class FeilkodeError extends ApiError {}
export class IkkeFunnetError extends ApiError {}

0 comments on commit 603cce1

Please sign in to comment.