diff --git a/content/app/app-dev-course/modul2/_index.en.md b/content/app/app-dev-course/modul2/_index.en.md index 92fa6b92df5..56211128ca0 100644 --- a/content/app/app-dev-course/modul2/_index.en.md +++ b/content/app/app-dev-course/modul2/_index.en.md @@ -243,8 +243,8 @@ The service should run on your local computer with local test and you should be ### Solution If you did not manage to complete all the steps, we have an [example solution](https://altinn.studio/repos/ttd/tilflytter-sogndal-lf/src/branch/bolk/2) that you can use as inspiration. -![Screenshot of info page](/app/app-dev-course/modul2/infopage-screenshot.png "Screenshot of info page") +![Screenshot of info page](/app/app-dev-course/modul2/infopage-screenshot_OLD.png "Screenshot of info page") -![Screenshot of prefilled data collecting page](/app/app-dev-course/modul2/data-screenshot.png "Screenshot of prefilled data collecting page") +![Screenshot of prefilled data collecting page](/app/app-dev-course/modul2/data-screenshot_OLD.png "Screenshot of prefilled data collecting page") -![Screenshot of alternative workflow: this page is not for you](/app/app-dev-course/modul2/ikke-for-deg-screenshot.png "Screenshot of alternative workflow: this page is not for you") \ No newline at end of file +![Screenshot of alternative workflow: this page is not for you](/app/app-dev-course/modul2/ikke-for-deg-screenshot_OLD.png "Screenshot of alternative workflow: this page is not for you") \ No newline at end of file diff --git a/content/app/app-dev-course/modul2/_index.nb.md b/content/app/app-dev-course/modul2/_index.nb.md index 3a007d5defd..3a321c80747 100644 --- a/content/app/app-dev-course/modul2/_index.nb.md +++ b/content/app/app-dev-course/modul2/_index.nb.md @@ -9,7 +9,7 @@ weight: 20 I denne modulen skal du videreutvikle applikasjonen du laget i [modul 1](../modul1) med blant annet en ny side, dynamisk skjuling av sider, sporvalg og forhåndsutfylling. -Deler av modul 2 kan gjøres i Altinn Studio Designer, men noe må utføres med [lokal utvikling](/nb/app/getting-started/local-dev). +Deler av modul 2 kan gjøres i [Altinn Studio Designer](/nb/app/getting-started/ui-editor/) (Designer), men noe må utføres med [lokal utvikling](/nb/app/getting-started/local-dev). **Temaer som dekkes i denne modulen:** @@ -55,7 +55,6 @@ Bilde av Sogndals kommunevåpen som kan benyttes i applikasjonen: 1. Legg til en ny side. Gi den et passende navn og sørg for at den vises før skjemasiden du opprettet i modul 1. 2. [Legg til bilde](/nb/app/development/ux/components/images/#legge-til-bilder-i-applikasjonen) av Sogndals kommunevåpen. 3. Legg til tekst i henhold til [skisse](/app/app-dev-course/modul2/infoside_tilflyttere.pdf). - ### Nyttig dokumentasjon - [Formatering av tekst i en applikasjon](/nb/app/development/ux/texts/#formatering-av-tekster) @@ -65,9 +64,10 @@ Bilde av Sogndals kommunevåpen som kan benyttes i applikasjonen: - [Administrere rekkefølge på flere sider](/nb/app/development/ux/pages/navigation/#rekkefølge) ### Forståelsessjekk -(Klikk på spørsmålet for å se løsningen.) {{% expandbold "Hvilken fil i applikasjonsrepoet må redigeres dersom du manuelt ønsker å endre siderekkefølgen på eksisterende sider?" %}} +
+ I `App/ui/Settings.json` ligger siderekkefølgen beskrevet. For å justere på siderekkefølgen, må listen beskrevet under `pages.order` endres til å representere ønsket siderekkefølge. Se [Administrere rekkefølge på flere sider](/nb/app/development/ux/pages/navigation/#rekkefølge). @@ -76,6 +76,8 @@ Se [Administrere rekkefølge på flere sider](/nb/app/development/ux/pages/navig
{{% expandbold "Hvis du ønsker å gi en side et annet navn, men ikke har Altinn Studio tilgjengelig, hvilke filer må oppdateres med det nye filnavnet?" %}} +
+ - `App/ui/layouts/.json`: endre filnavnet (``) på siden som skal bytte navn. - `App/ui/Settings.json`: endre navnet på siden under `pages.order`. {{% /expandbold %}} @@ -83,12 +85,14 @@ Se [Administrere rekkefølge på flere sider](/nb/app/development/ux/pages/navig
{{% expandbold "Hvordan oppnår du at teksten bryter dersom tekststrengen ikke er lang nok til å naturlig brytes?" %}} +
+ Alle tekstressurser støtter markdown og dermed html-notasjon, så ved å benytte `
` vil man kunne tvinge tekstbrytning. {{% /expandbold %}} {{% /expandlarge %}} -{{% expandlarge id="innfore-sporvalg" header="Alternativ arbeidsflyt" %}} +{{% expandlarge id="sporvalg" header="Alternativ arbeidsflyt" %}} I mange tilfeller er det ikke aktuelt å svare på alle spørsmål i et skjema, kanskje fordi svaret sier seg selv, eller fordi det ikke er relevant basert på noe man har svart tidligere i skjemaet. Da kan sporvalg være en god løsning. Ved hjelp av sporvalg kan man styre hvilke sider i en applikasjon som er synlige for brukeren. @@ -99,7 +103,9 @@ I denne oppgaven skal du sette opp sporvalg i applikasjonen basert på kravene f En bruker som ikke oppfyller kravene for skjemaet skal stoppes så tidlig som mulig i arbeidsflyten. På infosiden er det ønskelig at brukeren skal oppgi om skjemaet gjelder dem eller ikke. - Hvordan dette gjøres er fritt fram. Feltet `Innflytter.KanBrukeSkjema` i datamodellen er mulig å benytte til dette formålet. + +Hvordan svaret innhentes er valgfritt. Merk at en komponent må knyttes til et felt i datamodellen for å kunne lagre verdier. + Feltet `Innflytter.KanBrukeSkjema` i datamodellen kan benyttes til dette formålet. Basert på svaret skal brukeren sendes videre til ett av følgende spor: @@ -133,16 +139,17 @@ https://www.sogndal.kommune.no/ - [Formatering av tekst](/nb/app/development/ux/texts/#formatering-av-tekster) ### Forståelsessjekk -(Klikk på spørsmålet for å se løsning.) {{% expandbold "Dersom man har sporvalg på et senere tidspunkt i en arbeidsflyt og en sluttbruker endrer et valg, hva skjer med skjemadataen man tidligere har fylt ut, dersom siden skjules for sluttbrukeren?" %}} +
+ Dersom du har denne typen logikk i en applikasjon der man kan fortsette til innsending for flere spor, bør dataen på siden(e) som nå blir skjult for bruker nullstilles. {{% /expandbold %}} {{% /expandlarge %}} -{{% expandlarge id="prefill-expandable" header="Forhåndsutfylling av personopplysninger" %}} +{{% expandlarge id="prefill" header="Forhåndsutfylling av personopplysninger" %}} En av fordelene til Altinn er at man allerede har metadata om både personer og virksomheter tilgjengelig. Ved hjelp av forhåndsutfylling kan man hente ned data om brukerne og presentere den i utfylte felter, slik at de slipper å fylle dem ut selv. Typiske forhåndsutfyllingsverdier vil være navn, adresse, e-post osv. @@ -169,70 +176,80 @@ I denne oppgaven flyttes fokus tilbake til den første datainnsamlingssiden, og 3. Opprett [egendefinert forhåndsutfylling](/nb/app/development/data/prefill/custom) for alder basert på personnummer. Husk at alder ikke skal kunne endres av bruker. {{% expandbold "Kodehjelp: Beregning av alder fra personnummer" %}} +
Denne funksjonen kan brukes til å beregne alder fra personnummeret. + ```cs private static int CalculateAge(string sosialSecNumber) -{ - int MAX_D_NUMBER = 71; - int MIN_D_NUMBER = 41; - int MAX_TEST_NUMBER = 92; - int MIN_TEST_NUMBER = 81; - int START_D_NUMBER = 40; - int START_TEST_NUMBER = 80; - string stringDay = sosialSecNumber.Substring(0, 2); - string stringMonth = sosialSecNumber.Substring(2, 2); - string stringYear = sosialSecNumber.Substring(4, 2); - string stringIndivid = sosialSecNumber.Substring(6, 3); - int day = int.Parse(stringDay); - int month = int.Parse(stringMonth); - int year = int.Parse(stringYear); - int individ = int.Parse(stringIndivid); - // Get day if D-number - if (MAX_D_NUMBER >= day && MIN_D_NUMBER <= day) - { - day -= START_D_NUMBER; - } - // Get month if TestUser-number - if (MAX_TEST_NUMBER >= month && MIN_TEST_NUMBER <= month) - { - month -= START_TEST_NUMBER; - } - // find century - if (year > 54 && (individ >= 500 && individ < 750)) - { - // 1855-1899 - year += 1800; - } - else if (year > 39 && (individ >= 900 && individ < 1000)) { - // 1940-1999 - year += 1900; - } - else if (year < 40 && (individ >= 500 && individ < 1000)) - { - // 2000-2039 - year += 2000; - } - else - { - year += 1900; - } - // calculate age - int age = DateTime.Now.Year - year; - if (DateTime.Now.Month < month) - { - age -= 1; - } - else if (DateTime.Now.Month == month) - { - if (DateTime.Now.Day < day) + int MAX_D_NUMBER = 71; + int MIN_D_NUMBER = 41; + int MAX_TEST_NUMBER = 92; + int MIN_TEST_NUMBER = 81; + int START_D_NUMBER = 40; + int START_TEST_NUMBER = 80; + + string stringDay = sosialSecNumber.Substring(0, 2); + string stringMonth = sosialSecNumber.Substring(2, 2); + string stringYear = sosialSecNumber.Substring(4, 2); + string stringIndivid = sosialSecNumber.Substring(6, 3); + + int day = int.Parse(stringDay); + int month = int.Parse(stringMonth); + int year = int.Parse(stringYear); + int individ = int.Parse(stringIndivid); + + // Get day if D-number + if (MAX_D_NUMBER >= day && MIN_D_NUMBER <= day) + { + day -= START_D_NUMBER; + } + + // Get month if TestUser-number + if (MAX_TEST_NUMBER >= month && MIN_TEST_NUMBER <= month) + { + month -= START_TEST_NUMBER; + } + + // find century + if (year > 54 && (individ >= 500 && individ < 750)) + { + // 1855-1899 + year += 1800; + } + else if (year > 39 && (individ >= 900 && individ < 1000)) + { + // 1940-1999 + year += 1900; + } + else if (year < 40 && (individ >= 500 && individ < 1000)) + { + // 2000-2039 + year += 2000; + } + else + { + year += 1900; + } + + // calculate age + int age = DateTime.Now.Year - year; + + if (DateTime.Now.Month < month) { age -= 1; } + else if (DateTime.Now.Month == month) + { + if (DateTime.Now.Day < day) + { + age -= 1; + } + } + + return age; } - return age; -} ``` {{% /expandbold %}}
@@ -248,19 +265,22 @@ private static int CalculateAge(string sosialSecNumber) ### Forståelsessjekk -(Klikk på spørsmålet for å se løsningen.) {{% expandbold "Er det mulig å endre en forhåndsutfylt verdi når den først er satt?" %}} +
+ Ja. Dersom man ikke gjør noen endringer vil en standardkomponent med forhåndsutfylt data være redigerbar. {{% /expandbold %}}
{{% expandbold "Hvordan kan man hindre at en forhåndsutfylt verdi endres av sluttbrukeren?" %}} +
+ Komponenten kan settes til `readOnly` på én av to måter: 1\. I Altinn Studio Designer ved å huke av ved "Det skal ikke være mulig å svare (read only)" for den aktuelle komponenten: -![Altinn Studio innstilling for 'read only'. Bilde]() +![Altinn Studio innstilling for 'read only'. Bilde]() 2\. Sette egenskapen `readOnly` til `true` for komponenten i json-filen til siden: ```json{linenos=false,hl_lines=["13"]} @@ -292,6 +312,7 @@ Alternativt kan man kjøre valideringer av dataen på serversiden for å verifis
{{% expandbold "Ikke alle norske innbyggere har et fødselsnummer, noen får tildelt et D-nummer. Hvordan må koden din justeres for å ta hensyn til dette dersom alder skal baseres på et fødselsnummer eller D-nummer som sluttbruker selv taster inn?" %}} +
{{% notice info %}} Et [D-nummer](https://jusleksikon.no/wiki/F%C3%B8dselsnummer#D-nummer) er ellevesifret, som ordinære fødselsnummer, og består av en modifisert sekssifret fødselsdato og et femsifret personnummer. Fødselsdatoen modifiseres ved at _det legges til 4 på det første sifferet_: En person født 1. januar 1980 får dermed fødselsdato 410180, mens en som er født 31. januar 1980 får 710180. @@ -328,7 +349,6 @@ public static string GetDOB(string fOrDNumber){ {{% /expandlarge %}} ## Oppsummering - I denne modulen har du utvidet applikasjonen din med mer funksjonalitet i form av å legge til flere sider, sette opp sporvalg for å styre brukerflyten og sette opp forhåndsutfylling av skjemafelter både med tilgjengelige datakilder i Altinn og egendefinert kode. @@ -338,26 +358,556 @@ bekrefte at riktige felter blir forhåndsutfylt.
-{{% expandlarge id="solution" header="Løsningsforslag" %}} +{{}} -Kildekode: [modul 2](https://altinn.studio/repos/testdep/flyttemelding-sogndal/src/branch/modul2) -(Kildekode [tidligere versjon modul 2](https://altinn.studio/repos/ttd/tilflytter-sogndal-lf/src/branch/bolk/2)) +{{% markdown %}} +[Kildekode modul 2](https://altinn.studio/repos/testdep/flyttemelding-sogndal/src/branch/modul2)
+[(Kildekode tidligere versjon modul 2)](https://altinn.studio/repos/ttd/tilflytter-sogndal-lf/src/branch/bolk/2)
-{{% expandbold "Legge til infoside" %}} +### Legge til infoside -![Skjermbilde av infoside. Bilde](infoside-screenshot.png "Skjermbilde av infoside") -{{% /expandbold %}} +I dette steget er det lagt til en enkel infoside med bilde og tekst. -{{% expandbold "Alternativ arbeidsflyt" %}} -![Skjermbilde av alternativ arbeidsflyt: dette skjemaet er ikke for deg](/app/app-dev-course/modul2/side-ikke-for-deg-screenshot.png "Skjermbilde av alternativ arbeidsflyt: dette skjemaet er ikke for deg") -{{% /expandbold %}} +![Skjermbilde av infoside. Bilde](screenshot-info-page-1.png "Infoside") + +{{% /markdown %}} + +{{}} + +{{}} + +
+ +#### Komponenter + +{{% notice info %}} +Se *Kode* for sidestilling av komponenter. +{{% /notice %}} + +![Komponenter på info-side. Bilde](screenshot-info-page-layout-1.png "Komponenter på info-side") + +#### Bilde + +I denne løsningen er bildet lastet ned og lagret i mappen`/App/wwwroot` (mappen `wwwroot` ble også opprettet). + Et alternativ er å bruke en ekstern URL for bildet som kilde. + +{{% expandbold "Legg til mappe wwwroot og last opp bilde i Designer" %}} +
+ +Naviger til repository (klikk logo øverst i høyre hjørne eller tre prikker til høyre på menylinjen) og velg "Last opp fil" fra menyen "Add file". + +![Repository legg til fil. Bilde](screenshot-repository-add-file.png "Repository") + +I feltet "Legg til mappe" fyller du inn `/App/wwwroot`. + Last opp bildet og legg til en beskrivende commit-melding. + Klikk "Commit endringer" for å lagre. + + +![Legg til fil. Bilde](screenshot-add-file.png "Legg til fil") + +![Eksempel utfylt legg til fil. Bilde](screenshot-add-file-filled.png "Utsnitt utfylt skjema") -{{% expandbold "Forhåndsutfylling" %}} -![Skjermbilde av forhåndsutfylt dataside](/app/app-dev-course/modul2/prefilled-data-screenshot.png "Skjermbilde av forhåndsutfylt dataside") {{% /expandbold %}} -{{% /expandlarge %}} +![Innstillinger for bilde. Skjermbilde](screenshot-image-settings-wwwroot.png "Innstillinger for bilde") + + +#### Tekst + +Både overskrift og beskrivelse er lagt til som "Paragraf" (underkategori av "Tekst") og formatert med markdown. + +![Innstillinger for overskrift](screenshot-heading-settings.png "Innstillinger for overskrift") + +![Innstillinger for beskrivelse. Bilde](screenshot-description-settings.png "Innstillinger for beskrivelse") + +{{
}} +{{}} + +
+ +#### Infoside - komponenter og innstillinger + +Sidestilling av bilde og overskrift er gjort ved hjelp av `grid` (markert). + +```json{linenos=false,hl_lines=["17-19", "30-32"]} +// Fil: /App/ui/layouts/info.json + +{ + "$schema": "https://altinncdn.no/schemas/json/layout/layout.schema.v1.json", + "data": { + "layout": [ + { + "id": "kommune-logo", + "type": "Image", + "image": { + "src": { + "nb": "wwwroot/kommune-logo.png" + }, + "width": "100%", + "align": "center" + }, + "grid": { + "xs": 2 + }, + "textResourceBindings": { + "altTextImg": "kommune-logo.altTextImg" + } + }, + { + "id": "overskrift", + "type": "Paragraph", + "textResourceBindings": { + "title": "info.overskrift.title" + }, + "grid": { + "xs": 7 + } + }, + { + "id": "beskrivelse", + "type": "Paragraph", + "textResourceBindings": { + "title": "info.beskrivelse.title" + } + }, + { + "id": "NavigationButtons-hateTR", + "type": "NavigationButtons", + "componentType": "NavigationButtons", + "dataModelBindings": {}, + "showBackButton": true, + "textResourceBindings": { + "next": "navigation.next", + "back": "navigation.back" + } + } + ] + } +} +``` + +#### Tekstressurser (nb) +```json +// Fil: /App/config/texts/resource.nb.json + +{ + "language": "nb", + "resources": [ + ... + { + "id": "info.overskrift.title", + "value": "# Skjema for informasjonsinnsamling for fremtidige tilflyttere" + }, + { + "id": "info.beskrivelse.title", + "value": "
Opplysningene du oppgir i dette skjemaet vil benyttes til å skreddersy en pakke med kommunale tilbud til deg og de du eventuelt flytter til kommunen sammen med.\n

\nDu skal ikke bruke dette skjemaet hvis:\n* Du er allerede bosatt i Sogndal kommune\n* Du bor i en annen kommune og har ingen planer om å flytte\n* Du skal flytte til Sogndal, men **ikke** i løpet av de neste 12 månedene." + }, + { + "id": "kommune-logo.altTextImg", + "value": "Sogndal kommunevåpen. Bilde" + } + ] +} +``` +{{
}} +{{
}} + +{{% gray-divider-line %}} + +{{% markdown %}} + +### Alternativ arbeidsflyt + +I denne løsningen er det valgt å legge til en komponent for radioknapper på info-siden hvor brukeren skal angi om de oppfyller kravene for å bruke skjemaet. + Det er valgt å forhåndsmarkere alternativet 'Nei' så brukeren må gjøre et aktivt valg for å bruke skjemaet. + + Som alternativ til radioknapper kan man bruke avkrysningsboks eller nedrekksfelt. + +![Skjermbilde av oppdatert infoside. Bilde](infoside-screenshot.png "Oppdatert infoside") + +Det er lagt til en ny side som brukere sendes til dersom de ikke bekrefter at de oppfyller kravene (spor 1). + +![Skjermbilde av alternativ arbeidsflyt: dette skjemaet er ikke for deg](side-ikke-for-deg-screenshot.png "Ny side: Dette skjemaet er ikke for deg") + +{{% /markdown %}} + +{{}} +{{}} + +{{% notice info %}} +Se *Kode* for logikk ved veivalg. +{{% /notice %}} + +#### Radioknapper info-side + +![Komponenter på info-side. Bilde](screenshot-info-page-layout-2.png "Ny komponent på info-siden") + +![Radioknapper innstillinger. Bilde](screenshot-radio-buttons-settings.png "Innstillinger for radioknapper") + +![]() + +#### Ny side + +Ny side for *Spor 1*. + +![Komponenter på siden ikke-for-deg. Bilde](screenshot-ikke-for-deg-layout.png "Komponenter på siden Ikke for deg") + +![Tekst innstillinger. Bilde](screenshot-ikke-for-deg-tekst.png "Innstillinger for tekst") + +{{}} + +{{}} + +
+ +#### Radioknapper + +```json{linenos=false,hl_lines=["8-29"]} +// Fil: /App/ui/layouts/info.json + +{ + "$schema": "https://altinncdn.no/schemas/json/layout/layout.schema.v1.json", + "data": { + "layout": [ + ... + { + "id": "bekreftelse", + "type": "RadioButtons", + "required": true, + "textResourceBindings": { + "title": "info.bekreft" + }, + "dataModelBindings": { + "simpleBinding": "Innflytter.KanBrukeSkjema" + }, + "options": [ + { + "label": "info.ja", + "value": "true" + }, + { + "label": "info.nei", + "value": "false" + } + ], + "preselectedOptionIndex": 1 + }, + ... + ] + } +} +``` + +#### Ny side 'Ikke for deg' og logikk ved veivalg + +Det er lagt til en ny side som skal vises dersom brukeren ikke oppfyller kravene for å bruke tjenesten. +Logikk for å skjule siden er lagt til ved hjelp av egenskapen `hidden` (se markering i koden). + Når det krysses av for at man oppfyller kravene for å bruke tjenesten.Siden blir skjult når verdien til komponenten med id `bekreftelse` (som er radioknapper) er lik `true`, altså + +```json{linenos=false,hl_lines="6-13"} +// Fil: /App/ui/layouts/ikke-for-deg.json + +{ + "$schema": "https://altinncdn.no/schemas/json/layout/layout.schema.v1.json", + "data": { + "hidden": [ + "equals", + [ + "component", + "bekreftelse" + ], + true + ], + "layout": [ + { + "id": "ikke-for-deg", + "type": "Paragraph", + "textResourceBindings": { + "title": "ikke-for-deg.info" + } + }, + { + "id": "NavigationButtons-azt7sj", + "type": "NavigationButtons", + "componentType": "NavigationButtons", + "dataModelBindings": {}, + "showBackButton": true, + "textResourceBindings": { + "back": "navigation.back" + } + } + ] + } +} +``` + +Tilsvarende logikk er lagt til for skjemasiden. + Denne siden vil skjules dersom verdien til `bekreftelse`-komponenten er satt til `false`, altså når det krysses av for at man *ikke* oppfyller kravene for tjenesten. + +```json{linenos=false,hl_lines=["6-13"]} +// Fil: /App/ui/layouts/innflytterPersonalia.json + +{ + "$schema": "https://altinncdn.no/schemas/json/layout/layout.schema.v1.json", + "data": { + "hidden": [ + "equals", + [ + "component", + "bekreftelse" + ], + false + ], + "layout": [ + ... +``` + +#### Ekskludere side fra pdf + +Siden 'Ikke for deg' ønsker vi ikke å inkludere dersom det skal genereres en pdf-fil. + Dette kan stilles inn med egenskapen `excludeFromPdf` i `Settings.json`. + +```json{linenos=false,hl_lines="10"} +// Fil: /App/Settings.json + +{ + "$schema": "https://altinncdn.no/schemas/json/layout/layoutSettings.schema.v1.json", + "pages": { + "order": [ + "info", + "innflytterPersonalia", + "ikke-for-deg" + ], + "excludeFromPdf": ["ikke-for-deg"] + } +} +``` + +#### Tekstressurser (nb) + +Nye tekstressurser som er lagt til. + +```json{linenos=false,hl_lines=["7-22"]} +// Fil: /App/config/texts/resource.nb.json + +{ + "language": "nb", + "resources": [ + ... + { + "id": "info.bekreft", + "value": "**Jeg møter kriteriene for å bruke appen.**" + }, + { + "id": "info.ja", + "value": "Ja" + }, + { + "id": "info.nei", + "value": "Nei" + }, + { + "id": "ikke-for-deg.info", + "value": "### Dette skjemaet er ikke for deg.

\n[Se en oversikt over tilbud i kommunen her](https://www.sogndal.kommune.no)." + } + ] +} +``` + +{{
}} +{{
}} + +{{% gray-divider-line %}} + +

Forhåndsutfylling

+ +{{% markdown %}} + +Under er et eksempel på hvordan datasiden kan se ut med forhåndsutfylt informasjon. + I tillegg til forhåndsutfylling er flere av komponentene sidestilt og det er lagt til en 'Send inn'-knapp. + +![Skjermbilde av forhåndsutfylt dataside](prefilled-data-screenshot.png "Oppdatert dataside med forhåndsutfylling") + +![]() + +{{% /markdown %}} + +{{}} +{{}} + +{{% notice info %}} +Se *Kode* for forhåndsutfylling og sidestilling av komponenter. +{{% /notice %}} + +![Komponenter på dataside. Bilde](screenshot-data-page-components.png "Komponenter på dataside") + +For felt som det ikke skal være mulig å endre (navn og alder) må det hukes av for dette: + +![Read only innstilling](screenshot-readonly-setting.png "Innstilling for readOnly") + +Det er lagt til en 'Send inn'-knapp for skjemaet: + +![Send inn-knapp innstillinger. Bilde](screenshot-send-inn-button-settings.png "Innstillinger for 'Send inn'-knapp") + +{{}} +{{}} + +#### Oppdatert dataside + +Komponentene for navn og alder er satt til `readOnly`, noen av komponentene er sidestilt og det er lagt til en ny knapp. + Koden under viser et eksempel med noen av komponentene der endringer er markert. + For en fullstendig løsning, se [kildekode for modul 2](https://altinn.studio/repos/testdep/flyttemelding-sogndal/src/branch/modul2). + +```json{linenos=false,hl_lines=["22", "26-28", "37", "41-43", "47-54"]} +// Fil: /App/ui/layouts/innflytterPersonalia.json + +{ + "$schema": "https://altinncdn.no/schemas/json/layout/layout.schema.v1.json", + "data": { + "hidden": [ + "equals", + [ + "component", + "bekreftelse" + ], + false + ], + "layout": [ + { + "id": "firstName", + "type": "Input", + "dataModelBindings": { + "simpleBinding": "Innflytter.Fornavn" + }, + "required": false, + "readOnly": true, + "textResourceBindings": { + "title": "firstName" + }, + "grid": { + "xs": 6 + } + }, + { + "id": "middleName", + "type": "Input", + "dataModelBindings": { + "simpleBinding": "Innflytter.Mellomnavn" + }, + "required": false, + "readOnly": true, + "textResourceBindings": { + "title": "middleName" + }, + "grid": { + "xs": 6 + } + }, + + ... + + { + "id": "send-inn", + "type": "Button", + "textResourceBindings": { + "title": "button.send-inn" + } + }, + ... + ] + } +} +``` + +#### Forhåndsutfylling + +Forhåndsutfylling av personalia (unntatt alder) er konfigurert i den nyopprettet filen `datamodel.prefill.json`: + +```json{linenos=false,hl_lines=[""]} +// Fil: /App/models/datamodel.prefill.json + +{ + "$schema": "https://altinncdn.no/schemas/json/prefill/prefill.schema.v1.json", + "allowOverwrite": true, + "ER": { + }, + "DSF": { + "FirstName": "Innflytter.Fornavn", + "MiddleName": "Innflytter.Mellomnavn", + "LastName": "Innflytter.Etternavn", + "TelephoneNumber": "Innflytter.Kontaktinformasjon.Telefonnummer" + }, + "UserProfile": { + "Email": "Innflytter.Kontaktinformasjon.Epost" + } +} +``` + +#### Beregning og forhåndsutfylling av alder + +For egendefinert forhåndsutfylling av alder er det opprettet en fil `InstantiationProcessor.cs` i mappen `logic/Instantiation` (mappen `Instantiation` er også opprettet). + Metoden `DataCreation` henter personnummer fra instansen og bruker det til å beregne alder ved hjelp av metoden `CalculateAge` (utelatt, se kodehjelp under [Forhåndsutfylling](#prefill) i oppgaveteksten). + Alderen blir så tilordnet datafeltet `skjema.Innflytter.Alder`. + +```csharp{linenos=false,hl_lines=[""]} +// Fil: App/logic/Instantiation/InstantiationProcessor.cs + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Altinn.App.Core.Features; +using Altinn.App.Models; +using Altinn.Platform.Storage.Interface.Models; + +namespace Altinn.App.AppLogic.Instantiation; + +public class InstantiationProcessor : IInstantiationProcessor +{ + public async Task DataCreation(Instance instance, object data, Dictionary prefill) + { + Skjema skjema = (Skjema)data; + string personNumber = instance.InstanceOwner.PersonNumber; + skjema.Innflytter.Alder = CalculateAge(personNumber); + await Task.CompletedTask; + } + + // Kode for hjelpemetoden CalculateAge() +} +``` + +Datatypen for `skjema` er gitt av datamodellen `datamodel.xsd`: + +```xml{linenos=false,hl_lines="4"} + + + + + + + ... +``` + +Til slutt må implementeringen registreres i `Program.cs` for at koden skal kjøre: + +```csharp{linenos=false,hl_lines="7"} +// Fil: /App/Program.cs +... + +void RegisterCustomAppServices(IServiceCollection services, IConfiguration config, IWebHostEnvironment env) +{ + // Register your apps custom service implementations here. + services.AddTransient(); +} + +... +``` + +{{}} +{{}} +{{
}}

-[<< Forrige modul](../modul1/) | [Neste modul >>](../modul3/) +{{% center %}} +[<< Forrige modul](../modul1/)      [Neste modul >>](../modul3/) +{{% /center %}} \ No newline at end of file diff --git a/content/app/app-dev-course/modul2/data-screenshot.png b/content/app/app-dev-course/modul2/data-screenshot_OLD.png similarity index 100% rename from content/app/app-dev-course/modul2/data-screenshot.png rename to content/app/app-dev-course/modul2/data-screenshot_OLD.png diff --git a/content/app/app-dev-course/modul2/ikke-for-deg-screenshot.png b/content/app/app-dev-course/modul2/ikke-for-deg-screenshot_OLD.png similarity index 100% rename from content/app/app-dev-course/modul2/ikke-for-deg-screenshot.png rename to content/app/app-dev-course/modul2/ikke-for-deg-screenshot_OLD.png diff --git a/content/app/app-dev-course/modul2/images-settings-example.png b/content/app/app-dev-course/modul2/images-settings-example.png deleted file mode 100644 index 9be99f689f2..00000000000 Binary files a/content/app/app-dev-course/modul2/images-settings-example.png and /dev/null differ diff --git a/content/app/app-dev-course/modul2/infopage-screenshot.png b/content/app/app-dev-course/modul2/infopage-screenshot_OLD.png similarity index 100% rename from content/app/app-dev-course/modul2/infopage-screenshot.png rename to content/app/app-dev-course/modul2/infopage-screenshot_OLD.png diff --git a/content/app/app-dev-course/modul2/screenshot-add-file-filled.png b/content/app/app-dev-course/modul2/screenshot-add-file-filled.png new file mode 100644 index 00000000000..2b9726e3dba Binary files /dev/null and b/content/app/app-dev-course/modul2/screenshot-add-file-filled.png differ diff --git a/content/app/app-dev-course/modul2/screenshot-add-file.png b/content/app/app-dev-course/modul2/screenshot-add-file.png new file mode 100644 index 00000000000..0a457a055b1 Binary files /dev/null and b/content/app/app-dev-course/modul2/screenshot-add-file.png differ diff --git a/content/app/app-dev-course/modul2/screenshot-data-page-components.png b/content/app/app-dev-course/modul2/screenshot-data-page-components.png new file mode 100644 index 00000000000..466e2ef9f60 Binary files /dev/null and b/content/app/app-dev-course/modul2/screenshot-data-page-components.png differ diff --git a/content/app/app-dev-course/modul2/screenshot-description-settings.png b/content/app/app-dev-course/modul2/screenshot-description-settings.png new file mode 100644 index 00000000000..639c5afcbd3 Binary files /dev/null and b/content/app/app-dev-course/modul2/screenshot-description-settings.png differ diff --git a/content/app/app-dev-course/modul2/screenshot-heading-settings.png b/content/app/app-dev-course/modul2/screenshot-heading-settings.png new file mode 100644 index 00000000000..80e02f4baf2 Binary files /dev/null and b/content/app/app-dev-course/modul2/screenshot-heading-settings.png differ diff --git a/content/app/app-dev-course/modul2/screenshot-ikke-for-deg-layout.png b/content/app/app-dev-course/modul2/screenshot-ikke-for-deg-layout.png new file mode 100644 index 00000000000..10be2c27bad Binary files /dev/null and b/content/app/app-dev-course/modul2/screenshot-ikke-for-deg-layout.png differ diff --git a/content/app/app-dev-course/modul2/screenshot-ikke-for-deg-tekst.png b/content/app/app-dev-course/modul2/screenshot-ikke-for-deg-tekst.png new file mode 100644 index 00000000000..44f8301e61a Binary files /dev/null and b/content/app/app-dev-course/modul2/screenshot-ikke-for-deg-tekst.png differ diff --git a/content/app/app-dev-course/modul2/screenshot-image-settings-ext-url.png b/content/app/app-dev-course/modul2/screenshot-image-settings-ext-url.png new file mode 100644 index 00000000000..3abbb192a59 Binary files /dev/null and b/content/app/app-dev-course/modul2/screenshot-image-settings-ext-url.png differ diff --git a/content/app/app-dev-course/modul2/screenshot-image-settings-wwwroot.png b/content/app/app-dev-course/modul2/screenshot-image-settings-wwwroot.png new file mode 100644 index 00000000000..8e1e7ff33bc Binary files /dev/null and b/content/app/app-dev-course/modul2/screenshot-image-settings-wwwroot.png differ diff --git a/content/app/app-dev-course/modul2/screenshot-info-page-1.png b/content/app/app-dev-course/modul2/screenshot-info-page-1.png new file mode 100644 index 00000000000..2769f293169 Binary files /dev/null and b/content/app/app-dev-course/modul2/screenshot-info-page-1.png differ diff --git a/content/app/app-dev-course/modul2/screenshot-info-page-layout-1.png b/content/app/app-dev-course/modul2/screenshot-info-page-layout-1.png new file mode 100644 index 00000000000..dff88bbd5b4 Binary files /dev/null and b/content/app/app-dev-course/modul2/screenshot-info-page-layout-1.png differ diff --git a/content/app/app-dev-course/modul2/screenshot-info-page-layout-2.png b/content/app/app-dev-course/modul2/screenshot-info-page-layout-2.png new file mode 100644 index 00000000000..bb2d754b8f1 Binary files /dev/null and b/content/app/app-dev-course/modul2/screenshot-info-page-layout-2.png differ diff --git a/content/app/app-dev-course/modul2/screenshot-radio-buttons-settings.png b/content/app/app-dev-course/modul2/screenshot-radio-buttons-settings.png new file mode 100644 index 00000000000..a074817b370 Binary files /dev/null and b/content/app/app-dev-course/modul2/screenshot-radio-buttons-settings.png differ diff --git a/content/app/app-dev-course/modul2/readonly-asd.png b/content/app/app-dev-course/modul2/screenshot-readonly-setting.png similarity index 100% rename from content/app/app-dev-course/modul2/readonly-asd.png rename to content/app/app-dev-course/modul2/screenshot-readonly-setting.png diff --git a/content/app/app-dev-course/modul2/screenshot-repository-add-file.png b/content/app/app-dev-course/modul2/screenshot-repository-add-file.png new file mode 100644 index 00000000000..5005feb9ef4 Binary files /dev/null and b/content/app/app-dev-course/modul2/screenshot-repository-add-file.png differ diff --git a/content/app/app-dev-course/modul2/screenshot-send-inn-button-settings.png b/content/app/app-dev-course/modul2/screenshot-send-inn-button-settings.png new file mode 100644 index 00000000000..dbcba2ddacc Binary files /dev/null and b/content/app/app-dev-course/modul2/screenshot-send-inn-button-settings.png differ diff --git a/content/app/app-dev-course/the-goon-dodgeball.gif b/content/app/app-dev-course/the-goon-dodgeball.gif deleted file mode 100644 index f2188d49eaa..00000000000 Binary files a/content/app/app-dev-course/the-goon-dodgeball.gif and /dev/null differ