= (props) => {
- {formatterPeriode(periode.startDato, periode.sluttDato, 'DD.MM.YY')}
+ {formaterPeriode(periode.startDato, periode.sluttDato, 'dd.MM.yy')}
|
{formaterPenger(periode.beløp)} |
{formatterProsent(periode.lonnstilskuddProsent)} |
- {formatterDato(periode.kanBesluttesFom, NORSK_DATO_FORMAT)} |
+ {formaterDato(periode.kanBesluttesFom, NORSK_DATO_FORMAT)} |
{periode.status === 'GODKJENT' ? periode.enhet : enhet} |
{
- const sistEndretPlussTolvUker = moment(sistEndret).endOf('day').add(TOLV_UKER_I_DAGER, 'days');
- const slettetidspunkt = STARTDATO_FOR_RYDDING.isAfter(sistEndretPlussTolvUker)
- ? STARTDATO_FOR_RYDDING
- : sistEndretPlussTolvUker;
+ const sistEndretPlussTolvUker = addDays(endOfDay(sistEndret), TOLV_UKER_I_DAGER);
+ const slettetidspunkt = max([STARTDATO_FOR_RYDDING, sistEndretPlussTolvUker]);
- const antallDager = slettetidspunkt.diff(moment(), 'days');
+ const antallDager = Math.abs(differenceInDays(new Date(), slettetidspunkt));
if (antallDager === 0) {
return `kl. 23:59 i dag`;
@@ -36,7 +36,7 @@ const formaterSlettetidspunkt = (sistEndret: string) => {
if (antallDager < 14) {
return `${antallDager} dager`;
}
- return `den ${slettetidspunkt.format('DD.MM.YYYY')}`;
+ return `den ${format(slettetidspunkt, NORSK_DATO_FORMAT_FULL, { locale: nb })}`;
};
const BannerNAVAnsatt: React.FunctionComponent = (props) => {
@@ -44,7 +44,7 @@ const BannerNAVAnsatt: React.FunctionComponent = (props) => {
const { pabegyntAvtaleRyddeJobb } = useFeatureToggles();
const innloggetBruker = useContext(InnloggetBrukerContext);
- return innloggetBruker.erNavAnsatt ? (
+ return innloggetBruker.erNavAnsatt && avtale ? (
<>
@@ -72,7 +72,7 @@ const BannerNAVAnsatt: React.FunctionComponent = (props) => {
- {pabegyntAvtaleRyddeJobb && ['PÅBEGYNT', 'MANGLER_GODKJENNING'].includes(avtale?.status) && (
+ {pabegyntAvtaleRyddeJobb && ['PÅBEGYNT', 'MANGLER_GODKJENNING'].includes(avtale.status) && (
Avtalen vil automatisk slettes dersom den ikke blir inngått eller endret innen{' '}
{formaterSlettetidspunkt(avtale.sistEndret)}.
diff --git a/src/komponenter/alleredeOpprettetTiltak/innholdsvisning/AlleredeOpprettetAvtaleDetaljer.tsx b/src/komponenter/alleredeOpprettetTiltak/innholdsvisning/AlleredeOpprettetAvtaleDetaljer.tsx
index 858ccb3d5..2de5344e9 100644
--- a/src/komponenter/alleredeOpprettetTiltak/innholdsvisning/AlleredeOpprettetAvtaleDetaljer.tsx
+++ b/src/komponenter/alleredeOpprettetTiltak/innholdsvisning/AlleredeOpprettetAvtaleDetaljer.tsx
@@ -3,7 +3,7 @@ import { BEMWrapper } from '@/utils/bem';
import { AlleredeRegistrertAvtale } from '@/types/avtale';
import { BodyShort, Link } from '@navikt/ds-react';
import { Expand } from '@navikt/ds-icons';
-import { formatterDato } from '@/utils/datoUtils';
+import { formaterDato } from '@/utils/datoUtils';
import { avtaleStatusTekst } from '@/messages';
import RadInfo from '@/komponenter/alleredeOpprettetTiltak/innholdsvisning/RadInfo';
import { storForbokstav } from '@/utils/stringUtils';
@@ -19,7 +19,7 @@ const AlleredeOpprettetAvtaleDetaljer: React.FC = ({ cls, innhold }) => {
const settGodkjentAvBeslutter = () => {
if (['VARIG_LONNSTILSKUDD', 'MIDLERTIDIG_LONNSTILSKUDD', 'SOMMERJOBB'].includes(innhold.tiltakstype)) {
const info = innhold.godkjentAvBeslutter
- ? formatterDato(innhold.godkjentAvBeslutter, 'DD.MM.YY')
+ ? formaterDato(innhold.godkjentAvBeslutter, 'dd.MM.yy')
: 'ikke godkjent';
return ;
}
@@ -27,7 +27,7 @@ const AlleredeOpprettetAvtaleDetaljer: React.FC = ({ cls, innhold }) => {
};
const settDatoInfo = (datoString: string | null, backupTxt: string): string =>
- datoString ? formatterDato(datoString, 'DD.MM.YY') : backupTxt;
+ datoString ? formaterDato(datoString, 'dd.MM.yy') : backupTxt;
return (
@@ -63,7 +63,7 @@ const AlleredeOpprettetAvtaleDetaljer: React.FC = ({ cls, innhold }) => {
/>
{settGodkjentAvBeslutter()}
-
+
diff --git a/src/komponenter/datovelger/Datovelger.tsx b/src/komponenter/datovelger/Datovelger.tsx
index cf2975999..5436d10db 100644
--- a/src/komponenter/datovelger/Datovelger.tsx
+++ b/src/komponenter/datovelger/Datovelger.tsx
@@ -2,7 +2,7 @@ import { AvtaleContext } from '@/AvtaleProvider';
import { Avtaleinnhold } from '@/types/avtale';
import { DateValidationT, DatePicker, useDatepicker } from '@navikt/ds-react';
import { FunctionComponent, PropsWithChildren, useContext, useState } from 'react';
-import { formatterDatoHvisDefinert } from '@/utils/datoUtils';
+import { formaterDatoHvisDefinert } from '@/utils/datoUtils';
import { AvtaleMinMaxDato } from '@/AvtaleSide/steg/VarighetSteg/AvtaleMinMaxDato/AvtaleMinMaxDato';
interface Props {
@@ -57,14 +57,14 @@ const Datovelger: FunctionComponent = ({ label, datoFelt }: PropsWithChil
defaultSelected: avtale.gjeldendeInnhold[datoFelt] ? new Date(avtale.gjeldendeInnhold[datoFelt]!) : undefined,
onDateChange: (dato) => {
settAvtaleInnholdVerdier({
- [datoFelt]: formatterDatoHvisDefinert(dato?.toDateString(), 'YYYY-MM-DD'),
+ [datoFelt]: formaterDatoHvisDefinert(dato?.toDateString(), 'yyyy-MM-dd'),
});
},
onValidate: (val) => {
feilmelding(
val,
- formatterDatoHvisDefinert(datepickerProps.fromDate?.toDateString()),
- formatterDatoHvisDefinert(datepickerProps.toDate?.toDateString()),
+ formaterDatoHvisDefinert(datepickerProps.fromDate?.toDateString()),
+ formaterDatoHvisDefinert(datepickerProps.toDate?.toDateString()),
);
},
});
diff --git a/src/komponenter/datovelger/DatovelgerForlengOgForkort.tsx b/src/komponenter/datovelger/DatovelgerForlengOgForkort.tsx
index 5d9e24fb1..f36e31cc0 100644
--- a/src/komponenter/datovelger/DatovelgerForlengOgForkort.tsx
+++ b/src/komponenter/datovelger/DatovelgerForlengOgForkort.tsx
@@ -2,7 +2,7 @@ import { AvtaleContext } from '@/AvtaleProvider';
import { Avtaleinnhold } from '@/types/avtale';
import { DatePicker, useDatepicker } from '@navikt/ds-react';
import { FunctionComponent, PropsWithChildren, useContext } from 'react';
-import { formatterDatoHvisDefinert } from '@/utils/datoUtils';
+import { formaterDatoHvisDefinert } from '@/utils/datoUtils';
import { ISODateString } from '@/AvtaleSide/steg/VarighetSteg/AvtaleMinMaxDato/AvtaleMinMaxDato';
interface Props {
@@ -28,7 +28,7 @@ const DatovelgerForlengOgForkort: FunctionComponent = ({
inputFormat: 'dd.MM.yyyy',
defaultSelected: avtale.gjeldendeInnhold[datoFelt] ? new Date(avtale.gjeldendeInnhold[datoFelt]!) : undefined,
onDateChange: (dato) => {
- onChangeHåndtereNyDato(formatterDatoHvisDefinert(dato?.toDateString(), 'YYYY-MM-DD'));
+ onChangeHåndtereNyDato(formaterDatoHvisDefinert(dato?.toDateString(), 'yyyy-MM-dd'));
},
});
diff --git a/src/services/rest-service.ts b/src/services/rest-service.ts
index 06742b6df..4bcbb8c8c 100644
--- a/src/services/rest-service.ts
+++ b/src/services/rest-service.ts
@@ -571,14 +571,6 @@ export const endreOmMentor = async (avtale: Avtale, mentorInnhold: MentorInnhold
await mutate(`/avtaler/${avtale.id}/versjoner`);
};
-export const justerArenaMigreringsdato = async (avtale: Avtale, migreringsdato: string): Promise => {
- await api.post(`/avtaler/${avtale.id}/juster-arena-migreringsdato`, { migreringsdato });
- await mutate(`/avtaler/${avtale.id}/versjoner`);
-};
-export const justerArenaMigreringsdatoDryRun = async (avtale: Avtale, migreringsdato: string): Promise => {
- const response = await api.post(`/avtaler/${avtale.id}/juster-arena-migreringsdato/dry-run`, { migreringsdato });
- return response.data;
-};
export const hentVtaoSats = async (forDato?: string): Promise<{ aar: number; belop: number }> => {
const queryParams = new URLSearchParams(removeEmpty({ forDato }));
const response = await api.get(`/satser/vtao?${queryParams}`);
diff --git a/src/types/avtale.spec.ts b/src/types/avtale.spec.ts
deleted file mode 100644
index eb83f1df9..000000000
--- a/src/types/avtale.spec.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { expect, test } from 'vitest';
-
-import * as avtale from './avtale';
-
-test('Test that datoIkkeTilbakeITid is defined', () => {
- expect(avtale).toBeDefined();
-});
diff --git a/src/types/avtale.ts b/src/types/avtale.ts
index 6531ae021..3109568fd 100644
--- a/src/types/avtale.ts
+++ b/src/types/avtale.ts
@@ -49,8 +49,8 @@ export type AvtaleMinimalListeVisning = {
deltakerEtternavn: string;
bedriftNavn: string;
veilederNavIdent: string;
- startDato: string;
- sluttDato: string;
+ startDato: string | null;
+ sluttDato: string | null;
status: AvtaleStatus;
tiltakstype: TiltaksType;
erGodkjentTaushetserklæringAvMentor: boolean;
diff --git a/src/utils/datoUtils.spec.ts b/src/utils/datoUtils.spec.ts
deleted file mode 100644
index 3b1451419..000000000
--- a/src/utils/datoUtils.spec.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { expect, test } from 'vitest';
-
-import * as datoUtils from './datoUtils';
-
-test('Test that datoIkkeTilbakeITid is defined', () => {
- expect(datoUtils).toBeDefined();
-});
diff --git a/src/utils/datoUtils.ts b/src/utils/datoUtils.ts
index c4124112e..a63f99c58 100644
--- a/src/utils/datoUtils.ts
+++ b/src/utils/datoUtils.ts
@@ -1,126 +1,85 @@
-import moment from 'moment';
-import 'moment/dist/locale/nb';
-moment.locale('nb');
-import { format } from 'date-fns';
+import { differenceInDays, format, isBefore, formatDistanceToNowStrict, Duration, intervalToDuration } from 'date-fns';
import { nb } from 'date-fns/locale';
-export const datoIkkeTilbakeITid = (dato: Date) => {
- return moment().isSameOrBefore(dato, 'date');
-};
-const units: Array<{ unit: moment.unitOfTime.Base; key: moment.RelativeTimeKey }> = [
- { unit: 'y', key: 'yy' },
- { unit: 'M', key: 'MM' },
- { unit: 'd', key: 'dd' },
- { unit: 'h', key: 'hh' },
- { unit: 'm', key: 'mm' },
- { unit: 's', key: 'ss' },
+const units: Array<{ unit: keyof Duration; single: string; plural: string }> = [
+ { unit: 'years', single: 'år', plural: 'år' },
+ { unit: 'months', single: 'måned', plural: 'måneder' },
+ { unit: 'days', single: 'dag', plural: 'dager' },
];
-export const accurateHumanize = (duration: moment.Duration, accuracy: number = 2): string => {
- let beginFilter = false;
- let componentCount = 0;
+
+export const formaterVarighet = (dato1: Date | string, dato2: Date | string): string => {
+ const duration = intervalToDuration({ start: dato1, end: dato2 });
return units
- .map(({ unit, key }) => ({ value: duration.get(unit), key }))
- .filter(({ value, key }) => {
- if (beginFilter === false) {
- if (value === 0) return false;
- beginFilter = true;
- }
- componentCount++;
- return value !== 0 && componentCount <= accuracy;
+ .filter(({ unit }) => duration[unit] !== undefined)
+ .map(({ unit, single, plural }) => {
+ const value = duration[unit] || 0;
+ if (value === 1) {
+ return `${value} ${single}`;
+ } else return `${value} ${plural}`;
})
- .map(({ value, key }) => ({ value, key: value === 1 ? key[0] : key }))
- .map(({ value, key }) => moment.localeData().relativeTime(value, true, key as moment.RelativeTimeKey, true))
.join(', ');
};
/**
- * @deprecated
- */
-export const NORSK_DATO_OG_TID_FORMAT = 'DD.MM.YYYY HH:mm';
-/**
- * @deprecated
+ * Eksempel:
+ * `format(new Date('2024-01-10', NORSK_DATO_OG_TID_FORMAT_NY, {locale: nb}))` => '10. januar 2025 kl. 01:00'
*/
-export const NORSK_DATO_FORMAT = 'DD.MM.YYYY';
+export const NORSK_DATO_OG_TID_FORMAT_FULL = 'PPPp';
+
/**
* For bruk når man formaterer med date-fns (ikke moment)
*/
-export const NORSK_DATO_FORMAT_NY = 'dd.MM.yyyy';
+export const NORSK_DATO_FORMAT = 'dd.MM.yyyy';
-/**
- * Formater en dato gitt en formateringsstring.
- *
- * Bør fases ut til fordel for `formaterDatoNy`
- *
- * @deprecated
- */
-export const formatterDato = (dato: string, format: string = NORSK_DATO_OG_TID_FORMAT) => {
- try {
- if (dato === '-999999999-01-01') return '';
- const formattertDato = moment(dato).format(format);
- return !formattertDato.includes('NaN') ? formattertDato : dato;
- } catch (e) {
- return dato;
- }
-};
+export const NORSK_DATO_FORMAT_FULL = 'PPP';
/**
* Formater en dato gitt en formateringsstring.
- *
- * Bruker date-fns, og ikke moment.
*/
-export const formaterDatoNy = (dato: string, formatString: string = NORSK_DATO_OG_TID_FORMAT) => {
+export const formaterDato = (dato: string, formatString: string = NORSK_DATO_OG_TID_FORMAT_FULL) => {
try {
if (dato === '-999999999-01-01') return '';
const formatertDato = format(dato, formatString, { locale: nb });
return !formatertDato.includes('NaN') ? formatertDato : dato;
} catch (e) {
- return dato;
+ return 'Ugyldig dato';
}
};
/**
* Formater en (tilskudds)periode gitt en formateringsstring.
- *
- * Bruker date-fns, og ikke moment.
*/
-export const formaterPeriodeNy = (fra: string, til: string, format: string = NORSK_DATO_FORMAT) => {
- return formaterDatoNy(fra, format) + ' – ' + formaterDatoNy(til, format);
+export const formaterPeriode = (fra: string, til: string, format: string = NORSK_DATO_FORMAT) => {
+ return formaterDato(fra, format) + ' – ' + formaterDato(til, format);
};
-/**
- * Formater en (tilskudds)periode gitt en formateringsstring.
- *
- * Bør fases ut til fordel for `formaterPeriodeNy`.
- *
- * @deprecated
- */
-export const formatterPeriode = (fra: string, til: string, format: string = NORSK_DATO_FORMAT) => {
- return formatterDato(fra, format) + ' – ' + formatterDato(til, format);
+export const erDatoTilbakeITid = (dato?: string) => {
+ const now = new Date();
+ return differenceInDays(dato!, now) < 0 && isBefore(dato!, now);
};
-export const erDatoTilbakeITid = (dato?: string) => moment(dato).diff(moment(), 'days') < 0;
-
export const visPeriodeForTiltak = (fra?: string, til?: string): string => {
- if (fra && til) return formatterPeriode(fra, til, 'DD.MM.YY');
- if (fra && !til) return formatterDato(fra, 'DD.MM.YY') + ' - sluttdato ikke satt';
- if (!fra && til) return 'startdato ikke satt - ' + formatterDato(til, 'DD.MM.YY');
+ if (fra && til) return formaterPeriode(fra, til, 'dd.MM.yy');
+ if (fra && !til) return formaterDato(fra, 'dd.MM.yy') + ' - sluttdato ikke satt';
+ if (!fra && til) return 'startdato ikke satt - ' + formaterDato(til, 'dd.MM.yy');
return 'ikke satt';
};
-export const formatterDatoHvisDefinert = (dato?: string, format: string = NORSK_DATO_FORMAT) => {
- if (!dato) return '';
- const formattertDato = formatterDato(dato, format);
- if (formattertDato === 'Invalid date') {
+export const formaterDatoHvisDefinert = (dato?: string | null, format: string = NORSK_DATO_FORMAT) => {
+ if (!dato) return '-';
+ const formatertDato = formaterDato(dato, format);
+ if (formatertDato === 'Ugyldig dato') {
return dato;
}
- return formatterDato(dato, format);
+ return formatertDato;
};
-export const formaterTid = (tidspunkt: string) => {
- const antallTimerSiden = moment(moment()).diff(tidspunkt, 'hours');
- if (antallTimerSiden > 12) {
- return formatterDato(tidspunkt);
- } else {
- return moment(tidspunkt).fromNow();
- }
+/**
+ * Eksempler:
+ * `tidSidenTidspunkt(addDays(new Date(), -5))` => '5 dager'
+ * `tidSidenTidspunkt(addHours(new Date(), -5))` => '5 timer'
+ * `tidSidenTidspunkt(addYears(new Date(), -5))` => '5 år'
+ */
+export const tidSidenTidspunkt = (tidspunkt: string) => {
+ return formatDistanceToNowStrict(tidspunkt, { locale: nb });
};
diff --git a/src/utils/fnrUtils.ts b/src/utils/fnrUtils.ts
index b90cefa9e..a51c5ff8b 100644
--- a/src/utils/fnrUtils.ts
+++ b/src/utils/fnrUtils.ts
@@ -1,4 +1,4 @@
-import moment from 'moment';
+import { differenceInYears } from 'date-fns';
import { ChangeEvent, Dispatch, SetStateAction } from 'react';
/** Beregner gyldighet av fødselsnr med utgangspunkt i mod11.
@@ -117,9 +117,9 @@ export const setFnrBrukerOnChange = (
}
};
export const erUnder18 = (fnr: string): boolean => {
- const idag = moment();
- const bursdagDatoMoment = moment(genererFnrdatostringFraFnr(fnr).isoDatostring);
- return idag.diff(bursdagDatoMoment, 'years') < 18;
+ const idag = new Date();
+ const bursdagDato = new Date(genererFnrdatostringFraFnr(fnr).isoDatostring);
+ return differenceInYears(idag, bursdagDato) < 18;
};
export { genererFnrdatostringFraFnr, validerFnr };
|