원클릭으로
sif-soknad-oppsummering
Sett opp OppsummeringSteg i en v2-app — DTO-basert oppsummering med FormSummary, bekreftelsescheckbox og i18n-nøkler.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Sett opp OppsummeringSteg i en v2-app — DTO-basert oppsummering med FormSummary, bekreftelsescheckbox og i18n-nøkler.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Mønster for å kombinere flere API-hooks til én asynkron laster (useInitialData + InitialDataLoader) i sif-soknad-apper.
Legg til et nytt steg i en søknadsapp som bruker @sif/soknad og @sif/rhf — oppretter alle filer og oppdaterer config/routing/i18n.
Arkitekturreferanse og beslutningslogg for @sif/soknad-app — rammeverket for søknadsapper i sif-brukerdialog.
Veiledning for oppsett av en ny søknadsapp med @sif/soknad-app — SøknadRouter, SøknadAppProvider, AppContext og routing shell.
Implementer et vedleggssteg i en v2-app — VedleggPanel, PersistedVedlegg, hydration og MSW-handlere.
Bruk denne skillen for å fange opp og rette feilaktig datoparsing fra backend i v2-apper — tidssoneproblemer, feil bruk av Date/dayjs og blandede ISODate/ISODateTime-verdier i frontend.
| name | sif-soknad-oppsummering |
| type | action |
| description | Sett opp OppsummeringSteg i en v2-app — DTO-basert oppsummering med FormSummary, bekreftelsescheckbox og i18n-nøkler. |
Signalord: oppsummering, OppsummeringSteg, sett opp oppsummering, ny oppsummering, oppsummeringsside
OppsummeringSteg.tsx med alle domeneseksjoner via FormLayout.Summarynb.ts som dekker alle labelsuseSendSøknad.ts og soknadsdataToSøknadDTO.ts hvis de ikke finnes fra førOppsummeringSteg.tsx og tilhørende i18n/nb.tsuseSendSøknad.ts og soknadsdataToSøknadDTO.ts hvis de ikke finnes fra før@sif/soknad-ui, ikke fra gamle pakker (@navikt/sif-common-core-ds o.l.)src/app/steps/oppsummering/OppsummeringSteg.tsx — eksisterende skallsrc/app/steps/oppsummering/i18n/nb.ts — eksisterende i18n-nøklersrc/app/utils/soknadsdataToSoknadDTO.ts — forstå DTO-strukturen (opprett om den ikke finnes)src/app/types/SoknadApiData.ts — DTO-typensrc/app/hooks/useSendSoknad.ts — innsendingshook (opprett om den ikke finnes)Les ikke andre steg, setup-filer eller packages utover dette.
Disse to filene er forutsetninger for OppsummeringSteg. Opprett dem om de ikke finnes fra før.
src/app/hooks/useSendSoknad.tsimport { ApiError } from '@sif/api';
import { useMutation } from '@tanstack/react-query';
import { sendSøknad } from '../api/sendSoknad';
import { SøknadApiData } from '../types/SoknadApiData';
export const useSendSøknad = () => {
return useMutation<void, ApiError, SøknadApiData>({
mutationFn: (data) => sendSøknad(data),
});
};
src/app/utils/soknadsdataToSoknadDTO.tsMapper Søknadsdata + Søker + språk til SøknadApiData (minus harBekreftetOpplysninger som legges til ved innsending).
import { Søker } from '@sif/api/k9-prosessering';
import { SøknadStepId } from '../types/SoknadStepId';
import { SøknadApiData } from '../types/SoknadApiData';
import { Søknadsdata } from '../types/Soknadsdata';
interface Params {
søker: Søker;
søknadsdata: Søknadsdata;
språk: string;
}
export const søknadsdataToSøknadDTO = ({
søker,
søknadsdata,
språk,
}: Params): Omit<SøknadApiData, 'harBekreftetOpplysninger'> | undefined => {
const mittSteg = søknadsdata[SøknadStepId.MITT_STEG];
if (!mittSteg) return undefined; // returner undefined om obligatoriske steg mangler
// Vedlegg sendes som backend-URL-array (full API-URL, ikke bare ID):
const vedlegg = søknadsdata[SøknadStepId.VEDLEGG]?.vedlegg.map((v) => v.backendUrl) ?? [];
return {
språk,
søkerNorskIdent: søker.fødselsnummer,
// ... map domenefeltene til API-kontrakten
vedlegg,
};
};
Viktige detaljer:
undefined om obligatoriske steg mangler i søknadsdata.map(v => v.backendUrl) — DTO-kontrakten forventer string[] med fulle API-URLerbackendUrl er allerede satt på PersistedVedlegg av toPersistedVedlegg i steg-utilsharBekreftetOpplysninger legges til separat i OppsummeringSteg ved innsending (ikke her)?? undefined eller ?? [] avhengig av API-feltetLes DTO-typen fra SoknadApiData.ts og soknadsdataToSoknadDTO.ts. Identifiser:
?) og skal vises betingetFinn oppsummeringstekstene i v1-appen (typisk oppsummeringMessages.ts eller tilsvarende). Bruk de samme norske tekstene, men med nye nøkkelprefikser i v2 (f.eks. oppsummeringSteg.* i stedet for steg.oppsummering.*).
Alt i én fil. Hoved-eksporten håndterer form og submit; domeneseksjonene er interne komponenter:
OppsummeringSteg ← hoved-eksport, form + submit-logikk
Om<Seksjon>Oppsummering ← intern komponent per domeneseksjon
<Enum>Tekst ← intern komponent for enum → tekst (se under)
text()-funksjonEn funksjon som returnerer en AppMessageKeys-streng vil gi TypeScript-feil fordi switch-en ikke er exhaustiv for kompilatoren. Bruk i stedet en lokal komponent med <AppText>:
const RelasjonTilBarnetTekst = ({ relasjon }: { relasjon: SøkersRelasjonTilBarnet }) => {
switch (relasjon) {
case SøkersRelasjonTilBarnet.MOR:
return <AppText id="omBarnetSteg.relasjon.mor" />;
case SøkersRelasjonTilBarnet.FAR:
return <AppText id="omBarnetSteg.relasjon.far" />;
// ... osv.
}
};
Vis vedlegg som lenkeliste, ikke bare antall. Bruk VedleggSummaryList fra @sif/soknad-ui/components og les vedleggene fra state.søknadsdata, ikke fra DTO. Importer PersistedVedlegg fra @sif/soknad-forms for type-annotering.
Når gammel løsning brukte Alert inline, bruk InlineMessage fra Aksel.
import { VedleggSummaryList } from '@sif/soknad-ui/components';
const legeerklæring = state.søknadsdata[SøknadStepId.LEGEERKLÆRING]?.vedlegg ?? [];
{
legeerklæring.length === 0 ? (
<InlineMessage status="warning">
<AppText id="oppsummeringSteg.vedlegg.ingenLastetOpp" />
</InlineMessage>
) : (
<VedleggSummaryList vedlegg={legeerklæring} />
);
}
DTO-feltene inneholder backend-URLer (strenger). Lenkelista trenger name, url og gjerne size, og må derfor bruke PersistedVedlegg[] fra søknadsdata. PersistedVedlegg importeres fra @sif/soknad-forms.
Hvis DTO ikke kan bygges (dto === undefined), vis InfoCard variant="warning" og disable submit:
submitDisabled={!dto}
{!dto && (
<InfoCard data-color="warning">
<InfoCard.Header>
<InfoCard.Title><AppText id="oppsummeringSteg.feil.tittel" /></InfoCard.Title>
</InfoCard.Header>
<InfoCard.Content><AppText id="oppsummeringSteg.feil.innhold" /></InfoCard.Content>
</InfoCard>
)}
{dto && (
<FormLayout.Summary>
{/* domeneseksjoner */}
</FormLayout.Summary>
)}
FormLayout.Summary importeres fra @sif/soknad-ui.
I nåværende v2-mønster hentes state fra useSøknadAppContext (ikke useSøknadState):
import { useSøknadAppContext, useSøknadSendt } from '@sif/soknad-app';
const { store } = useSøknadAppContext();
const søknadsdata = store((s) => s.søknadsdata) as Søknadsdata;
const { onSøknadSendt } = useSøknadSendt();
App-spesifikk data (søker, barn, kontoInfo) hentes via useAppContext() fra @app/context/AppContext.
Nøkkelprefikset for oppsummeringssteget er oppsummeringSteg.*. Alltid inkluder:
oppsummeringSteg.bekrefterOpplysninger.labeloppsummeringSteg.feil.tittel + oppsummeringSteg.feil.innholdoppsummeringForm.validation.bekrefterOpplysninger.notCheckedHåndter feil fra useSendSøknad ved innsending. mutateAsync kaster ApiError — bruk getInvalidParametersFromApiError fra @sif/api for å sjekke om feilen inneholder ugyldige parametre.
Mønster:
error fra useSendSøknad() (via useMutation)getInvalidParametersFromApiError(error) for å ekstrahere eventuelle InvalidParameterViolation[]LocalAlert status="error" (med LocalAlert.Header/LocalAlert.Content) hvis invalidParameters finnesErrorSummary med error.message ellersimport { getInvalidParametersFromApiError } from '@sif/api';
const { isPending, mutateAsync, error: sendSøknadError } = useSendSøknad();
const invalidParameters = getInvalidParametersFromApiError(sendSøknadError);
const onSubmit = async () => {
try {
await mutateAsync({ ...dto, harBekreftetOpplysninger });
await slettMellomlagring();
setSøknadSendt();
} catch {
return; // Feilen håndteres via sendSøknadError-state
}
};
// I JSX:
{sendSøknadError && invalidParameters && (
<InnsendingFeiletAlert invalidParameters={invalidParameters} />
)}
{sendSøknadError && !invalidParameters && (
<ErrorSummary ref={errorSummaryRef}>
<ErrorSummaryItem>{sendSøknadError.message}</ErrorSummaryItem>
</ErrorSummary>
)}
i18n-nøkler for innsendingsfeil (prefiks oppsummeringSteg.innsendingFeilet.*):
oppsummeringSteg.innsendingFeilet.tittelparameterNameEtter at oppsummeringen er satt opp, sjekk at innhold og rekkefølge på seksjoner er identisk med v1:
!dto) vises korrekt