Brukerveiledning - enkelt skjema
diff --git a/content/altinn-studio/concepts/payment/_index.en.md b/content/altinn-studio/concepts/payment/_index.en.md
index a3f71faf8c0..2195b41f506 100644
--- a/content/altinn-studio/concepts/payment/_index.en.md
+++ b/content/altinn-studio/concepts/payment/_index.en.md
@@ -14,7 +14,7 @@ The service owner is responsible for handling the retention of payment informati
## Nets Easy
-Support for using Nets Easy as a payment provider comes with the application. Guidance on setting up Nets Easy can be found [here](/altinn-studio/guides/payment/).
+Support for using Nets Easy as a payment provider comes with the application. Guidance on setting up Nets Easy can be found [here](/altinn-studio/guides/development/payment/).
The service owner must have a Nets Easy agreement.
You can find information on how to create the agreement here: [payments.nets.eu](https://payments.nets.eu/en-GB/checkout).
diff --git a/content/altinn-studio/concepts/payment/_index.nb.md b/content/altinn-studio/concepts/payment/_index.nb.md
index b572fbb4d7f..8857022ca8c 100644
--- a/content/altinn-studio/concepts/payment/_index.nb.md
+++ b/content/altinn-studio/concepts/payment/_index.nb.md
@@ -14,7 +14,7 @@ Det er tjenesteeier som må håndtere oppbevaring av betalingsinformasjon i henh
## Nets Easy
-Støtte for å bruke Nets Easy som betalingsleverandør følger med applikasjonen. Guide for oppsett av Nets Easy finner du [her](/nb/altinn-studio/guides/payment/).
+Støtte for å bruke Nets Easy som betalingsleverandør følger med applikasjonen. Guide for oppsett av Nets Easy finner du [her](/nb/altinn-studio/guides/development/payment/).
Tjenesteeier må ha avtale med Nets Easy.
Du finner informasjon om hvordan du oppretter avtalen her: [payments.nets.eu](https://payments.nets.eu/nb-NO/checkout).
diff --git a/content/altinn-studio/getting-started/_index.en.md b/content/altinn-studio/getting-started/_index.en.md
index cc6a6345c49..472719d82cc 100644
--- a/content/altinn-studio/getting-started/_index.en.md
+++ b/content/altinn-studio/getting-started/_index.en.md
@@ -6,4 +6,4 @@ weight: 21
{{
}}
## Create a service with a basic form
-Get started with creating services on Altinn Studio by following our [guide for creating a basic form](../guides/basic-form/) or by trying out our [service development course](./app-dev-course/).
\ No newline at end of file
+Get started with creating services on Altinn Studio by following our [guide for creating a basic form](../guides/development/basic-form/) or by trying out our [service development course](./app-dev-course/).
\ No newline at end of file
diff --git a/content/altinn-studio/getting-started/_index.nb.md b/content/altinn-studio/getting-started/_index.nb.md
index 6ec437165bb..61f7a9316fd 100644
--- a/content/altinn-studio/getting-started/_index.nb.md
+++ b/content/altinn-studio/getting-started/_index.nb.md
@@ -7,5 +7,5 @@ weight: 21
## Lag en tjeneste med enkelt skjema
Kom i gang med å lage tjenester på Altinn Studio ved å følge vår
-[guide for å lage et enkelt skjema](../guides/basic-form/) eller ved å prøve deg på vårt
+[guide for å lage et enkelt skjema](../guides/development/basic-form/) eller ved å prøve deg på vårt
[tjenesteutviklingskurs](./app-dev-course/).
\ No newline at end of file
diff --git a/content/altinn-studio/getting-started/app-dev-course-old/_index.en.md b/content/altinn-studio/getting-started/app-dev-course-old/_index.en.md
index f3bf3410fa5..fecf543347b 100644
--- a/content/altinn-studio/getting-started/app-dev-course-old/_index.en.md
+++ b/content/altinn-studio/getting-started/app-dev-course-old/_index.en.md
@@ -10,7 +10,7 @@ hidden: true
The intro course is divided into 7 modules and covers a fictional case for Sogndal Municipality.
Each module has a description of the task and links to relevant documentation.
-You can choose to perform the tasks in [Altinn Studio Designer](/altinn-studio/getting-started) (drag-and-drop graphical user interface) or in a [local development environment](/altinn-studio/guides/local-dev) (requires some technical skills).
+You can choose to perform the tasks in [Altinn Studio Designer](/altinn-studio/getting-started) (drag-and-drop graphical user interface) or in a [local development environment](/altinn-studio/guides/development/local-dev) (requires some technical skills).
You can also combine these approaches.
Throughout these seven modules, you will have covered the most essential functionality for an Altinn app, as well as testing the application locally and in a test environment.
diff --git a/content/altinn-studio/getting-started/app-dev-course-old/_index.nb.md b/content/altinn-studio/getting-started/app-dev-course-old/_index.nb.md
index 4e9fb11b973..6635d6ee968 100644
--- a/content/altinn-studio/getting-started/app-dev-course-old/_index.nb.md
+++ b/content/altinn-studio/getting-started/app-dev-course-old/_index.nb.md
@@ -12,7 +12,7 @@ hidden: true
Introkurset er delt opp i 7 moduler og dekker et fiktivt case for Sogndal kommune.
Hver modul har en beskrivelse av oppgaven og lenker til relevant dokumentasjon.
-Du kan velge å utføre oppgavene i [Altinn Studio Designer](/nb/altinn-studio/getting-started) (grafisk brukergrensesnitt med dra-og-slipp) eller i et [lokalt utviklingsmiljø](/nb/altinn-studio/guides/local-dev) (krever noe teknisk kompetanse).
+Du kan velge å utføre oppgavene i [Altinn Studio Designer](/nb/altinn-studio/getting-started) (grafisk brukergrensesnitt med dra-og-slipp) eller i et [lokalt utviklingsmiljø](/nb/altinn-studio/guides/development/local-dev) (krever noe teknisk kompetanse).
Du kan også kombinere disse fremgangsmåtene.
I løpet av disse syv modulene vil du ha vært innom den mest sentrale funksjonaliteten for en Altinn-app,
diff --git a/content/altinn-studio/getting-started/app-dev-course-old/modul1/_index.en.md b/content/altinn-studio/getting-started/app-dev-course-old/modul1/_index.en.md
index bd01de5c500..2fc1cbc46b7 100644
--- a/content/altinn-studio/getting-started/app-dev-course-old/modul1/_index.en.md
+++ b/content/altinn-studio/getting-started/app-dev-course-old/modul1/_index.en.md
@@ -9,7 +9,7 @@ weight: 20
In this module, you will create the application itself, add a data model, and set up a simple form based on the requirements from Sogndal Municipality.
You'll have to perform the first two tasks, creating the application and adding the data model, in Altinn Studio's graphical user interface, [Altinn Studio Designer](/altinn-studio/getting-started) (Designer).
- If you are developing the app locally, you can follow the instructions for [preparing for local development and testing](/altinn-studio/guides/local-dev) after completing these tasks.
+ If you are developing the app locally, you can follow the instructions for [preparing for local development and testing](/altinn-studio/guides/development/local-dev) after completing these tasks.
{{% notice info %}}
**NOTE**
@@ -41,7 +41,7 @@ You must have [access to the organization](/altinn-studio/getting-started/create
### Tasks
-1. [Create an application in Altinn Studio](/altinn-studio/guides/basic-form/)
+1. [Create an application in Altinn Studio](/altinn-studio/guides/development/basic-form/)
### Useful Documentation
@@ -73,7 +73,7 @@ Alternatively, copy the file URL and run the command `curl
> datamode
4. Open the app's repository from the [Altinn Studio Dashboard](/altinn-studio/getting-started/navigation/dashboard/) and look at the files in the `App/models` folder.
{{% notice info %}}
-If you intend to carry out all or parts of the development locally, now is the time to [prepare for local development and testing](/altinn-studio/guides/local-dev).
+If you intend to carry out all or parts of the development locally, now is the time to [prepare for local development and testing](/altinn-studio/guides/development/local-dev).
{{% /notice %}}
### Useful Documentation
@@ -219,7 +219,7 @@ Remember to upload your changes when working in Designer so that the repository
### Useful Documentation
-- [Guide to creating basic form](/altinn-studio/guides/basic-form)
+- [Guide to creating basic form](/altinn-studio/guides/development/basic-form)
- [Available components in Altinn Studio Library](/altinn-studio/designer/build-app/ui-designer/components/)
- [Guidelines for the use of components](/altinn-studio/guides/design/guidelines/components/)
diff --git a/content/altinn-studio/getting-started/app-dev-course-old/modul1/_index.nb.md b/content/altinn-studio/getting-started/app-dev-course-old/modul1/_index.nb.md
index 9d1c058d8a3..e07706e5772 100644
--- a/content/altinn-studio/getting-started/app-dev-course-old/modul1/_index.nb.md
+++ b/content/altinn-studio/getting-started/app-dev-course-old/modul1/_index.nb.md
@@ -9,7 +9,7 @@ weight: 20
I denne modulen skal du opprette selve applikasjonen, legge til datamodell og sette opp et enkelt skjema basert på kravene fra Sogndal kommune.
Du må utføre de to første oppgavene, opprette applikasjon og legge til datamodell, i Altinn Studios grafiske brukergrensesnitt, [Altinn Studio Designer](/nb/altinn-studio/getting-started) (Designer).
- Dersom du skal utvikle appen lokalt kan du følge instruksjonene for [klargjøre for lokal utvikling og testing](/nb/altinn-studio/guides/local-dev) etter at du har gjort disse oppgavene.
+ Dersom du skal utvikle appen lokalt kan du følge instruksjonene for [klargjøre for lokal utvikling og testing](/nb/altinn-studio/guides/development/local-dev) etter at du har gjort disse oppgavene.
{{% notice info %}}
**MERK**
@@ -42,7 +42,7 @@ Dersom du skal teste appen i et [testmiljø](/nb/altinn-studio/reference/testing
### Oppgaver
-1. [Opprett applikasjon i Altinn Studio](/nb/altinn-studio/guides/basic-form/)
+1. [Opprett applikasjon i Altinn Studio](/nb/altinn-studio/guides/development/basic-form/)
### Nyttig dokumentasjon
@@ -75,7 +75,7 @@ Sogndal kommune har opprettet en [datamodell](datamodel.xsd) som representerer t
4. Åpne repository til appen fra [Altinn Studio Dashboard](/nb/altinn-studio/getting-started/navigation/dashboard/) og ta en nærmere titt på filene i mappen `App/models`.
{{% notice info %}}
-Hvis du skal gjøre hele eller deler av utviklingen lokalt kan du nå [klargjøre for lokal utvikling og testing](/nb/altinn-studio/guides/local-dev).
+Hvis du skal gjøre hele eller deler av utviklingen lokalt kan du nå [klargjøre for lokal utvikling og testing](/nb/altinn-studio/guides/development/local-dev).
{{% /notice %}}
### Nyttig dokumentasjon
@@ -220,7 +220,7 @@ Husk å laste opp endringer når du jobber i Designer så de reflekteres i repoe
### Nyttig dokumentasjon
-- [Hvordan bygge et enkelt skjema i Altinn Studio](/nb/altinn-studio/guides/basic-form/)
+- [Hvordan bygge et enkelt skjema i Altinn Studio](/nb/altinn-studio/guides/development/basic-form/)
- [Tilgjengelige komponenter i Altinn Studio](/altinn-studio/designer/build-app/ui-designer/components/)
- [Retningslinjer for bruk av komponenter](/nb/altinn-studio/guides/design/guidelines/components/)
diff --git a/content/altinn-studio/getting-started/app-dev-course-old/modul2/_index.en.md b/content/altinn-studio/getting-started/app-dev-course-old/modul2/_index.en.md
index eb6229d7aee..af51df669cb 100644
--- a/content/altinn-studio/getting-started/app-dev-course-old/modul2/_index.en.md
+++ b/content/altinn-studio/getting-started/app-dev-course-old/modul2/_index.en.md
@@ -8,7 +8,7 @@ weight: 20
In this module, you will further develop the application you created in [Module 1](../modul1), including, among other things, a new page, hiding/showing pages based on dynamic expressions, and prefilling.
-You can do parts of Module 2 in [Altinn Studio Designer](/altinn-studio/getting-started/) (Designer), but some tasks need to be performed using [local development](/altinn-studio/guides/local-dev).
+You can do parts of Module 2 in [Altinn Studio Designer](/altinn-studio/getting-started/) (Designer), but some tasks need to be performed using [local development](/altinn-studio/guides/development/local-dev).
**Themes covered in this module:**
@@ -146,9 +146,9 @@ This task focuses on the first data collection page, aiming to streamline the us
- It should be possible to change prefilled email and phone number
### Tasks
-1. Create a [prefill file](/altinn-studio/guides/prefill/config/#setup-of-prefill-in-the-application-repository).
+1. Create a [prefill file](/altinn-studio/guides/development/prefill/config/#setup-of-prefill-in-the-application-repository).
2. Configure prefilling for values available through Altinn's [prefill sources](/altinn-studio/reference/data/prefill) (all but age).
-3. Create [custom prefilling](/altinn-studio/guides/prefill/custom) for age based on the personal identification number (see Code assistance and Useful resources below).
+3. Create [custom prefilling](/altinn-studio/guides/development/prefill/custom) for age based on the personal identification number (see Code assistance and Useful resources below).
4. Configure settings for fields that should not be editable by the user.
{{% expandsmall id="code-assistance" header="Code assistance: Calculating age from personal identification number" %}}
@@ -234,9 +234,9 @@ private static int CalculateAge(string sosialSecNumber)
*Remember to push your local changes to make them available in Altinn Studio.*
### Useful documentation
-- [Prefilling from national registers and user profile](/altinn-studio/guides/prefill/config)
+- [Prefilling from national registers and user profile](/altinn-studio/guides/development/prefill/config)
- [Available sources and values for prefilling](/altinn-studio/reference/data/prefill)
-- [Custom prefilling](/altinn-studio/guides/prefill/custom)
+- [Custom prefilling](/altinn-studio/guides/development/prefill/custom)
- [Instance](/api/models/instance/#instance) - Application metadata container
- [Description of the InstanceOwner object](/api/models/instance/#instanceowner) - This is where you can find the national identity number.
In the code, the properties are referred to with an uppercase first letter, not lowercase, as in this overview.
diff --git a/content/altinn-studio/getting-started/app-dev-course-old/modul2/_index.nb.md b/content/altinn-studio/getting-started/app-dev-course-old/modul2/_index.nb.md
index affc5a0f62c..9849ef8b28b 100644
--- a/content/altinn-studio/getting-started/app-dev-course-old/modul2/_index.nb.md
+++ b/content/altinn-studio/getting-started/app-dev-course-old/modul2/_index.nb.md
@@ -8,7 +8,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 og forhåndsutfylling.
-Deler av Modul 2 kan gjøres i [Altinn Studio Designer](/nb/altinn-studio/getting-started/) (Designer), men noe må utføres med [lokal utvikling](/nb/altinn-studio/guides/local-dev).
+Deler av Modul 2 kan gjøres i [Altinn Studio Designer](/nb/altinn-studio/getting-started/) (Designer), men noe må utføres med [lokal utvikling](/nb/altinn-studio/guides/development/local-dev).
**Temaer som dekkes i denne modulen:**
@@ -154,9 +154,9 @@ Denne oppgaven fokuserer på den første siden for datainnsamling og har som må
### Oppgaver
-1. Opprett en [fil for forhåndsutfylling](/nb/altinn-studio/guides/prefill/config).
+1. Opprett en [fil for forhåndsutfylling](/nb/altinn-studio/guides/development/prefill/config).
2. Konfigurer forhåndsutfylling for verdier tilgjengelig i Altinns [forhåndsutfyllingskilder](/nb/altinn-studio/reference/data/prefill) (alle unntatt alder).
-3. Opprett [egendefinert forhåndsutfylling](/nb/altinn-studio/guides/prefill/custom) for alder basert på personnummer (se Kodehjelp og Nyttig dokumentasjon under).
+3. Opprett [egendefinert forhåndsutfylling](/nb/altinn-studio/guides/development/prefill/custom) for alder basert på personnummer (se Kodehjelp og Nyttig dokumentasjon under).
4. Konfigurer innstillinger for felter som ikke skal kunne endres av brukeren.
{{% expandsmall id="kodehjelp" header="Kodehjelp: Beregning av alder fra personnummer" %}}
@@ -243,9 +243,9 @@ private static int CalculateAge(string sosialSecNumber)
*Husk å pushe de lokale endringene dine så de blir tilgjengelige i Altinn Studio.*
### Nyttig dokumentasjon
-- [Forhåndsutfylling fra nasjonale registre og brukerprofil](/nb/altinn-studio/guides/prefill/config)
+- [Forhåndsutfylling fra nasjonale registre og brukerprofil](/nb/altinn-studio/guides/development/prefill/config)
- [Tilgjengelige kilder og verdier for forhåndsutfylling](/nb/altinn-studio/reference/data/prefill)
-- [Egendefinert forhåndsutfylling](/nb/altinn-studio/guides/prefill/custom)
+- [Egendefinert forhåndsutfylling](/nb/altinn-studio/guides/development/prefill/custom)
- [Instance](/nb/api/models/instance/#instance) - Metadata for applikasjonen.
- [Beskrivelse av InstanceOwner-objektet](/nb/api/models/instance/#instanceowner) - Her finner du personnummeret.
Vær oppmerksom på at egenskapene refereres til med store forbokstaver i koden, ikke med små, som i denne oversikten.
diff --git a/content/altinn-studio/getting-started/app-dev-course-old/modul3/_index.en.md b/content/altinn-studio/getting-started/app-dev-course-old/modul3/_index.en.md
index 70b1d7eb705..a6941861a99 100644
--- a/content/altinn-studio/getting-started/app-dev-course-old/modul3/_index.en.md
+++ b/content/altinn-studio/getting-started/app-dev-course-old/modul3/_index.en.md
@@ -83,7 +83,7 @@ for the organization in Altinn Studio.
### Useful documentation
- [Deploy app to test environment](/altinn-studio/reference/testing/deploy/#deploy-av-app-til-testmiljø)
-- [Access control for the organization in Altinn Studio](/altinn-studio/guides/access-management/studio/#access-management-for-the-organization)
+- [Access control for the organization in Altinn Studio](/altinn-studio/guides/administration/access-management/studio/#access-management-for-the-organization)
### Knowledge check
- Is it possible to have two versions of one application in TT02 at the same time?
diff --git a/content/altinn-studio/getting-started/app-dev-course-old/modul3/_index.nb.md b/content/altinn-studio/getting-started/app-dev-course-old/modul3/_index.nb.md
index 0185ef7e947..7f3773c79e5 100644
--- a/content/altinn-studio/getting-started/app-dev-course-old/modul3/_index.nb.md
+++ b/content/altinn-studio/getting-started/app-dev-course-old/modul3/_index.nb.md
@@ -86,7 +86,7 @@ I tillegg må utvikleren som skal gjennomføre publiseringen inneha [rollen Depl
### Nyttig dokumentasjon
- [Publisere app til testmiljø](/nb/altinn-studio/reference/testing/deploy/#deploy-av-app-til-testmiljø)
-- [Tilgangsstyring for organisasjon i Altinn Studio](/nb/altinn-studio/guides/access-management/studio/#tilgangsstyring-for-organisasjonen)
+- [Tilgangsstyring for organisasjon i Altinn Studio](/nb/altinn-studio/guides/administration/access-management/studio/#tilgangsstyring-for-organisasjonen)
### Forståelsessjekk
{{% expandsmall id="m3t1q1" header="Er det mulig å ha to versjoner av en applikasjon i TT02 samtidig?" %}}
diff --git a/content/altinn-studio/getting-started/app-dev-course/_index.en.md b/content/altinn-studio/getting-started/app-dev-course/_index.en.md
index 91b3c312b18..b4d2bb89a9a 100644
--- a/content/altinn-studio/getting-started/app-dev-course/_index.en.md
+++ b/content/altinn-studio/getting-started/app-dev-course/_index.en.md
@@ -42,7 +42,7 @@ The introductory course is divided into 5 modules and covers a fictional case fo
Each module has a description of the task and links to relevant documentation.
You can choose to perform the tasks in [Altinn Studio Designer](../)
-(graphical user interface with drag-and-drop) or in a [local development environment](/altinn-studio/guides/local-dev)
+(graphical user interface with drag-and-drop) or in a [local development environment](/altinn-studio/guides/development/local-dev)
(requires some technical competence).
You can also combine these approaches. All available modules can be completed in Altinn Studio Designer.
diff --git a/content/altinn-studio/getting-started/app-dev-course/_index.nb.md b/content/altinn-studio/getting-started/app-dev-course/_index.nb.md
index 8795d74ca3c..0d6f1993add 100644
--- a/content/altinn-studio/getting-started/app-dev-course/_index.nb.md
+++ b/content/altinn-studio/getting-started/app-dev-course/_index.nb.md
@@ -41,7 +41,7 @@ Introkurset er delt opp i seks moduler og dekker et fiktivt case for Sogndal kom
Hver modul beskriver oppgaven og har lenker til relevant dokumentasjon.
Du kan velge å utføre oppgavene i [Altinn Studio Designer](../)
-(grafisk brukergrensesnitt med dra-og-slipp) eller i et [lokalt utviklingsmiljø](/nb/altinn-studio/guides/local-dev)
+(grafisk brukergrensesnitt med dra-og-slipp) eller i et [lokalt utviklingsmiljø](/nb/altinn-studio/guides/development/local-dev)
(krever noe teknisk kompetanse).
Du kan også kombinere disse fremgangsmåtene. Du kan utføre oppgavene i alle modulene i Altinn Studio Designer.
diff --git a/content/altinn-studio/getting-started/app-dev-course/modul3/_index.en.md b/content/altinn-studio/getting-started/app-dev-course/modul3/_index.en.md
index 7fe9eb032f8..c3f61a48de4 100644
--- a/content/altinn-studio/getting-started/app-dev-course/modul3/_index.en.md
+++ b/content/altinn-studio/getting-started/app-dev-course/modul3/_index.en.md
@@ -44,7 +44,7 @@ Remember to upload changes when working in Designer so they are reflected in the
### Useful documentation
-- [User Guide - Create a Simple Form](/altinn-studio/guides/basic-form)
+- [User Guide - Create a Simple Form](/altinn-studio/guides/development/basic-form)
- [Available Components in Altinn Studio](/altinn-studio/designer/build-app/ui-designer/components/)
- [Guidelines for Using Components](/altinn-studio/guides/design/guidelines/components/)
diff --git a/content/altinn-studio/getting-started/app-dev-course/modul3/_index.nb.md b/content/altinn-studio/getting-started/app-dev-course/modul3/_index.nb.md
index 941ab5ac13b..b0b0741dd12 100644
--- a/content/altinn-studio/getting-started/app-dev-course/modul3/_index.nb.md
+++ b/content/altinn-studio/getting-started/app-dev-course/modul3/_index.nb.md
@@ -46,7 +46,7 @@ Sett opp skjemaet ut fra kravene til kommunen.
## Nyttig dokumentasjon
-- [Brukerveiledning - lag en enkel tjeneste](/nb/altinn-studio/guides/basic-form)
+- [Brukerveiledning - lag en enkel tjeneste](/nb/altinn-studio/guides/development/basic-form)
- [Tilgjengelige komponenter i Altinn Studio](/altinn-studio/designer/build-app/ui-designer/components/)
- [Retningslinjer for bruk av komponenter](/nb/altinn-studio/guides/design/guidelines/components/)
diff --git a/content/altinn-studio/getting-started/app-dev-course/modul5/_index.en.md b/content/altinn-studio/getting-started/app-dev-course/modul5/_index.en.md
index 1d90be3d989..c7fd6f14d0c 100644
--- a/content/altinn-studio/getting-started/app-dev-course/modul5/_index.en.md
+++ b/content/altinn-studio/getting-started/app-dev-course/modul5/_index.en.md
@@ -55,7 +55,7 @@ You will see the version appear under "Previous builds of the application" with
9. You can now test the service in the TT02 test environment. Try filling out the service with some data and submit it to see what happens!
### Useful Documentation
-- [User Guide - Create a Simple Form](/altinn-studio/guides/basic-form)
+- [User Guide - Create a Simple Form](/altinn-studio/guides/development/basic-form)
## Summary
In this module, we built a package of the first version of the service. We then published the package to the test environment and started the service in the test environment to test it.
diff --git a/content/altinn-studio/getting-started/app-dev-course/modul5/_index.nb.md b/content/altinn-studio/getting-started/app-dev-course/modul5/_index.nb.md
index 2a8474f8803..526c8ae3e51 100644
--- a/content/altinn-studio/getting-started/app-dev-course/modul5/_index.nb.md
+++ b/content/altinn-studio/getting-started/app-dev-course/modul5/_index.nb.md
@@ -68,7 +68,7 @@ minutter.
### Nyttig dokumentasjon
-- [Brukerveiledning - lag en enkel tjeneste](/nb/altinn-studio/guides/basic-form)
+- [Brukerveiledning - lag en enkel tjeneste](/nb/altinn-studio/guides/development/basic-form)
## Oppsummering
I denne modulen har vi bygget en pakke av første versjon av tjenesten. Vi har så publisert pakken ut til testmiljø, og startet opp tjensten
diff --git a/content/altinn-studio/getting-started/app-dev-course/modul6/_index.nb.md b/content/altinn-studio/getting-started/app-dev-course/modul6/_index.nb.md
index fc4645d80cb..1596a0c47a8 100644
--- a/content/altinn-studio/getting-started/app-dev-course/modul6/_index.nb.md
+++ b/content/altinn-studio/getting-started/app-dev-course/modul6/_index.nb.md
@@ -164,7 +164,7 @@ Til denne komponenten skal vi også bruke en kodelistefil, men denne gangen skal
Nå skal din app ha fått en nedtrekksliste med alternativene som er spesifisert i kodelisten.
## Nyttig dokumentasjon
-Se [kodelisteguiden](../../../guides/options/) for å se hvordan kodelister settes opp i appkoden.
+Se [kodelisteguiden](../../../guides/development/options/) for å se hvordan kodelister settes opp i appkoden.
## Oppsummering
I denne modulen har du lagt til en gruppe med radioknapper, en gruppe med avkrysningsbokser og en nedtrekksliste. Du har også satt opp svaralternativer manuelt i Studio og ved hjelp av JSON-filer i Gitea.
diff --git a/content/altinn-studio/getting-started/create-user/_index.en.md b/content/altinn-studio/getting-started/create-user/_index.en.md
index 66bbb8eeff0..5128301ef0d 100644
--- a/content/altinn-studio/getting-started/create-user/_index.en.md
+++ b/content/altinn-studio/getting-started/create-user/_index.en.md
@@ -49,7 +49,7 @@ If you're uncertain about the administrator or if your organization is available
you can seek assistance from the Altinn Servicedesk (mailto:tjenesteeier@altinn.no).
_Are you an administrator for your organization and want to add a user to a team? See our guide explaining how this is
-done [here](../../guides/access-management/studio/)._
+done [here](../../guides/administration/access-management/studio/)._
## Create an organization
diff --git a/content/altinn-studio/getting-started/create-user/_index.nb.md b/content/altinn-studio/getting-started/create-user/_index.nb.md
index 790dfcaa044..f194d3a8d97 100644
--- a/content/altinn-studio/getting-started/create-user/_index.nb.md
+++ b/content/altinn-studio/getting-started/create-user/_index.nb.md
@@ -52,7 +52,7 @@ For å bli del av en organisasjon må en administrator for din organisasjon gi d
Hvis du er usikker på hvem som er administrator eller du ikke vet om organisasjonen din er satt opp i Altinn Studio
kan du spørre [Altinn Servicedesk](mailto:tjenesteeier@altinn.no) om hjelp.
-_Er du administrator for din organisasjon og skal legge inn brukere? Se veiledning for hvordan det gjøres [her](../../guides/access-management/studio/)._
+_Er du administrator for din organisasjon og skal legge inn brukere? Se veiledning for hvordan det gjøres [her](../../guides/administration/access-management/studio/)._
## Opprette en organisasjon
diff --git a/content/altinn-studio/guides/administration/_index.en.md b/content/altinn-studio/guides/administration/_index.en.md
new file mode 100644
index 00000000000..52b10242b98
--- /dev/null
+++ b/content/altinn-studio/guides/administration/_index.en.md
@@ -0,0 +1,7 @@
+---
+title: Administration
+description: Guides related to administrating services in Altinn Studio
+weight: 30
+---
+
+{{}}
\ No newline at end of file
diff --git a/content/altinn-studio/guides/administration/_index.nb.md b/content/altinn-studio/guides/administration/_index.nb.md
new file mode 100644
index 00000000000..518037881b5
--- /dev/null
+++ b/content/altinn-studio/guides/administration/_index.nb.md
@@ -0,0 +1,7 @@
+---
+title: Forvaltning
+description: Guider knyttet til forvaltning av tjenester i Altinn Studio
+weight: 30
+---
+
+{{}}
\ No newline at end of file
diff --git a/content/altinn-studio/guides/access-management/_index.en.md b/content/altinn-studio/guides/administration/access-management/_index.en.md
similarity index 81%
rename from content/altinn-studio/guides/access-management/_index.en.md
rename to content/altinn-studio/guides/administration/access-management/_index.en.md
index e9f5abb21a9..e7c9ed3862e 100644
--- a/content/altinn-studio/guides/access-management/_index.en.md
+++ b/content/altinn-studio/guides/administration/access-management/_index.en.md
@@ -4,6 +4,7 @@ description: How to get access to Altinn Studio, app secrets and app logs.
weight: 200
aliases:
- /app/access-management/
+- /altinn-studio/guides/access-management
---
{{}}
\ No newline at end of file
diff --git a/content/altinn-studio/guides/access-management/_index.nb.md b/content/altinn-studio/guides/administration/access-management/_index.nb.md
similarity index 82%
rename from content/altinn-studio/guides/access-management/_index.nb.md
rename to content/altinn-studio/guides/administration/access-management/_index.nb.md
index 4a5a7133990..745e4541684 100644
--- a/content/altinn-studio/guides/access-management/_index.nb.md
+++ b/content/altinn-studio/guides/administration/access-management/_index.nb.md
@@ -4,6 +4,7 @@ description: Hvordan man får tilganger til Altinn Studio, hemmeligheter og appl
weight: 200
aliases:
- /nb/app/access-management/
+- /nb/altinn-studio/guides/access-management
---
{{}}
\ No newline at end of file
diff --git a/content/altinn-studio/guides/access-management/apps/_index.en.md b/content/altinn-studio/guides/administration/access-management/apps/_index.en.md
similarity index 89%
rename from content/altinn-studio/guides/access-management/apps/_index.en.md
rename to content/altinn-studio/guides/administration/access-management/apps/_index.en.md
index 4aed6d5fc87..193e174f7e3 100644
--- a/content/altinn-studio/guides/access-management/apps/_index.en.md
+++ b/content/altinn-studio/guides/administration/access-management/apps/_index.en.md
@@ -5,7 +5,7 @@ description: How to request access to app logs and secrets.
toc: true
weight: 200
aliases:
-- /altinn-studio/guides/access-management/apps/
+- /altinn-studio/guides/administration/access-management/apps/
---
The following roles can be requested assigned to a user by the service owner:
@@ -15,7 +15,7 @@ The following roles can be requested assigned to a user by the service owner:
- Prod Developer
- Prod Operations
-[See an overview of the different roles here](../../../reference/access-management/apps/).
+[See an overview of the different roles here](../../../../reference/access-management/apps/).
To be assigned a role you must first have a registered user belonging to the same service owner as the application whose runtime environment you wish to access.
Requests are submitted using our [self-service portal](https://www.altinndigital.no/oversikt).
diff --git a/content/altinn-studio/guides/access-management/apps/_index.nb.md b/content/altinn-studio/guides/administration/access-management/apps/_index.nb.md
similarity index 89%
rename from content/altinn-studio/guides/access-management/apps/_index.nb.md
rename to content/altinn-studio/guides/administration/access-management/apps/_index.nb.md
index ce9ff29a4ad..b84ce818e9e 100644
--- a/content/altinn-studio/guides/access-management/apps/_index.nb.md
+++ b/content/altinn-studio/guides/administration/access-management/apps/_index.nb.md
@@ -5,7 +5,7 @@ description: Hvordan bestille tilganger til app logger og hemmeligheter.
toc: true
weight: 200
aliases:
-- /nb/altinn-studio/guides/access-management/apps/
+- /nb/altinn-studio/guides/administration/access-management/apps/
---
Tjenesteeiere kan bestille følgende tilganger for sine ressurser i miljøene TT02 og produksjon:
@@ -15,7 +15,7 @@ Tjenesteeiere kan bestille følgende tilganger for sine ressurser i miljøene TT
- Prod Developer
- Prod Operations
-[Se oversikt over roller/tilgangerher](../../../reference/access-management/apps/).
+[Se oversikt over roller/tilgangerher](../../../../reference/access-management/apps/).
For å få tilgang til disse rollene må autoriserte bestillere hos Tjenesteeier, bestille dette på vår [Selvbetjeningsportal](https://www.altinndigital.no/oversikt).
Portalen beskriver også hvordan man oppretter en ny bruker hvis man ikke har dette fra før av.
diff --git a/content/altinn-studio/guides/access-management/studio/_index.en.md b/content/altinn-studio/guides/administration/access-management/studio/_index.en.md
similarity index 95%
rename from content/altinn-studio/guides/access-management/studio/_index.en.md
rename to content/altinn-studio/guides/administration/access-management/studio/_index.en.md
index 8121ad96357..4e5e16c6a2b 100644
--- a/content/altinn-studio/guides/access-management/studio/_index.en.md
+++ b/content/altinn-studio/guides/administration/access-management/studio/_index.en.md
@@ -5,7 +5,7 @@ description: How to configure access for teams in Altinn Studio.
toc: true
weight: 200
aliases:
-- /altinn-studio/guides/access-management/studio/
+- /altinn-studio/guides/administration/access-management/studio/
---
## Access Management for the Organization
@@ -18,7 +18,7 @@ Four standard teams have been defined that set guidelines for what a user is all
Altinn Studio. If necessary, as an owner, you can add/remove users in teams, create new teams, and change configurations
of existing teams.
-[See an overview of the standard teams and the access they grant here](../../../reference/access-management/studio/).
+[See an overview of the standard teams and the access they grant here](../../../../reference/access-management/studio/).
### How to add a user to a team
The following steps can be done by a user that is an _owner_ for the organization.
diff --git a/content/altinn-studio/guides/access-management/studio/_index.nb.md b/content/altinn-studio/guides/administration/access-management/studio/_index.nb.md
similarity index 95%
rename from content/altinn-studio/guides/access-management/studio/_index.nb.md
rename to content/altinn-studio/guides/administration/access-management/studio/_index.nb.md
index 9ac3969c173..01615998ca9 100644
--- a/content/altinn-studio/guides/access-management/studio/_index.nb.md
+++ b/content/altinn-studio/guides/administration/access-management/studio/_index.nb.md
@@ -5,7 +5,7 @@ description: Hvordan konfigurere tilganger for team i Altinn Studio.
toc: true
weight: 200
aliases:
-- /nb/altinn-studio/guides/access-management/studio/
+- /nb/altinn-studio/guides/administration/access-management/studio/
---
## Tilgangsstyring for organisasjonen
@@ -18,7 +18,7 @@ Det er definert fire standard team som legger føringer for hva en bruker har ti
organisasjon i Altinn Studio. Ved behov kan man som eier kan man legge til/fjerne brukere i team, opprette nye team og
endre konfigurasjon på eksisterende team.
-[Se oversikt over standard team og tilgangene de gir her](../../../reference/access-management/studio/).
+[Se oversikt over standard team og tilgangene de gir her](../../../../reference/access-management/studio/).
### Hvordan legge til bruker i et team
Stegene under må gjøres av en bruker som er lagt inn som _eier_ av organisasjonen.
diff --git a/content/altinn-studio/guides/access-management/studio/access-management-repository.png b/content/altinn-studio/guides/administration/access-management/studio/access-management-repository.png
similarity index 100%
rename from content/altinn-studio/guides/access-management/studio/access-management-repository.png
rename to content/altinn-studio/guides/administration/access-management/studio/access-management-repository.png
diff --git a/content/altinn-studio/guides/access-management/studio/access-management-team.png b/content/altinn-studio/guides/administration/access-management/studio/access-management-team.png
similarity index 100%
rename from content/altinn-studio/guides/access-management/studio/access-management-team.png
rename to content/altinn-studio/guides/administration/access-management/studio/access-management-team.png
diff --git a/content/altinn-studio/reference/maintainance/_index.en.md b/content/altinn-studio/guides/administration/maintainance/_index.en.md
similarity index 93%
rename from content/altinn-studio/reference/maintainance/_index.en.md
rename to content/altinn-studio/guides/administration/maintainance/_index.en.md
index dcb2b60d42b..516865016a7 100644
--- a/content/altinn-studio/reference/maintainance/_index.en.md
+++ b/content/altinn-studio/guides/administration/maintainance/_index.en.md
@@ -3,6 +3,8 @@ title: Maintenance of app in production
linktitle: Maintenance
description: Applications in production require regular maintenance and updates.
weight: 120
+aliases:
+- /altinn-studio/reference/maintainance
---
When the application is put into production, there will be a need to maintain the application.
diff --git a/content/app/maintainance/_index.nb.md b/content/altinn-studio/guides/administration/maintainance/_index.nb.md
similarity index 92%
rename from content/app/maintainance/_index.nb.md
rename to content/altinn-studio/guides/administration/maintainance/_index.nb.md
index d728b7700ba..15c7263cd46 100644
--- a/content/app/maintainance/_index.nb.md
+++ b/content/altinn-studio/guides/administration/maintainance/_index.nb.md
@@ -3,6 +3,8 @@ title: Vedlikehold av app i produksjon
linktitle: Vedlikehold
description: Applikasjoner i produksjon krever jevnlig vedlikehold og oppdateringer.
weight: 120
+aliases:
+- /nb/altinn-studio/reference/maintainance
---
Når applikasjonen er satt i produksjon, vil det oppstå behov for å vedlikeholde applikasjonen.
diff --git a/content/altinn-studio/reference/maintainance/dependencies/_index.en.md b/content/altinn-studio/guides/administration/maintainance/dependencies/_index.en.md
similarity index 100%
rename from content/altinn-studio/reference/maintainance/dependencies/_index.en.md
rename to content/altinn-studio/guides/administration/maintainance/dependencies/_index.en.md
diff --git a/content/altinn-studio/reference/maintainance/dependencies/_index.nb.md b/content/altinn-studio/guides/administration/maintainance/dependencies/_index.nb.md
similarity index 100%
rename from content/altinn-studio/reference/maintainance/dependencies/_index.nb.md
rename to content/altinn-studio/guides/administration/maintainance/dependencies/_index.nb.md
diff --git a/content/altinn-studio/guides/monitor-and-instrument/_index.en.md b/content/altinn-studio/guides/administration/monitor-and-instrument/_index.en.md
similarity index 97%
rename from content/altinn-studio/guides/monitor-and-instrument/_index.en.md
rename to content/altinn-studio/guides/administration/monitor-and-instrument/_index.en.md
index 4d5dc2699ff..692c506ff4b 100644
--- a/content/altinn-studio/guides/monitor-and-instrument/_index.en.md
+++ b/content/altinn-studio/guides/administration/monitor-and-instrument/_index.en.md
@@ -4,6 +4,8 @@ linktitle: Monitor and instrument
description: Get started with Altinn monitoring tools and instrumentation
toc: true
weight: 990
+aliases:
+- /altinn-studio/guides/monitor-and-instrument
---
{{% notice info %}}
@@ -106,7 +108,7 @@ Here is a brief overview of visualising the telemetry instrumented above.
### Running locally
-When running locally using [localtest](/altinn-studio/guides/local-dev/), a monitoring stack consisting of Grafana and OpenTelemetry Collector
+When running locally using [localtest](/altinn-studio/guides/development/local-dev/), a monitoring stack consisting of Grafana and OpenTelemetry Collector
can be provisioned along side localtest and Platform APIs. [See the localtest README for more info](https://github.com/Altinn/app-localtest/blob/main/README.md).
Localtest monitoring setup currently contains a Grafana instance with ASP.NET Core dashboards and a preview Altinn app dashboard.
diff --git a/content/altinn-studio/guides/monitor-and-instrument/_index.nb.md b/content/altinn-studio/guides/administration/monitor-and-instrument/_index.nb.md
similarity index 99%
rename from content/altinn-studio/guides/monitor-and-instrument/_index.nb.md
rename to content/altinn-studio/guides/administration/monitor-and-instrument/_index.nb.md
index a796c02ce36..c7ab6f710a3 100644
--- a/content/altinn-studio/guides/monitor-and-instrument/_index.nb.md
+++ b/content/altinn-studio/guides/administration/monitor-and-instrument/_index.nb.md
@@ -4,6 +4,8 @@ linktitle: Monitorer og instumenter
description: Kom i gang med verktøyene for instrumentering og monitorering i Altinn
toc: true
weight: 990
+aliases:
+- /nb/altinn-studio/guides/monitor-and-instrument
---
{{% notice info %}}
diff --git a/content/altinn-studio/guides/monitor-and-instrument/grafana-quickstart-logs.png b/content/altinn-studio/guides/administration/monitor-and-instrument/grafana-quickstart-logs.png
similarity index 100%
rename from content/altinn-studio/guides/monitor-and-instrument/grafana-quickstart-logs.png
rename to content/altinn-studio/guides/administration/monitor-and-instrument/grafana-quickstart-logs.png
diff --git a/content/altinn-studio/guides/monitor-and-instrument/grafana-quickstart-metric.png b/content/altinn-studio/guides/administration/monitor-and-instrument/grafana-quickstart-metric.png
similarity index 100%
rename from content/altinn-studio/guides/monitor-and-instrument/grafana-quickstart-metric.png
rename to content/altinn-studio/guides/administration/monitor-and-instrument/grafana-quickstart-metric.png
diff --git a/content/altinn-studio/guides/monitor-and-instrument/grafana-quickstart-trace.png b/content/altinn-studio/guides/administration/monitor-and-instrument/grafana-quickstart-trace.png
similarity index 100%
rename from content/altinn-studio/guides/monitor-and-instrument/grafana-quickstart-trace.png
rename to content/altinn-studio/guides/administration/monitor-and-instrument/grafana-quickstart-trace.png
diff --git a/content/altinn-studio/guides/altinn-2/_index.en.md b/content/altinn-studio/guides/altinn-2/_index.en.md
new file mode 100644
index 00000000000..610a6bacb08
--- /dev/null
+++ b/content/altinn-studio/guides/altinn-2/_index.en.md
@@ -0,0 +1,7 @@
+---
+title: Altinn 2
+description: Guides related to the migration from Altinn 2 to Altinn Studio
+weight: 999
+---
+
+{{}}
\ No newline at end of file
diff --git a/content/altinn-studio/guides/altinn-2/_index.nb.md b/content/altinn-studio/guides/altinn-2/_index.nb.md
new file mode 100644
index 00000000000..61a7e279eef
--- /dev/null
+++ b/content/altinn-studio/guides/altinn-2/_index.nb.md
@@ -0,0 +1,7 @@
+---
+title: Altinn 2
+description: Guider knyttet til overgangen fra Altinn 2 til Altinn Studio
+weight: 999
+---
+
+{{}}
\ No newline at end of file
diff --git a/content/altinn-studio/guides/altinn-2-datamodel/_index.en.md b/content/altinn-studio/guides/altinn-2/altinn-2-datamodel/_index.en.md
similarity index 99%
rename from content/altinn-studio/guides/altinn-2-datamodel/_index.en.md
rename to content/altinn-studio/guides/altinn-2/altinn-2-datamodel/_index.en.md
index a2c1c312591..af0647cb06e 100644
--- a/content/altinn-studio/guides/altinn-2-datamodel/_index.en.md
+++ b/content/altinn-studio/guides/altinn-2/altinn-2-datamodel/_index.en.md
@@ -7,6 +7,7 @@ tags: [translate-to-english]
toc: true
aliases:
- /altinn-studio/reference/data/data-model/altinn-2/
+- /altinn-studio/guides/altinn-2-datamodel/
---
## Endre eksisterende datamodell
diff --git a/content/altinn-studio/guides/altinn-2-datamodel/_index.nb.md b/content/altinn-studio/guides/altinn-2/altinn-2-datamodel/_index.nb.md
similarity index 99%
rename from content/altinn-studio/guides/altinn-2-datamodel/_index.nb.md
rename to content/altinn-studio/guides/altinn-2/altinn-2-datamodel/_index.nb.md
index f28ab37d0b6..3528acf0076 100644
--- a/content/altinn-studio/guides/altinn-2-datamodel/_index.nb.md
+++ b/content/altinn-studio/guides/altinn-2/altinn-2-datamodel/_index.nb.md
@@ -6,6 +6,7 @@ weight: 100
toc: true
aliases:
- /nb/altinn-studio/reference/data/data-model/altinn-2/
+- /nb/altinn-studio/guides/altinn-2-datamodel/
---
## Endre eksisterende datamodell
diff --git a/content/altinn-studio/guides/altinn-2-datamodel/dataformat-id-version-example.png b/content/altinn-studio/guides/altinn-2/altinn-2-datamodel/dataformat-id-version-example.png
similarity index 100%
rename from content/altinn-studio/guides/altinn-2-datamodel/dataformat-id-version-example.png
rename to content/altinn-studio/guides/altinn-2/altinn-2-datamodel/dataformat-id-version-example.png
diff --git a/content/altinn-studio/guides/migrate-services/_index.en.md b/content/altinn-studio/guides/altinn-2/migrate-services/_index.en.md
similarity index 97%
rename from content/altinn-studio/guides/migrate-services/_index.en.md
rename to content/altinn-studio/guides/altinn-2/migrate-services/_index.en.md
index 06629af1472..7f5c8336bf9 100644
--- a/content/altinn-studio/guides/migrate-services/_index.en.md
+++ b/content/altinn-studio/guides/altinn-2/migrate-services/_index.en.md
@@ -5,6 +5,7 @@ toc: true
weight: 170
aliases:
- /app/migrate-services/
+- /altinn-studio/guides/migrate-services/
tags: [translate-to-english]
---
diff --git a/content/altinn-studio/guides/migrate-services/_index.nb.md b/content/altinn-studio/guides/altinn-2/migrate-services/_index.nb.md
similarity index 96%
rename from content/altinn-studio/guides/migrate-services/_index.nb.md
rename to content/altinn-studio/guides/altinn-2/migrate-services/_index.nb.md
index 9fd355d8d5a..67e7b737543 100644
--- a/content/altinn-studio/guides/migrate-services/_index.nb.md
+++ b/content/altinn-studio/guides/altinn-2/migrate-services/_index.nb.md
@@ -5,6 +5,7 @@ toc: true
weight: 170
aliases:
- /nb/app/migrate-services/
+- /nb/altinn-studio/guides/migrate-services/
---
## Migrere en eksisterende tjeneste til Altinn 3
diff --git a/content/altinn-studio/guides/seres-migration/_index.en.md b/content/altinn-studio/guides/altinn-2/seres-migration/_index.en.md
similarity index 99%
rename from content/altinn-studio/guides/seres-migration/_index.en.md
rename to content/altinn-studio/guides/altinn-2/seres-migration/_index.en.md
index 785df10d231..4fe5cacaee6 100644
--- a/content/altinn-studio/guides/seres-migration/_index.en.md
+++ b/content/altinn-studio/guides/altinn-2/seres-migration/_index.en.md
@@ -5,6 +5,7 @@ description: Hva må gjøres når Seres erstattes?
weight: 100
aliases:
- /altinn-studio/reference/data/data-model/seres-migration/
+- /altinn-studio/guides/seres-migration
---
{{% notice info %}}
diff --git a/content/altinn-studio/guides/seres-migration/_index.nb.md b/content/altinn-studio/guides/altinn-2/seres-migration/_index.nb.md
similarity index 99%
rename from content/altinn-studio/guides/seres-migration/_index.nb.md
rename to content/altinn-studio/guides/altinn-2/seres-migration/_index.nb.md
index 74a656b199b..7c7c72c9a71 100644
--- a/content/altinn-studio/guides/seres-migration/_index.nb.md
+++ b/content/altinn-studio/guides/altinn-2/seres-migration/_index.nb.md
@@ -5,6 +5,7 @@ description: Hva må gjøres når Seres erstattes?
weight: 100
aliases:
- /nb/altinn-studio/reference/data/data-model/seres-migration/
+- /nb/altinn-studio/guides/seres-migration
---
{{% notice info %}}
diff --git a/content/altinn-studio/guides/seres-migration/datamodels-dashboard.png b/content/altinn-studio/guides/altinn-2/seres-migration/datamodels-dashboard.png
similarity index 100%
rename from content/altinn-studio/guides/seres-migration/datamodels-dashboard.png
rename to content/altinn-studio/guides/altinn-2/seres-migration/datamodels-dashboard.png
diff --git a/content/altinn-studio/guides/seres-migration/datamodels-folder-structure.png b/content/altinn-studio/guides/altinn-2/seres-migration/datamodels-folder-structure.png
similarity index 100%
rename from content/altinn-studio/guides/seres-migration/datamodels-folder-structure.png
rename to content/altinn-studio/guides/altinn-2/seres-migration/datamodels-folder-structure.png
diff --git a/content/altinn-studio/guides/seres-migration/datamodels-readme.png b/content/altinn-studio/guides/altinn-2/seres-migration/datamodels-readme.png
similarity index 100%
rename from content/altinn-studio/guides/seres-migration/datamodels-readme.png
rename to content/altinn-studio/guides/altinn-2/seres-migration/datamodels-readme.png
diff --git a/content/altinn-studio/guides/seres-migration/find-datamodels-repo.png b/content/altinn-studio/guides/altinn-2/seres-migration/find-datamodels-repo.png
similarity index 100%
rename from content/altinn-studio/guides/seres-migration/find-datamodels-repo.png
rename to content/altinn-studio/guides/altinn-2/seres-migration/find-datamodels-repo.png
diff --git a/content/altinn-studio/guides/contributing/_index.en.md b/content/altinn-studio/guides/contributing/_index.en.md
index 77fab9b9a00..198adf5994b 100644
--- a/content/altinn-studio/guides/contributing/_index.en.md
+++ b/content/altinn-studio/guides/contributing/_index.en.md
@@ -1,5 +1,5 @@
---
-title: Contributing to Altinn Studio
+title: Contributing
description: Contribute to the development of Altinn Studio
weight: 1000
---
diff --git a/content/altinn-studio/guides/contributing/_index.nb.md b/content/altinn-studio/guides/contributing/_index.nb.md
index e943b8a0548..bdfbb155637 100644
--- a/content/altinn-studio/guides/contributing/_index.nb.md
+++ b/content/altinn-studio/guides/contributing/_index.nb.md
@@ -1,5 +1,5 @@
---
-title: Bidra inn i Altinn Studio
+title: Bidra
description: Bidra i utviklingen av Altinn Studio
weight: 1000
---
diff --git a/content/altinn-studio/guides/design/_index.en.md b/content/altinn-studio/guides/design/_index.en.md
index 7254aed8538..f8978cde147 100644
--- a/content/altinn-studio/guides/design/_index.en.md
+++ b/content/altinn-studio/guides/design/_index.en.md
@@ -2,7 +2,7 @@
title: Design and planning
linktitle: Design
description: To make the service as good as possible for the users, it is important to start by focusing on the users and understand their needs. Before you start developing, we recommend that you create a prototype and perform a user test.
-weight: 20
+weight: 10
aliases:
- /design/
- /design/designsystem/
diff --git a/content/altinn-studio/guides/design/_index.nb.md b/content/altinn-studio/guides/design/_index.nb.md
index ccddacf1a19..f44db5b465d 100644
--- a/content/altinn-studio/guides/design/_index.nb.md
+++ b/content/altinn-studio/guides/design/_index.nb.md
@@ -2,7 +2,7 @@
title: Design og planlegging
linktitle: Design
description: For at tjenesten din skal bli best mulig for de som skal bruke den, er det viktig å starte med å fokusere på brukerne og forstå deres brukerbehov i møte med tjenesten din.
-weight: 20
+weight: 10
aliases:
- /design/
- /design/designsystem/
diff --git a/content/altinn-studio/guides/development/_index.en.md b/content/altinn-studio/guides/development/_index.en.md
new file mode 100644
index 00000000000..d440990697e
--- /dev/null
+++ b/content/altinn-studio/guides/development/_index.en.md
@@ -0,0 +1,7 @@
+---
+title: Development
+description: Guides related to developing services in Altinn Studio
+weight: 20
+---
+
+{{}}
\ No newline at end of file
diff --git a/content/altinn-studio/guides/development/_index.nb.md b/content/altinn-studio/guides/development/_index.nb.md
new file mode 100644
index 00000000000..c31c72bdde9
--- /dev/null
+++ b/content/altinn-studio/guides/development/_index.nb.md
@@ -0,0 +1,7 @@
+---
+title: Utvikling
+description: Guider knyttet til det å utvikle en tjeneste på Altinn Studio
+weight: 20
+---
+
+{{}}
\ No newline at end of file
diff --git a/content/altinn-studio/guides/basic-form/_index.en.md b/content/altinn-studio/guides/development/basic-form/_index.en.md
similarity index 99%
rename from content/altinn-studio/guides/basic-form/_index.en.md
rename to content/altinn-studio/guides/development/basic-form/_index.en.md
index 7222050bc26..6da074cea5c 100644
--- a/content/altinn-studio/guides/basic-form/_index.en.md
+++ b/content/altinn-studio/guides/development/basic-form/_index.en.md
@@ -2,6 +2,8 @@
title: Simple Form
description: User guide for creating a simple form in Altinn Studio
weight: 10
+aliases:
+- /altinn-studio/guides/basic-form/
---
The points below cover a minimum of what is required to create and publish a form on Altinn Studio.
diff --git a/content/altinn-studio/guides/basic-form/_index.nb.md b/content/altinn-studio/guides/development/basic-form/_index.nb.md
similarity index 99%
rename from content/altinn-studio/guides/basic-form/_index.nb.md
rename to content/altinn-studio/guides/development/basic-form/_index.nb.md
index 45b127e746d..9566e24f40f 100644
--- a/content/altinn-studio/guides/basic-form/_index.nb.md
+++ b/content/altinn-studio/guides/development/basic-form/_index.nb.md
@@ -2,6 +2,8 @@
title: Lag et enkelt skjema
description: Guide for å lage et enkelt skjema i Altinn Studio
weight: 10
+aliases:
+- /nb/altinn-studio/guides/basic-form/
---
Punktene under dekker et minimum av hva som må til for å lage og publisere et skjema på Altinn Studio.
diff --git a/content/altinn-studio/guides/basic-form/build-version.mp4 b/content/altinn-studio/guides/development/basic-form/build-version.mp4
similarity index 100%
rename from content/altinn-studio/guides/basic-form/build-version.mp4
rename to content/altinn-studio/guides/development/basic-form/build-version.mp4
diff --git a/content/altinn-studio/guides/basic-form/create-form.mp4 b/content/altinn-studio/guides/development/basic-form/create-form.mp4
similarity index 100%
rename from content/altinn-studio/guides/basic-form/create-form.mp4
rename to content/altinn-studio/guides/development/basic-form/create-form.mp4
diff --git a/content/altinn-studio/guides/basic-form/policy-rules.mp4 b/content/altinn-studio/guides/development/basic-form/policy-rules.mp4
similarity index 100%
rename from content/altinn-studio/guides/basic-form/policy-rules.mp4
rename to content/altinn-studio/guides/development/basic-form/policy-rules.mp4
diff --git a/content/altinn-studio/guides/basic-form/publish-version.mp4 b/content/altinn-studio/guides/development/basic-form/publish-version.mp4
similarity index 100%
rename from content/altinn-studio/guides/basic-form/publish-version.mp4
rename to content/altinn-studio/guides/development/basic-form/publish-version.mp4
diff --git a/content/altinn-studio/guides/basic-form/reset-local-changes.mp4 b/content/altinn-studio/guides/development/basic-form/reset-local-changes.mp4
similarity index 100%
rename from content/altinn-studio/guides/basic-form/reset-local-changes.mp4
rename to content/altinn-studio/guides/development/basic-form/reset-local-changes.mp4
diff --git a/content/altinn-studio/guides/basic-form/save-changes.mp4 b/content/altinn-studio/guides/development/basic-form/save-changes.mp4
similarity index 100%
rename from content/altinn-studio/guides/basic-form/save-changes.mp4
rename to content/altinn-studio/guides/development/basic-form/save-changes.mp4
diff --git a/content/altinn-studio/guides/copy-app/_index.en.md b/content/altinn-studio/guides/development/copy-app/_index.en.md
similarity index 98%
rename from content/altinn-studio/guides/copy-app/_index.en.md
rename to content/altinn-studio/guides/development/copy-app/_index.en.md
index e46681b2fe7..c8d7f403ca3 100644
--- a/content/altinn-studio/guides/copy-app/_index.en.md
+++ b/content/altinn-studio/guides/development/copy-app/_index.en.md
@@ -5,6 +5,7 @@ description: How to make a copy of an application in Altinn Studio
weight: 150
aliases:
- /app/copy-app/
+- /altinn-studio/guides/copy-app/
---
diff --git a/content/altinn-studio/guides/copy-app/_index.nb.md b/content/altinn-studio/guides/development/copy-app/_index.nb.md
similarity index 98%
rename from content/altinn-studio/guides/copy-app/_index.nb.md
rename to content/altinn-studio/guides/development/copy-app/_index.nb.md
index fea64ed589a..c00f1101400 100644
--- a/content/altinn-studio/guides/copy-app/_index.nb.md
+++ b/content/altinn-studio/guides/development/copy-app/_index.nb.md
@@ -5,6 +5,7 @@ description: Slik oppretter man en kopi av applikasjon i Altinn Studio.
weight: 150
aliases:
- /nb/app/copy-app/
+- /nb/altinn-studio/guides/copy-app/
---
I Altinn Studio har man mulighet til å lage en kopi av en eksisterende applikasjon innad i en organisasjon. Dette gjøres fra dashboardet.
diff --git a/content/altinn-studio/guides/copy-app/copy-app.png b/content/altinn-studio/guides/development/copy-app/copy-app.png
similarity index 100%
rename from content/altinn-studio/guides/copy-app/copy-app.png
rename to content/altinn-studio/guides/development/copy-app/copy-app.png
diff --git a/content/altinn-studio/guides/copy-app/open-repository-old.png b/content/altinn-studio/guides/development/copy-app/open-repository-old.png
similarity index 100%
rename from content/altinn-studio/guides/copy-app/open-repository-old.png
rename to content/altinn-studio/guides/development/copy-app/open-repository-old.png
diff --git a/content/altinn-studio/guides/copy-app/open-repository.png b/content/altinn-studio/guides/development/copy-app/open-repository.png
similarity index 100%
rename from content/altinn-studio/guides/copy-app/open-repository.png
rename to content/altinn-studio/guides/development/copy-app/open-repository.png
diff --git a/content/altinn-studio/guides/copy-app/overview.png b/content/altinn-studio/guides/development/copy-app/overview.png
similarity index 100%
rename from content/altinn-studio/guides/copy-app/overview.png
rename to content/altinn-studio/guides/development/copy-app/overview.png
diff --git a/content/altinn-studio/guides/copy-app/pull-request-summary.png b/content/altinn-studio/guides/development/copy-app/pull-request-summary.png
similarity index 100%
rename from content/altinn-studio/guides/copy-app/pull-request-summary.png
rename to content/altinn-studio/guides/development/copy-app/pull-request-summary.png
diff --git a/content/altinn-studio/guides/copy-app/pull.png b/content/altinn-studio/guides/development/copy-app/pull.png
similarity index 100%
rename from content/altinn-studio/guides/copy-app/pull.png
rename to content/altinn-studio/guides/development/copy-app/pull.png
diff --git a/content/altinn-studio/guides/dynamics/_index.en.md b/content/altinn-studio/guides/development/dynamics/_index.en.md
similarity index 80%
rename from content/altinn-studio/guides/dynamics/_index.en.md
rename to content/altinn-studio/guides/development/dynamics/_index.en.md
index 5453fc18cf5..009a2612571 100644
--- a/content/altinn-studio/guides/dynamics/_index.en.md
+++ b/content/altinn-studio/guides/development/dynamics/_index.en.md
@@ -2,6 +2,8 @@
title: Dynamikk
description: Brukerveiledning for å sette opp dynamikk i skjema i Altinn Studio
weight: 20
+aliases:
+- /altinn-studio/guides/dynamics/
---
{{% notice warning %}}
diff --git a/content/altinn-studio/guides/dynamics/_index.nb.md b/content/altinn-studio/guides/development/dynamics/_index.nb.md
similarity index 99%
rename from content/altinn-studio/guides/dynamics/_index.nb.md
rename to content/altinn-studio/guides/development/dynamics/_index.nb.md
index 453015a1506..fc94b62f6c1 100644
--- a/content/altinn-studio/guides/dynamics/_index.nb.md
+++ b/content/altinn-studio/guides/development/dynamics/_index.nb.md
@@ -2,6 +2,8 @@
title: Dynamikk
description: Brukerveiledning for å sette opp dynamikk i skjema i Altinn Studio
weight: 20
+aliases:
+- /nb/altinn-studio/guides/dynamics/
---
Denne dokumentasjonen vil beskrive hvordan du kan sette opp dynamikk i skjema ved å sette opp uttrykk med
diff --git a/content/altinn-studio/guides/dynamics/add-second-sub-expression.png b/content/altinn-studio/guides/development/dynamics/add-second-sub-expression.png
similarity index 100%
rename from content/altinn-studio/guides/dynamics/add-second-sub-expression.png
rename to content/altinn-studio/guides/development/dynamics/add-second-sub-expression.png
diff --git a/content/altinn-studio/guides/dynamics/add-sub-expression.png b/content/altinn-studio/guides/development/dynamics/add-sub-expression.png
similarity index 100%
rename from content/altinn-studio/guides/dynamics/add-sub-expression.png
rename to content/altinn-studio/guides/development/dynamics/add-sub-expression.png
diff --git a/content/altinn-studio/guides/dynamics/create-rule.png b/content/altinn-studio/guides/development/dynamics/create-rule.png
similarity index 100%
rename from content/altinn-studio/guides/dynamics/create-rule.png
rename to content/altinn-studio/guides/development/dynamics/create-rule.png
diff --git a/content/altinn-studio/guides/dynamics/edit-sub-expression.png b/content/altinn-studio/guides/development/dynamics/edit-sub-expression.png
similarity index 100%
rename from content/altinn-studio/guides/dynamics/edit-sub-expression.png
rename to content/altinn-studio/guides/development/dynamics/edit-sub-expression.png
diff --git a/content/altinn-studio/guides/dynamics/example-form.png b/content/altinn-studio/guides/development/dynamics/example-form.png
similarity index 100%
rename from content/altinn-studio/guides/dynamics/example-form.png
rename to content/altinn-studio/guides/development/dynamics/example-form.png
diff --git a/content/altinn-studio/guides/dynamics/first-operand.png b/content/altinn-studio/guides/development/dynamics/first-operand.png
similarity index 100%
rename from content/altinn-studio/guides/dynamics/first-operand.png
rename to content/altinn-studio/guides/development/dynamics/first-operand.png
diff --git a/content/altinn-studio/guides/dynamics/operator.png b/content/altinn-studio/guides/development/dynamics/operator.png
similarity index 100%
rename from content/altinn-studio/guides/dynamics/operator.png
rename to content/altinn-studio/guides/development/dynamics/operator.png
diff --git a/content/altinn-studio/guides/dynamics/save-first-sub-expression.png b/content/altinn-studio/guides/development/dynamics/save-first-sub-expression.png
similarity index 100%
rename from content/altinn-studio/guides/dynamics/save-first-sub-expression.png
rename to content/altinn-studio/guides/development/dynamics/save-first-sub-expression.png
diff --git a/content/altinn-studio/guides/dynamics/second-operand.png b/content/altinn-studio/guides/development/dynamics/second-operand.png
similarity index 100%
rename from content/altinn-studio/guides/dynamics/second-operand.png
rename to content/altinn-studio/guides/development/dynamics/second-operand.png
diff --git a/content/altinn-studio/guides/dynamics/second-sub-expression.png b/content/altinn-studio/guides/development/dynamics/second-sub-expression.png
similarity index 100%
rename from content/altinn-studio/guides/dynamics/second-sub-expression.png
rename to content/altinn-studio/guides/development/dynamics/second-sub-expression.png
diff --git a/content/altinn-studio/guides/dynamics/starting-point.png b/content/altinn-studio/guides/development/dynamics/starting-point.png
similarity index 100%
rename from content/altinn-studio/guides/dynamics/starting-point.png
rename to content/altinn-studio/guides/development/dynamics/starting-point.png
diff --git a/content/altinn-studio/guides/local-dev/_index.en.md b/content/altinn-studio/guides/development/local-dev/_index.en.md
similarity index 99%
rename from content/altinn-studio/guides/local-dev/_index.en.md
rename to content/altinn-studio/guides/development/local-dev/_index.en.md
index 19190dcb73a..56a5db3aaf1 100644
--- a/content/altinn-studio/guides/local-dev/_index.en.md
+++ b/content/altinn-studio/guides/development/local-dev/_index.en.md
@@ -4,6 +4,8 @@ linktitle: Local Development
description: Getting started with local development
toc: true
weight: 900
+aliases:
+- /altinn-studio/guides/local-dev/
---
During application development, you will need to work both in Altinn Studio and in a local development environment.
diff --git a/content/altinn-studio/guides/local-dev/_index.nb.md b/content/altinn-studio/guides/development/local-dev/_index.nb.md
similarity index 99%
rename from content/altinn-studio/guides/local-dev/_index.nb.md
rename to content/altinn-studio/guides/development/local-dev/_index.nb.md
index 7fa17faf4f9..24a0a20e861 100644
--- a/content/altinn-studio/guides/local-dev/_index.nb.md
+++ b/content/altinn-studio/guides/development/local-dev/_index.nb.md
@@ -4,6 +4,8 @@ linktitle: Lokal utvikling
description: Hvordan komme i gang med lokal utvikling
toc: true
weight: 999
+aliases:
+- /nb/altinn-studio/guides/local-dev/
---
Under utvikling av en applikasjon vil man måtte jobbe både i Altinn Studio og
diff --git a/content/altinn-studio/guides/local-dev/changes-validated.png b/content/altinn-studio/guides/development/local-dev/changes-validated.png
similarity index 100%
rename from content/altinn-studio/guides/local-dev/changes-validated.png
rename to content/altinn-studio/guides/development/local-dev/changes-validated.png
diff --git a/content/altinn-studio/guides/local-dev/commit-message.png b/content/altinn-studio/guides/development/local-dev/commit-message.png
similarity index 100%
rename from content/altinn-studio/guides/local-dev/commit-message.png
rename to content/altinn-studio/guides/development/local-dev/commit-message.png
diff --git a/content/altinn-studio/guides/local-dev/copy-repo-link.png b/content/altinn-studio/guides/development/local-dev/copy-repo-link.png
similarity index 100%
rename from content/altinn-studio/guides/local-dev/copy-repo-link.png
rename to content/altinn-studio/guides/development/local-dev/copy-repo-link.png
diff --git a/content/altinn-studio/guides/local-dev/find-app-in-dashboard.png b/content/altinn-studio/guides/development/local-dev/find-app-in-dashboard.png
similarity index 100%
rename from content/altinn-studio/guides/local-dev/find-app-in-dashboard.png
rename to content/altinn-studio/guides/development/local-dev/find-app-in-dashboard.png
diff --git a/content/altinn-studio/guides/local-dev/pull-successful.png b/content/altinn-studio/guides/development/local-dev/pull-successful.png
similarity index 100%
rename from content/altinn-studio/guides/local-dev/pull-successful.png
rename to content/altinn-studio/guides/development/local-dev/pull-successful.png
diff --git a/content/altinn-studio/guides/local-dev/push-successful.png b/content/altinn-studio/guides/development/local-dev/push-successful.png
similarity index 100%
rename from content/altinn-studio/guides/local-dev/push-successful.png
rename to content/altinn-studio/guides/development/local-dev/push-successful.png
diff --git a/content/altinn-studio/guides/local-dev/toolbar-hent.png b/content/altinn-studio/guides/development/local-dev/toolbar-hent.png
similarity index 100%
rename from content/altinn-studio/guides/local-dev/toolbar-hent.png
rename to content/altinn-studio/guides/development/local-dev/toolbar-hent.png
diff --git a/content/altinn-studio/guides/local-dev/toolbar-last-opp.png b/content/altinn-studio/guides/development/local-dev/toolbar-last-opp.png
similarity index 100%
rename from content/altinn-studio/guides/local-dev/toolbar-last-opp.png
rename to content/altinn-studio/guides/development/local-dev/toolbar-last-opp.png
diff --git a/content/altinn-studio/guides/multi-app-solution/_index.en.md b/content/altinn-studio/guides/development/multi-app-solution/_index.en.md
similarity index 99%
rename from content/altinn-studio/guides/multi-app-solution/_index.en.md
rename to content/altinn-studio/guides/development/multi-app-solution/_index.en.md
index 97f357617ab..8e798610137 100644
--- a/content/altinn-studio/guides/multi-app-solution/_index.en.md
+++ b/content/altinn-studio/guides/development/multi-app-solution/_index.en.md
@@ -4,9 +4,8 @@ linktitle: Multi-app solution
description: Considerations and explanations of how to go about when creating a multi-app solution
weight: 200
aliases:
-
- /app/multi-app-solution/
-
+- /altinn-studio/guides/multi-app-solution/
---
## What is a multi-app solution?
diff --git a/content/app/guides/multi-app-solution/_index.nb.md b/content/altinn-studio/guides/development/multi-app-solution/_index.nb.md
similarity index 99%
rename from content/app/guides/multi-app-solution/_index.nb.md
rename to content/altinn-studio/guides/development/multi-app-solution/_index.nb.md
index e724a62ca31..ede853318bd 100644
--- a/content/app/guides/multi-app-solution/_index.nb.md
+++ b/content/altinn-studio/guides/development/multi-app-solution/_index.nb.md
@@ -4,9 +4,8 @@ linktitle: Flerappsløsning
description: Vurderinger som burde gjøres og forklaringer på hvordan å gå frem når man utvikler en flerappsløsning
weight: 250
aliases:
-
- /app/multi-app-solution/
-
+- /altinn-studio/guides/multi-app-solution/
---
## Hva er en flerappsløsning?
diff --git a/content/app/guides/multi-app-solution/instructions/_index.en.md b/content/altinn-studio/guides/development/multi-app-solution/instructions/_index.en.md
similarity index 94%
rename from content/app/guides/multi-app-solution/instructions/_index.en.md
rename to content/altinn-studio/guides/development/multi-app-solution/instructions/_index.en.md
index dcf20a92d1a..5c4049fa722 100644
--- a/content/app/guides/multi-app-solution/instructions/_index.en.md
+++ b/content/altinn-studio/guides/development/multi-app-solution/instructions/_index.en.md
@@ -31,7 +31,7 @@ required prerequisites are met.
owner.*
If step 2 and 3 of the technical requirements are missing see
-section [Maskinporten-App Integration](../../maskinporten-app-integration)
+section [Maskinporten-App Integration](../../../integration/maskinporten-app-integration)
\* _If the end user of application A have the required roles to instantiate application B on behalf of the intended
recipient, you can skip these technical requirements_
diff --git a/content/app/guides/multi-app-solution/instructions/_index.nb.md b/content/altinn-studio/guides/development/multi-app-solution/instructions/_index.nb.md
similarity index 94%
rename from content/app/guides/multi-app-solution/instructions/_index.nb.md
rename to content/altinn-studio/guides/development/multi-app-solution/instructions/_index.nb.md
index 97dcd22b8c7..61c4d2b75e9 100644
--- a/content/app/guides/multi-app-solution/instructions/_index.nb.md
+++ b/content/altinn-studio/guides/development/multi-app-solution/instructions/_index.nb.md
@@ -30,7 +30,7 @@ Før du starter på den tekniske implementeringen, må du sørge for at de nødv
som skal sende forespørsler til en annen applikasjon, hvor forespørslene må autoriseres av applikasjonenseier.*
Hvis trinn 2 og 3 av de tekniske kravene mangler, se
-seksjonen [Maskinporten-App Integrering](../../maskinporten-app-integration)
+seksjonen [Maskinporten-App Integrering](../../../integration/maskinporten-app-integration)
\* _Hvis sluttbrukeren av applikasjon A har de nødvendige rollene for å instansiere applikasjon B på vegne av den
tiltenkte
diff --git a/content/altinn-studio/guides/multi-app-solution/instructions/app-a/_index.en.md b/content/altinn-studio/guides/development/multi-app-solution/instructions/app-a/_index.en.md
similarity index 100%
rename from content/altinn-studio/guides/multi-app-solution/instructions/app-a/_index.en.md
rename to content/altinn-studio/guides/development/multi-app-solution/instructions/app-a/_index.en.md
diff --git a/content/altinn-studio/guides/multi-app-solution/instructions/app-a/_index.nb.md b/content/altinn-studio/guides/development/multi-app-solution/instructions/app-a/_index.nb.md
similarity index 100%
rename from content/altinn-studio/guides/multi-app-solution/instructions/app-a/_index.nb.md
rename to content/altinn-studio/guides/development/multi-app-solution/instructions/app-a/_index.nb.md
diff --git a/content/altinn-studio/guides/multi-app-solution/instructions/app-b/_index.en.md b/content/altinn-studio/guides/development/multi-app-solution/instructions/app-b/_index.en.md
similarity index 100%
rename from content/altinn-studio/guides/multi-app-solution/instructions/app-b/_index.en.md
rename to content/altinn-studio/guides/development/multi-app-solution/instructions/app-b/_index.en.md
diff --git a/content/altinn-studio/guides/multi-app-solution/instructions/app-b/_index.nb.md b/content/altinn-studio/guides/development/multi-app-solution/instructions/app-b/_index.nb.md
similarity index 100%
rename from content/altinn-studio/guides/multi-app-solution/instructions/app-b/_index.nb.md
rename to content/altinn-studio/guides/development/multi-app-solution/instructions/app-b/_index.nb.md
diff --git a/content/altinn-studio/guides/multi-app-solution/multi-app-architecture.drawio.svg b/content/altinn-studio/guides/development/multi-app-solution/multi-app-architecture.drawio.svg
similarity index 100%
rename from content/altinn-studio/guides/multi-app-solution/multi-app-architecture.drawio.svg
rename to content/altinn-studio/guides/development/multi-app-solution/multi-app-architecture.drawio.svg
diff --git a/content/altinn-studio/guides/multi-app-solution/testing/_index.en.md b/content/altinn-studio/guides/development/multi-app-solution/testing/_index.en.md
similarity index 100%
rename from content/altinn-studio/guides/multi-app-solution/testing/_index.en.md
rename to content/altinn-studio/guides/development/multi-app-solution/testing/_index.en.md
diff --git a/content/altinn-studio/guides/multi-app-solution/testing/_index.nb.md b/content/altinn-studio/guides/development/multi-app-solution/testing/_index.nb.md
similarity index 100%
rename from content/altinn-studio/guides/multi-app-solution/testing/_index.nb.md
rename to content/altinn-studio/guides/development/multi-app-solution/testing/_index.nb.md
diff --git a/content/altinn-studio/guides/options/_index.en.md b/content/altinn-studio/guides/development/options/_index.en.md
similarity index 99%
rename from content/altinn-studio/guides/options/_index.en.md
rename to content/altinn-studio/guides/development/options/_index.en.md
index f619dd3fcd3..e551f9164ff 100644
--- a/content/altinn-studio/guides/options/_index.en.md
+++ b/content/altinn-studio/guides/development/options/_index.en.md
@@ -4,6 +4,8 @@ linktitle: Code lists
description: How to configure Options / Code lists for an app?
toc: true
weight: 40
+aliases:
+- /altinn-studio/guides/options
---
Altinn offers two different ways an application can use code lists - static and dynamic. Both is primarily exposed
diff --git a/content/altinn-studio/guides/options/_index.nb.md b/content/altinn-studio/guides/development/options/_index.nb.md
similarity index 99%
rename from content/altinn-studio/guides/options/_index.nb.md
rename to content/altinn-studio/guides/development/options/_index.nb.md
index 07c7d8468fe..5946a764874 100644
--- a/content/altinn-studio/guides/options/_index.nb.md
+++ b/content/altinn-studio/guides/development/options/_index.nb.md
@@ -4,6 +4,8 @@ linktitle: Kodelister
description: Hvordan konfigurere svaralternativer/kodelister for en app?
toc: true
weight: 40
+aliases:
+- /nb/altinn-studio/guides/options
---
Altinn tilbyr to ulike måter en app kan eksponere kodelister på: Statisk og dynamisk. Disse eksponeres primært fra endepunktet som er tilgjengelig på `{org}/{app}/api/options/{optionsId}`, hvor `optionsId` er ID-en til listen.
diff --git a/content/altinn-studio/guides/options/altinn2-codelists/_index.en.md b/content/altinn-studio/guides/development/options/altinn2-codelists/_index.en.md
similarity index 100%
rename from content/altinn-studio/guides/options/altinn2-codelists/_index.en.md
rename to content/altinn-studio/guides/development/options/altinn2-codelists/_index.en.md
diff --git a/content/altinn-studio/guides/options/altinn2-codelists/_index.nb.md b/content/altinn-studio/guides/development/options/altinn2-codelists/_index.nb.md
similarity index 100%
rename from content/altinn-studio/guides/options/altinn2-codelists/_index.nb.md
rename to content/altinn-studio/guides/development/options/altinn2-codelists/_index.nb.md
diff --git a/content/altinn-studio/guides/options/common-codelists/_index.en.md b/content/altinn-studio/guides/development/options/common-codelists/_index.en.md
similarity index 100%
rename from content/altinn-studio/guides/options/common-codelists/_index.en.md
rename to content/altinn-studio/guides/development/options/common-codelists/_index.en.md
diff --git a/content/altinn-studio/guides/options/common-codelists/_index.nb.md b/content/altinn-studio/guides/development/options/common-codelists/_index.nb.md
similarity index 100%
rename from content/altinn-studio/guides/options/common-codelists/_index.nb.md
rename to content/altinn-studio/guides/development/options/common-codelists/_index.nb.md
diff --git a/content/altinn-studio/guides/options/dynamic-codelists/_index.en.md b/content/altinn-studio/guides/development/options/dynamic-codelists/_index.en.md
similarity index 100%
rename from content/altinn-studio/guides/options/dynamic-codelists/_index.en.md
rename to content/altinn-studio/guides/development/options/dynamic-codelists/_index.en.md
diff --git a/content/altinn-studio/guides/options/dynamic-codelists/_index.nb.md b/content/altinn-studio/guides/development/options/dynamic-codelists/_index.nb.md
similarity index 100%
rename from content/altinn-studio/guides/options/dynamic-codelists/_index.nb.md
rename to content/altinn-studio/guides/development/options/dynamic-codelists/_index.nb.md
diff --git a/content/altinn-studio/guides/options/repeating-group-codelists/_index.en.md b/content/altinn-studio/guides/development/options/repeating-group-codelists/_index.en.md
similarity index 100%
rename from content/altinn-studio/guides/options/repeating-group-codelists/_index.en.md
rename to content/altinn-studio/guides/development/options/repeating-group-codelists/_index.en.md
diff --git a/content/altinn-studio/guides/options/repeating-group-codelists/_index.nb.md b/content/altinn-studio/guides/development/options/repeating-group-codelists/_index.nb.md
similarity index 100%
rename from content/altinn-studio/guides/options/repeating-group-codelists/_index.nb.md
rename to content/altinn-studio/guides/development/options/repeating-group-codelists/_index.nb.md
diff --git a/content/altinn-studio/guides/options/static-codelists/_index.en.md b/content/altinn-studio/guides/development/options/static-codelists/_index.en.md
similarity index 100%
rename from content/altinn-studio/guides/options/static-codelists/_index.en.md
rename to content/altinn-studio/guides/development/options/static-codelists/_index.en.md
diff --git a/content/altinn-studio/guides/options/static-codelists/_index.nb.md b/content/altinn-studio/guides/development/options/static-codelists/_index.nb.md
similarity index 100%
rename from content/altinn-studio/guides/options/static-codelists/_index.nb.md
rename to content/altinn-studio/guides/development/options/static-codelists/_index.nb.md
diff --git a/content/altinn-studio/guides/payment/_index.en.md b/content/altinn-studio/guides/development/payment/_index.en.md
similarity index 67%
rename from content/altinn-studio/guides/payment/_index.en.md
rename to content/altinn-studio/guides/development/payment/_index.en.md
index 73f2c4c8093..7a50f913c7d 100644
--- a/content/altinn-studio/guides/payment/_index.en.md
+++ b/content/altinn-studio/guides/development/payment/_index.en.md
@@ -4,6 +4,8 @@ linktitle: Payment
description: Follow these steps to implement Payment in your App
tags: [payment]
weight: 50
+aliases:
+- /altinn-studio/guides/payment/
---
## 1. Before you begin
@@ -14,11 +16,11 @@ weight: 50
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/studio/add-process-task.en.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/studio/add-process-task.en.md" %}}
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/backend-manual/add-process-task.en.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/backend-manual/add-process-task.en.md" %}}
{{}}
{{}}
@@ -27,11 +29,11 @@ weight: 50
## 3. Ensure correct authorization for payment task
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/studio/access-rules.en.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/studio/access-rules.en.md" %}}
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/backend-manual/access-rules.en.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/backend-manual/access-rules.en.md" %}}
{{}}
{{}}
@@ -40,11 +42,11 @@ weight: 50
## 4. Configure display of payment information in form
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/studio/configure-layouts.en.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/studio/configure-layouts.en.md" %}}
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/backend-manual/configure-layouts.en.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/backend-manual/configure-layouts.en.md" %}}
{{}}
{{}}
@@ -53,11 +55,11 @@ weight: 50
## 5. Calculate amount to pay
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/studio/calculate-payment.en.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/studio/calculate-payment.en.md" %}}
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/backend-manual/calculate-payment.en.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/backend-manual/calculate-payment.en.md" %}}
{{}}
{{}}
@@ -66,10 +68,10 @@ weight: 50
## 6. Connect the app to the NETS Easy agreement
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/studio/configure-secrets.en.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/studio/configure-secrets.en.md" %}}
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/backend-manual/configure-secrets.en.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/backend-manual/configure-secrets.en.md" %}}
{{}}
{{}}
diff --git a/content/altinn-studio/guides/payment/_index.nb.md b/content/altinn-studio/guides/development/payment/_index.nb.md
similarity index 69%
rename from content/altinn-studio/guides/payment/_index.nb.md
rename to content/altinn-studio/guides/development/payment/_index.nb.md
index 7d48b7cfa4e..a6d41d8c36f 100644
--- a/content/altinn-studio/guides/payment/_index.nb.md
+++ b/content/altinn-studio/guides/development/payment/_index.nb.md
@@ -4,6 +4,8 @@ linktitle: Betaling
description: Følg disse grunnleggende stegene for å komme i gang med å integrere betaling i din Altinn App.
tags: [betaling]
weight: 50
+aliases:
+- /nb/altinn-studio/guides/payment/
---
@@ -18,11 +20,11 @@ Du finner informasjon om hvordan du oppretter avtalen her:
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/studio/add-process-task.nb.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/studio/add-process-task.nb.md" %}}
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/backend-manual/add-process-task.nb.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/backend-manual/add-process-task.nb.md" %}}
{{}}
{{}}
@@ -31,11 +33,11 @@ Du finner informasjon om hvordan du oppretter avtalen her:
## 3. Gi tilganger til den som skal betale
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/studio/access-rules.nb.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/studio/access-rules.nb.md" %}}
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/backend-manual/access-rules.nb.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/backend-manual/access-rules.nb.md" %}}
{{}}
{{}}
@@ -44,11 +46,11 @@ Du finner informasjon om hvordan du oppretter avtalen her:
## 4. Konfigurer visning av betalingsinformasjon
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/studio/configure-layouts.nb.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/studio/configure-layouts.nb.md" %}}
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/backend-manual/configure-layouts.nb.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/backend-manual/configure-layouts.nb.md" %}}
{{}}
{{}}
@@ -57,11 +59,11 @@ Du finner informasjon om hvordan du oppretter avtalen her:
## 5. Beregn hva som skal betales
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/studio/calculate-payment.nb.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/studio/calculate-payment.nb.md" %}}
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/backend-manual/calculate-payment.nb.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/backend-manual/calculate-payment.nb.md" %}}
{{}}
{{}}
@@ -70,10 +72,10 @@ Du finner informasjon om hvordan du oppretter avtalen her:
## 6. Koble appen til NETS Easy avtalen
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/studio/configure-secrets.nb.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/studio/configure-secrets.nb.md" %}}
{{}}
{{}}
-{{% insert "content/altinn-studio/guides/payment/backend-manual/configure-secrets.nb.md" %}}
+{{% insert "content/altinn-studio/guides/development/payment/backend-manual/configure-secrets.nb.md" %}}
{{}}
{{}}
diff --git a/content/altinn-studio/guides/payment/backend-manual/access-rules.en.md b/content/altinn-studio/guides/development/payment/backend-manual/access-rules.en.md
similarity index 100%
rename from content/altinn-studio/guides/payment/backend-manual/access-rules.en.md
rename to content/altinn-studio/guides/development/payment/backend-manual/access-rules.en.md
diff --git a/content/altinn-studio/guides/payment/backend-manual/access-rules.nb.md b/content/altinn-studio/guides/development/payment/backend-manual/access-rules.nb.md
similarity index 100%
rename from content/altinn-studio/guides/payment/backend-manual/access-rules.nb.md
rename to content/altinn-studio/guides/development/payment/backend-manual/access-rules.nb.md
diff --git a/content/altinn-studio/guides/payment/backend-manual/add-process-task.en.md b/content/altinn-studio/guides/development/payment/backend-manual/add-process-task.en.md
similarity index 100%
rename from content/altinn-studio/guides/payment/backend-manual/add-process-task.en.md
rename to content/altinn-studio/guides/development/payment/backend-manual/add-process-task.en.md
diff --git a/content/altinn-studio/guides/payment/backend-manual/add-process-task.nb.md b/content/altinn-studio/guides/development/payment/backend-manual/add-process-task.nb.md
similarity index 100%
rename from content/altinn-studio/guides/payment/backend-manual/add-process-task.nb.md
rename to content/altinn-studio/guides/development/payment/backend-manual/add-process-task.nb.md
diff --git a/content/altinn-studio/guides/payment/backend-manual/calculate-payment.en.md b/content/altinn-studio/guides/development/payment/backend-manual/calculate-payment.en.md
similarity index 100%
rename from content/altinn-studio/guides/payment/backend-manual/calculate-payment.en.md
rename to content/altinn-studio/guides/development/payment/backend-manual/calculate-payment.en.md
diff --git a/content/altinn-studio/guides/payment/backend-manual/calculate-payment.nb.md b/content/altinn-studio/guides/development/payment/backend-manual/calculate-payment.nb.md
similarity index 100%
rename from content/altinn-studio/guides/payment/backend-manual/calculate-payment.nb.md
rename to content/altinn-studio/guides/development/payment/backend-manual/calculate-payment.nb.md
diff --git a/content/altinn-studio/guides/payment/backend-manual/configure-layouts.en.md b/content/altinn-studio/guides/development/payment/backend-manual/configure-layouts.en.md
similarity index 100%
rename from content/altinn-studio/guides/payment/backend-manual/configure-layouts.en.md
rename to content/altinn-studio/guides/development/payment/backend-manual/configure-layouts.en.md
diff --git a/content/altinn-studio/guides/payment/backend-manual/configure-layouts.nb.md b/content/altinn-studio/guides/development/payment/backend-manual/configure-layouts.nb.md
similarity index 100%
rename from content/altinn-studio/guides/payment/backend-manual/configure-layouts.nb.md
rename to content/altinn-studio/guides/development/payment/backend-manual/configure-layouts.nb.md
diff --git a/content/altinn-studio/guides/payment/backend-manual/configure-secrets.en.md b/content/altinn-studio/guides/development/payment/backend-manual/configure-secrets.en.md
similarity index 100%
rename from content/altinn-studio/guides/payment/backend-manual/configure-secrets.en.md
rename to content/altinn-studio/guides/development/payment/backend-manual/configure-secrets.en.md
diff --git a/content/altinn-studio/guides/payment/backend-manual/configure-secrets.nb.md b/content/altinn-studio/guides/development/payment/backend-manual/configure-secrets.nb.md
similarity index 100%
rename from content/altinn-studio/guides/payment/backend-manual/configure-secrets.nb.md
rename to content/altinn-studio/guides/development/payment/backend-manual/configure-secrets.nb.md
diff --git a/content/altinn-studio/guides/payment/process-data-payment.png b/content/altinn-studio/guides/development/payment/process-data-payment.png
similarity index 100%
rename from content/altinn-studio/guides/payment/process-data-payment.png
rename to content/altinn-studio/guides/development/payment/process-data-payment.png
diff --git a/content/altinn-studio/guides/payment/studio/access-rules.en.md b/content/altinn-studio/guides/development/payment/studio/access-rules.en.md
similarity index 100%
rename from content/altinn-studio/guides/payment/studio/access-rules.en.md
rename to content/altinn-studio/guides/development/payment/studio/access-rules.en.md
diff --git a/content/altinn-studio/guides/payment/studio/access-rules.nb.md b/content/altinn-studio/guides/development/payment/studio/access-rules.nb.md
similarity index 100%
rename from content/altinn-studio/guides/payment/studio/access-rules.nb.md
rename to content/altinn-studio/guides/development/payment/studio/access-rules.nb.md
diff --git a/content/altinn-studio/guides/payment/studio/add-process-task.en.md b/content/altinn-studio/guides/development/payment/studio/add-process-task.en.md
similarity index 92%
rename from content/altinn-studio/guides/payment/studio/add-process-task.en.md
rename to content/altinn-studio/guides/development/payment/studio/add-process-task.en.md
index 766ec62826f..f8b6e8a4b26 100644
--- a/content/altinn-studio/guides/payment/studio/add-process-task.en.md
+++ b/content/altinn-studio/guides/development/payment/studio/add-process-task.en.md
@@ -22,4 +22,4 @@ hidden: true
the action should be "Reject".
-![Eksempel på en prosess med utfylling etterfulgt av betaling](/altinn-studio/guides/payment/process-data-payment.png "Eksempel på en prosess med utfylling etterfulgt av betaling")
+![Eksempel på en prosess med utfylling etterfulgt av betaling](/altinn-studio/guides/development/payment/process-data-payment.png "Eksempel på en prosess med utfylling etterfulgt av betaling")
diff --git a/content/altinn-studio/guides/payment/studio/add-process-task.nb.md b/content/altinn-studio/guides/development/payment/studio/add-process-task.nb.md
similarity index 92%
rename from content/altinn-studio/guides/payment/studio/add-process-task.nb.md
rename to content/altinn-studio/guides/development/payment/studio/add-process-task.nb.md
index 76711ade079..77c6413f150 100644
--- a/content/altinn-studio/guides/payment/studio/add-process-task.nb.md
+++ b/content/altinn-studio/guides/development/payment/studio/add-process-task.nb.md
@@ -24,4 +24,4 @@ hidden: true
det oppsettet som legges til - aksjon skal være "Avvise".
-![Eksempel på en prosess med utfylling etterfulgt av betaling](/altinn-studio/guides/payment/process-data-payment.png "Eksempel på en prosess med utfylling etterfulgt av betaling")
\ No newline at end of file
+![Eksempel på en prosess med utfylling etterfulgt av betaling](/altinn-studio/guides/development/payment/process-data-payment.png "Eksempel på en prosess med utfylling etterfulgt av betaling")
\ No newline at end of file
diff --git a/content/altinn-studio/guides/payment/studio/calculate-payment.en.md b/content/altinn-studio/guides/development/payment/studio/calculate-payment.en.md
similarity index 100%
rename from content/altinn-studio/guides/payment/studio/calculate-payment.en.md
rename to content/altinn-studio/guides/development/payment/studio/calculate-payment.en.md
diff --git a/content/altinn-studio/guides/payment/studio/calculate-payment.nb.md b/content/altinn-studio/guides/development/payment/studio/calculate-payment.nb.md
similarity index 100%
rename from content/altinn-studio/guides/payment/studio/calculate-payment.nb.md
rename to content/altinn-studio/guides/development/payment/studio/calculate-payment.nb.md
diff --git a/content/altinn-studio/guides/payment/studio/configure-layouts.en.md b/content/altinn-studio/guides/development/payment/studio/configure-layouts.en.md
similarity index 100%
rename from content/altinn-studio/guides/payment/studio/configure-layouts.en.md
rename to content/altinn-studio/guides/development/payment/studio/configure-layouts.en.md
diff --git a/content/altinn-studio/guides/payment/studio/configure-layouts.nb.md b/content/altinn-studio/guides/development/payment/studio/configure-layouts.nb.md
similarity index 100%
rename from content/altinn-studio/guides/payment/studio/configure-layouts.nb.md
rename to content/altinn-studio/guides/development/payment/studio/configure-layouts.nb.md
diff --git a/content/altinn-studio/guides/payment/studio/configure-secrets.en.md b/content/altinn-studio/guides/development/payment/studio/configure-secrets.en.md
similarity index 100%
rename from content/altinn-studio/guides/payment/studio/configure-secrets.en.md
rename to content/altinn-studio/guides/development/payment/studio/configure-secrets.en.md
diff --git a/content/altinn-studio/guides/payment/studio/configure-secrets.nb.md b/content/altinn-studio/guides/development/payment/studio/configure-secrets.nb.md
similarity index 100%
rename from content/altinn-studio/guides/payment/studio/configure-secrets.nb.md
rename to content/altinn-studio/guides/development/payment/studio/configure-secrets.nb.md
diff --git a/content/altinn-studio/guides/prefill/_index.en.md b/content/altinn-studio/guides/development/prefill/_index.en.md
similarity index 86%
rename from content/altinn-studio/guides/prefill/_index.en.md
rename to content/altinn-studio/guides/development/prefill/_index.en.md
index 3cc3aed75d6..3d182bcd1d4 100644
--- a/content/altinn-studio/guides/prefill/_index.en.md
+++ b/content/altinn-studio/guides/development/prefill/_index.en.md
@@ -3,6 +3,8 @@ title: Prefill
linktitle: Prefill
description: Pre-filling an instance with data.
weight: 30
+aliases:
+- /altinn-studio/guides/prefill/
---
As of today, Altinn offers three methods for prefilling data in an app for a user.
These methods can be combined freely to reach the desired result.
diff --git a/content/altinn-studio/guides/prefill/_index.nb.md b/content/altinn-studio/guides/development/prefill/_index.nb.md
similarity index 87%
rename from content/altinn-studio/guides/prefill/_index.nb.md
rename to content/altinn-studio/guides/development/prefill/_index.nb.md
index 8a92d01e081..d3d45e3af18 100644
--- a/content/altinn-studio/guides/prefill/_index.nb.md
+++ b/content/altinn-studio/guides/development/prefill/_index.nb.md
@@ -3,6 +3,8 @@ title: Forhåndsutfylling
linktitle: Forhåndsutfylling
description: Forhåndsutfylling av appeksemplar med data
weight: 30
+aliases:
+- /nb/altinn-studio/guides/prefill/
---
Altinn tilbyr i dag tre fremgangsmåter for å forhåndsutfylle data i en app for en sluttbruker.
Disse metodene kan kombineres fritt for å oppnå ønsket resultat.
diff --git a/content/altinn-studio/guides/prefill/config/_index.en.md b/content/altinn-studio/guides/development/prefill/config/_index.en.md
similarity index 97%
rename from content/altinn-studio/guides/prefill/config/_index.en.md
rename to content/altinn-studio/guides/development/prefill/config/_index.en.md
index 4c773e9dba1..9c5be97cd47 100644
--- a/content/altinn-studio/guides/prefill/config/_index.en.md
+++ b/content/altinn-studio/guides/development/prefill/config/_index.en.md
@@ -46,7 +46,7 @@ with a key/value pair:
- The key is the field the data is _fetched from_-
- The value is the field to populate in the data model.
-A full overview of the available fields can be found [here](../../../reference/data/prefill/#available-prefill-values).
+A full overview of the available fields can be found [here](../../../../reference/data/prefill/#available-prefill-values).
### Example: Field from the Central Coordinating Register (ER)
The example below will populate the field _Datamodell.Organisasjon.Organisasjonsnummer_ with the organization number retrieved from the Central Coordinating register.
diff --git a/content/altinn-studio/guides/prefill/config/_index.nb.md b/content/altinn-studio/guides/development/prefill/config/_index.nb.md
similarity index 98%
rename from content/altinn-studio/guides/prefill/config/_index.nb.md
rename to content/altinn-studio/guides/development/prefill/config/_index.nb.md
index 6aa7d9de57c..73b68098125 100644
--- a/content/altinn-studio/guides/prefill/config/_index.nb.md
+++ b/content/altinn-studio/guides/development/prefill/config/_index.nb.md
@@ -46,7 +46,7 @@ i _prefill.json_-filen, legg inn en ny linje med nøkkel/verdi:
- Nøkkelen skal være feltet som data hentes _fra_.
- Verdien skal være feltet fra datamodellen.
-Full oversikt over tilgjengelige felter finner du [her](../../../reference/data/prefill).
+Full oversikt over tilgjengelige felter finner du [her](../../../../reference/data/prefill).
### Eksempel: Felt fra Enhetsregisteret (ER)
diff --git a/content/altinn-studio/guides/prefill/custom/_index.en.md b/content/altinn-studio/guides/development/prefill/custom/_index.en.md
similarity index 100%
rename from content/altinn-studio/guides/prefill/custom/_index.en.md
rename to content/altinn-studio/guides/development/prefill/custom/_index.en.md
diff --git a/content/altinn-studio/guides/prefill/custom/_index.nb.md b/content/altinn-studio/guides/development/prefill/custom/_index.nb.md
similarity index 100%
rename from content/altinn-studio/guides/prefill/custom/_index.nb.md
rename to content/altinn-studio/guides/development/prefill/custom/_index.nb.md
diff --git a/content/altinn-studio/guides/prefill/instantiation/_index.en.md b/content/altinn-studio/guides/development/prefill/instantiation/_index.en.md
similarity index 100%
rename from content/altinn-studio/guides/prefill/instantiation/_index.en.md
rename to content/altinn-studio/guides/development/prefill/instantiation/_index.en.md
diff --git a/content/altinn-studio/guides/prefill/instantiation/_index.nb.md b/content/altinn-studio/guides/development/prefill/instantiation/_index.nb.md
similarity index 100%
rename from content/altinn-studio/guides/prefill/instantiation/_index.nb.md
rename to content/altinn-studio/guides/development/prefill/instantiation/_index.nb.md
diff --git a/content/altinn-studio/guides/integration/_index.en.md b/content/altinn-studio/guides/integration/_index.en.md
new file mode 100644
index 00000000000..8cbcb0e1375
--- /dev/null
+++ b/content/altinn-studio/guides/integration/_index.en.md
@@ -0,0 +1,9 @@
+---
+title: Integration
+description: Guides related to integrations to and from an app in Altinn Studio
+weight: 40
+aliases:
+- /altinn-studio/guides/maskinporten-app-integration/
+---
+
+{{}}
\ No newline at end of file
diff --git a/content/altinn-studio/guides/integration/_index.nb.md b/content/altinn-studio/guides/integration/_index.nb.md
new file mode 100644
index 00000000000..a41314fc05e
--- /dev/null
+++ b/content/altinn-studio/guides/integration/_index.nb.md
@@ -0,0 +1,9 @@
+---
+title: Integrasjon
+description: Guider knyttet til integrasjoner til/fra en Altinn Studio app.
+weight: 40
+aliases:
+- /nb/altinn-studio/guides/maskinporten-app-integration/
+---
+
+{{}}
\ No newline at end of file
diff --git a/content/altinn-studio/guides/maskinporten-app-integration/_index.en.md b/content/altinn-studio/guides/integration/maskinporten-app-integration/_index.en.md
similarity index 97%
rename from content/altinn-studio/guides/maskinporten-app-integration/_index.en.md
rename to content/altinn-studio/guides/integration/maskinporten-app-integration/_index.en.md
index 134c305970f..1a305fe2cd8 100644
--- a/content/altinn-studio/guides/maskinporten-app-integration/_index.en.md
+++ b/content/altinn-studio/guides/integration/maskinporten-app-integration/_index.en.md
@@ -29,7 +29,7 @@ to Azure key vault for your organization, so the keys
created further on in the guide can be added directly into
the secrets in Azure.
-If access is missing, please refer to [Access to logs and secrets](/altinn-studio/guides/access-management/apps).
+If access is missing, please refer to [Access to logs and secrets](/altinn-studio/guides/administration/access-management/apps).
## Maskinporten Integration
@@ -81,7 +81,7 @@ When preparing the application to use the secrets from Azure Key vault, there ar
2. For the application to be able to read the secrets from
Azure key vault the application need to be configured to
do so. See
- the [secrets section](../../reference/configuration/secrets)
+ the [secrets section](../../../reference/configuration/secrets)
to achieve this.
3. Add the appsettings section example
from above into the `appsettings.{env}.json` file.
diff --git a/content/altinn-studio/guides/maskinporten-app-integration/_index.nb.md b/content/altinn-studio/guides/integration/maskinporten-app-integration/_index.nb.md
similarity index 97%
rename from content/altinn-studio/guides/maskinporten-app-integration/_index.nb.md
rename to content/altinn-studio/guides/integration/maskinporten-app-integration/_index.nb.md
index 2cce56a712d..fe249d6ac14 100644
--- a/content/altinn-studio/guides/maskinporten-app-integration/_index.nb.md
+++ b/content/altinn-studio/guides/integration/maskinporten-app-integration/_index.nb.md
@@ -31,7 +31,7 @@ til Azure Key Vault for organisasjonen din, slik at nøklene
som opprettes senere i guiden, kan legges direkte inn i
hemmelighetene i Azure.
-Hvis tilgang mangler, se [Tilgang til logger og hemmeligheter](/nb/altinn-studio/guides/access-management/apps).
+Hvis tilgang mangler, se [Tilgang til logger og hemmeligheter](/nb/altinn-studio/guides/administration/access-management/apps).
## Maskinporten-integrasjon
@@ -84,7 +84,7 @@ Når applikasjonen forberedes på å bruke hemmelighetene fra Azure Key Vault, e
2. For at applikasjonen skal kunne lese hemmelighetene fra
Azure Key Vault, må applikasjonen konfigureres til
å gjøre dette. Se
- [seksjoner om hemmeligheter](../../reference/configuration/secrets)
+ [seksjoner om hemmeligheter](../../../reference/configuration/secrets)
for å oppnå dette.
3. Legg til eksempel på appsettings-seksjonen
ovenfor i `appsettings.{env}.json`-filen.
diff --git a/content/altinn-studio/guides/multi-app-solution/_index.nb.md b/content/altinn-studio/guides/multi-app-solution/_index.nb.md
deleted file mode 100644
index e724a62ca31..00000000000
--- a/content/altinn-studio/guides/multi-app-solution/_index.nb.md
+++ /dev/null
@@ -1,99 +0,0 @@
----
-title: Generell fremgangsmåte for å utvikle en flerappsløsning i Altinn
-linktitle: Flerappsløsning
-description: Vurderinger som burde gjøres og forklaringer på hvordan å gå frem når man utvikler en flerappsløsning
-weight: 250
-aliases:
-
-- /app/multi-app-solution/
-
----
-
-## Hva er en flerappsløsning?
-
-En flerappsløsning er en løsning som består av to eller flere
-samarbeidende applikasjoner, der applikasjon A typisk vil utløse
-opprettelsen av en ny
-instans av applikasjon B. Som en del av
-opprettelsen av applikasjon B er det mulig å
-forhåndsfylle instansen med spesifikke data fra den pågående
-forekomsten av applikasjon A.
-
-Denne guiden tar deg gjennom en flerappsløsning som består av to
-apper; _applikasjon A_ og _applikasjon B_,
-men konseptet kan utvides til å inneholde flere applikasjoner av
-type A eller type B, eller begge typer.
-
-![Eksempelarkitektur for en flerapp-løsning](multi-app-architecture.drawio.svg)
-
-### Terminologi
-
-- **En instans:** Når vi snakker om instanser i en
- applikasjonskontekst, refererer dette til unik data som beskriver
- detaljer om den spesifikke økten som pågår i applikasjonen.
- Dataene inkluderer informasjon om hvem som fyller ut
- dataene og hva dataene inneholder.
-- **Applikasjon A:** Dette vil være en applikasjon som fungerer som en vanlig
- Altinn-applikasjon, noe som betyr at
- sluttbrukere vil samhandle med den. Mens de fyller ut skjemaet, vil de
- jobbe på sin egen private instans. Imidlertid
- vil den skille seg fra andre Altinn-apper siden tjeneste-eieren
- har tilpasset den for å inkludere handlinger som
- vil opprette en ny instans av _applikasjon B_.
-- **Applikasjon B:** Dette vil være en applikasjon som kan ha flere
- formål, men hovedformålet vil være
- å motta og håndtere data fra _applikasjon A_.
- Denne applikasjonen vil skille seg fra
- andre Altinn-apper siden instanser opprettes av
- utløsere i en annen applikasjon.
-
-## Trenger jeg en flerappsløsning?
-
-Altinn tilbyr et robust sett med API-er og eventstøtte for behandling av data fra Altinn-apper. Hvis disse
-alternativene ikke
-samsvarer med dine behov, kan du vurdere en flerappsløsning.
-
-### Brukstilfeller der du kan vurdere å bruke en flerappsløsning:
-
-Vi har skissert noen vanlige brukstilfeller hvor en flerappsløsning kan være hensiktsmessig.
-
-- Organisasjonen har begrenset utviklingskapasitet eller ønsker ikke
- å utvikle og vedlikeholde et nytt system for behandling av data fra
- Altinn.
-- Eksisterende oppsett i organisasjonen for behandling av data fra
- Altinn oppfyller ikke kravene til sikkerhet.
-
-Ved å implementere en flerappsløsning kan en organisasjon bruke Altinn-innboksen for å motta data. I
-de fleste tilfeller vil personene som trenger å behandle dataene allerede ha tilgang til organisasjonen i Altinn eller
-kan
-tildeles denne tilgangen. Den siste applikasjonen i dataflyten (applikasjon B i vårt tilfelle) kan angi
-autorisasjonsregler
-som krever en spesifikk rolle før tilgang til dataene gis, og dermed støtte begrenset tilgang til sensitive data til
-personer med et offisielt behov.
-
-## Hvordan fungerer egentlig flerappsløsning?
-
-En flerappsløsning er en måte å konfigurere flere skjemaer for å kommunisere gjennom API-kall. Den spesifikke
-kommunikasjonen
-vi vil beskrive i denne veilederen er opprettelsen av en ny instans av en applikasjon (B) utløst av en annen
-applikasjon
-(A). Et typisk scenario ville være at en sluttbruker fyller ut eller laster opp informasjon i en instans av
-applikasjon A. Når sluttbruker trykker
-på knappen for å sende inn skjemaet, sendes et API-kall til en annen applikasjon (B), og det opprettes en ny instans
-av denne applikasjonen hvor
-svarene fra applikasjon A er en del av informasjonen.
-
-### En integrasjon mellom appen og Maskinporten kan være nødvendig
-
-For at en applikasjon skal utføre handlinger på en annen applikasjon, for eksempel opprette en ny instans på vegne av
-en sluttbruker eller organisasjon, må den være autorisert.
-Av natur vil forespørselen om å opprette instansen av applikasjon B inkludere legitimasjonen til sluttbrukeren
-som fyller ut applikasjon A.
-I de fleste tilfeller vil ikke denne sluttbrukeren være autorisert til å instansiere nye instanser på vegne av
-organisasjonen som eier applikasjon B, og dette vil derfor feile.
-En måte å sikre at applikasjonen er autorisert til å utføre instansieringshandlingen på, er å bruke
-applikasjoneierens legitimasjon i stedet for sluttbrukerens legitimasjon.
-Dette oppnås ved å bruke en Maskinporten-integrasjon for å generere en token som representerer organisasjonen
-og legge dette tokenet til i forespørslene som applikasjon A gjør mot applikasjon B.
-
-{{}}
\ No newline at end of file
diff --git a/content/altinn-studio/guides/multi-app-solution/instructions/_index.en.md b/content/altinn-studio/guides/multi-app-solution/instructions/_index.en.md
deleted file mode 100644
index dcf20a92d1a..00000000000
--- a/content/altinn-studio/guides/multi-app-solution/instructions/_index.en.md
+++ /dev/null
@@ -1,39 +0,0 @@
----
-title: Instructions for making a multi-app solution in Altinn
-linktitle: Instructions
-description: Explanations of how to go about when creating a general multi-app solution
-weight: 20
-aliases:
-
-- /app/multi-app-solution/instructions/
-
----
-
-## Prerequisites
-
-Before starting on the technical implementation, please make sure the
-required prerequisites are met.
-
-### Functional Prerequisites
-
-1. The app developer must have access to create, develop and deploy applications owned by an organization.
-2. An existing Altinn form (application A) where the data that is intended forwarded to application B is identified.
-3. It should be clear who the instance owners are, meaning what roles and access they acquire.
-
-### Technical Prerequisites
-
-1. Your applications are using version 8 or newer of the Altinn nugets.
-2. The organization possesses an already existing Maskinporten client with the altinn-specific
- scopes; `altinn:serviceowner/instances.read` and
- `altinn:serviceowner/instances.write`*
-3. An integration between the application(s) and the clients in Maskinporten. This must be done in the application(s)
- that are going to send requests to another application, which requests needs to be authorized by the application
- owner.*
-
-If step 2 and 3 of the technical requirements are missing see
-section [Maskinporten-App Integration](../../maskinporten-app-integration)
-
-\* _If the end user of application A have the required roles to instantiate application B on behalf of the intended
-recipient, you can skip these technical requirements_
-
-{{}}
diff --git a/content/altinn-studio/guides/multi-app-solution/instructions/_index.nb.md b/content/altinn-studio/guides/multi-app-solution/instructions/_index.nb.md
deleted file mode 100644
index 97dcd22b8c7..00000000000
--- a/content/altinn-studio/guides/multi-app-solution/instructions/_index.nb.md
+++ /dev/null
@@ -1,39 +0,0 @@
----
-title: Instruksjoner for å utvikle en flerappsløsning i Altinn
-linktitle: Instruksjoner
-description: Forklaringer om hvordan du går frem for å lage en generell flerappsløsning
-weight: 20
-aliases:
-
-- /app/multi-app-solution/instructions/app-b
-
----
-
-## Forutsetninger
-
-Før du starter på den tekniske implementeringen, må du sørge for at de nødvendige forutsetningene er oppfylt.
-
-### Funksjonelle forutsetninger
-
-1. App-utvikleren må ha tilgang til å opprette, utvikle og distribuere applikasjoner eid av en organisasjon.
-2. Et eksisterende Altinn-skjema (applikasjon A) der dataene som er ment å videresendes til applikasjon
- B, er identifisert.
-3. Det skal være klart hvem instanse-eierne er, det vil si hvilke roller og tilganger de har.
-
-### Tekniske forutsetninger
-
-1. Applikasjonene dine bruker versjon 8 eller nyere av Altinn-nugets.
-2. Organisasjonen har allerede en eksisterende Maskinporten-klient med riktige altinn-spesifikke
- scopes; `altinn:serviceowner/instances.read` og
- `altinn:serviceowner/instances.write`*
-3. En integrasjon mellom applikasjon(en) og klientene i Maskinporten. Dette må gjøres i applikasjonen(e)
- som skal sende forespørsler til en annen applikasjon, hvor forespørslene må autoriseres av applikasjonenseier.*
-
-Hvis trinn 2 og 3 av de tekniske kravene mangler, se
-seksjonen [Maskinporten-App Integrering](../../maskinporten-app-integration)
-
-\* _Hvis sluttbrukeren av applikasjon A har de nødvendige rollene for å instansiere applikasjon B på vegne av den
-tiltenkte
-mottakeren, kan du hoppe over disse tekniske kravene._
-
-{{}}
\ No newline at end of file
diff --git a/content/altinn-studio/reference/access-management/apps/_index.en.md b/content/altinn-studio/reference/access-management/apps/_index.en.md
index 4e6da4eefa2..a1b91499fe3 100644
--- a/content/altinn-studio/reference/access-management/apps/_index.en.md
+++ b/content/altinn-studio/reference/access-management/apps/_index.en.md
@@ -24,4 +24,4 @@ which is used to manage the secrets used by applications.
## Creating a ticket
-See [guide to requesting access to app logs and secrets](../../../guides/access-management/apps/).
+See [guide to requesting access to app logs and secrets](../../../guides/administration/access-management/apps/).
diff --git a/content/altinn-studio/reference/access-management/apps/_index.nb.md b/content/altinn-studio/reference/access-management/apps/_index.nb.md
index 4ae7dc0ff7b..a2d6663cbea 100644
--- a/content/altinn-studio/reference/access-management/apps/_index.nb.md
+++ b/content/altinn-studio/reference/access-management/apps/_index.nb.md
@@ -23,4 +23,4 @@ for å laste opp hemmeligheter som sertifikater, passord og api-nøkler.
## Bestilling
-Se [guide for å bestille tilganger](../../../guides/access-management/apps/).
+Se [guide for å bestille tilganger](../../../guides/administration/access-management/apps/).
diff --git a/content/altinn-studio/reference/configuration/eformidling/_index.en.md b/content/altinn-studio/reference/configuration/eformidling/_index.en.md
index 78057c8354b..9b28cef4351 100644
--- a/content/altinn-studio/reference/configuration/eformidling/_index.en.md
+++ b/content/altinn-studio/reference/configuration/eformidling/_index.en.md
@@ -9,7 +9,7 @@ weight: 400
{{%notice info%}}
Nuget versions >= 4.22.0 are required for your application to support eFormidling.
-[See how to update the nuget references of your application here](/altinn-studio/reference/maintainance/dependencies/).
+[See how to update the nuget references of your application here](/altinn-studio/guides/administration/maintainance/dependencies/).
{{% /notice%}}
{{%notice info%}}
diff --git a/content/altinn-studio/reference/configuration/eformidling/_index.nb.md b/content/altinn-studio/reference/configuration/eformidling/_index.nb.md
index 0469486853a..9ed316ae303 100644
--- a/content/altinn-studio/reference/configuration/eformidling/_index.nb.md
+++ b/content/altinn-studio/reference/configuration/eformidling/_index.nb.md
@@ -9,7 +9,7 @@ weight: 400
{{%notice info%}}
For at applikasjonen din skal kunne sende instansdata videre til eFormidling må den referere til nugetversjon >= 4.22.0.
-[Se hvordan du oppdaterer nugetreferanser for applikasjonen din her](/altinn-studio/reference/maintainance/dependencies/).
+[Se hvordan du oppdaterer nugetreferanser for applikasjonen din her](/altinn-studio/guides/administration/maintainance/dependencies/).
{{% /notice%}}
{{%notice info%}}
diff --git a/content/altinn-studio/reference/configuration/events/_index.en.md b/content/altinn-studio/reference/configuration/events/_index.en.md
index 553fd9efa8b..9bd7b5d4a03 100644
--- a/content/altinn-studio/reference/configuration/events/_index.en.md
+++ b/content/altinn-studio/reference/configuration/events/_index.en.md
@@ -9,7 +9,7 @@ weight: 400
{{%notice info%}}
To allow generating events for your application it must refer to nuget version >= 1.2.4.
-See how you update nuget references for your application [here](/altinn-studio/reference/maintainance/dependencies/).
+See how you update nuget references for your application [here](/altinn-studio/guides/administration/maintainance/dependencies/).
{{% /notice%}}
Generation and storing of events is not enabled by default in applications per 22.10.2020.
diff --git a/content/altinn-studio/reference/configuration/events/_index.nb.md b/content/altinn-studio/reference/configuration/events/_index.nb.md
index fef41b55ff6..a4218e8685b 100644
--- a/content/altinn-studio/reference/configuration/events/_index.nb.md
+++ b/content/altinn-studio/reference/configuration/events/_index.nb.md
@@ -9,7 +9,7 @@ weight: 400
{{%notice info%}}
For at applikasjonen din skal kunne generere events må den referere til nugetversjon >= 1.2.4.
-Se hvordan du oppdaterer nugetreferanser for applikasjonen din [her](/altinn-studio/reference/maintainance/dependencies/).
+Se hvordan du oppdaterer nugetreferanser for applikasjonen din [her](/altinn-studio/guides/administration/maintainance/dependencies/).
{{% /notice%}}
Generering og lagring av events er ikke enablet som default i applikasjonene per 22.10.2020.
diff --git a/content/altinn-studio/reference/configuration/filescan/_index.en.md b/content/altinn-studio/reference/configuration/filescan/_index.en.md
index f24ba59d888..0791c4e7e99 100644
--- a/content/altinn-studio/reference/configuration/filescan/_index.en.md
+++ b/content/altinn-studio/reference/configuration/filescan/_index.en.md
@@ -12,7 +12,7 @@ Enabling virus scan results in scan of the file immediately after it uploaded to
{{%notice info%}}
To allow generating events for your application it must refer to nuget version >= 7.4.0.
-See how you update nuget references for your application [here](/altinn-studio/reference/maintainance/dependencies/).
+See how you update nuget references for your application [here](/altinn-studio/guides/administration/maintainance/dependencies/).
{{% /notice%}}
Deep scan of files is not enabled by default, to activate this a manual step is required.
diff --git a/content/altinn-studio/reference/configuration/filescan/_index.nb.md b/content/altinn-studio/reference/configuration/filescan/_index.nb.md
index 07f42971fda..a04fd766773 100644
--- a/content/altinn-studio/reference/configuration/filescan/_index.nb.md
+++ b/content/altinn-studio/reference/configuration/filescan/_index.nb.md
@@ -10,7 +10,7 @@ Hver applikasjonseier sin storage er beskyttet av Windows Defender. Hvis din app
## Aktiver filskanning i applikasjonen din.
{{%notice info%}}
-For å tillate generering av hendelser for din applikasjon, må den henvise til nuget-versjon >= 7.4.0. Se hvordan du oppdaterer nuget-referanser for din applikasjon [her](/nb/altinn-studio/reference/maintainance/dependencies/).
+For å tillate generering av hendelser for din applikasjon, må den henvise til nuget-versjon >= 7.4.0. Se hvordan du oppdaterer nuget-referanser for din applikasjon [her](/nb/altinn-studio/guides/administration/maintainance/dependencies/).
{{% /notice%}}
Dyp skanning av filer er ikke aktivert som standard. For å aktivere dette, kreves en manuell handling. Hvis en fil skannes og blir funnet infisert før prosessen er fullført, vil dette forårsake en valideringsfeil.
diff --git a/content/altinn-studio/reference/configuration/messagebox/create_copy/_index.en.md b/content/altinn-studio/reference/configuration/messagebox/create_copy/_index.en.md
index ad213136e70..0beb16b6a39 100644
--- a/content/altinn-studio/reference/configuration/messagebox/create_copy/_index.en.md
+++ b/content/altinn-studio/reference/configuration/messagebox/create_copy/_index.en.md
@@ -10,7 +10,7 @@ The primary purpose of the create new copy feature is to make it easy for a user
{{%notice info%}}
The Create new copy functionality was introduced in version 7.9.0 of the nuget packages.
-[See how to update the nuget references of your application here](/altinn-studio/reference/maintainance/dependencies/).
+[See how to update the nuget references of your application here](/altinn-studio/guides/administration/maintainance/dependencies/).
{{% /notice%}}
## Configuration
@@ -66,4 +66,4 @@ applicationmetadata.json
```
## Programing interface
-During the copying of an instance the logic will perform a method call to **IInstantiationProcessor.DataCreation**. This makes it possible to perform programmatic changes to the data as it is being copied. [Programmatic prefill](/altinn-studio/guides/prefill/custom/).
+During the copying of an instance the logic will perform a method call to **IInstantiationProcessor.DataCreation**. This makes it possible to perform programmatic changes to the data as it is being copied. [Programmatic prefill](/altinn-studio/guides/development/prefill/custom/).
diff --git a/content/altinn-studio/reference/configuration/messagebox/create_copy/_index.nb.md b/content/altinn-studio/reference/configuration/messagebox/create_copy/_index.nb.md
index 88e9f0c2863..654e5c0a3b6 100644
--- a/content/altinn-studio/reference/configuration/messagebox/create_copy/_index.nb.md
+++ b/content/altinn-studio/reference/configuration/messagebox/create_copy/_index.nb.md
@@ -10,7 +10,7 @@ Hovedhensikten med **Lag ny kopi** funksjonaliteten er at det skal være enkelt
{{%notice info%}}
Lag ny kopi funksjonaliteten ble introdusert i versjon 7.9.0 av nuget pakkene.
-[Se hvordan du oppdaterer nugetreferanser for applikasjonen din her](/nb/altinn-studio/reference/maintainance/dependencies/).
+[Se hvordan du oppdaterer nugetreferanser for applikasjonen din her](/nb/altinn-studio/guides/administration/maintainance/dependencies/).
{{% /notice%}}
## Konfigurasjon
@@ -68,4 +68,4 @@ applicationmetadata.json
## Programatiske endringer
-Under kopiering av skjema vil logikken utføre metode kall mot **IInstantiationProcessor.DataCreation**. Dette skal gjøre det mulig å gjøre programatiske endringer i data som blir kopiert. [Programatisk prefill](/nb/altinn-studio/guides/prefill/custom/).
+Under kopiering av skjema vil logikken utføre metode kall mot **IInstantiationProcessor.DataCreation**. Dette skal gjøre det mulig å gjøre programatiske endringer i data som blir kopiert. [Programatisk prefill](/nb/altinn-studio/guides/development/prefill/custom/).
diff --git a/content/altinn-studio/reference/configuration/secrets/_index.en.md b/content/altinn-studio/reference/configuration/secrets/_index.en.md
index 3dca84c5bf2..d2c5d45b514 100644
--- a/content/altinn-studio/reference/configuration/secrets/_index.en.md
+++ b/content/altinn-studio/reference/configuration/secrets/_index.en.md
@@ -8,7 +8,7 @@ weight: 300
As an application developer you administer the secrets which the application use in the Azure Key Vault.
-[Routines for ordering access to your organizations resources are described here](/nb/altinn-studio/guides/access-management/apps/).
+[Routines for ordering access to your organizations resources are described here](/nb/altinn-studio/guides/administration/access-management/apps/).
## Configure support for secrets in your app
diff --git a/content/altinn-studio/reference/configuration/secrets/_index.nb.md b/content/altinn-studio/reference/configuration/secrets/_index.nb.md
index c3ca2108ccf..5c95b09cb75 100644
--- a/content/altinn-studio/reference/configuration/secrets/_index.nb.md
+++ b/content/altinn-studio/reference/configuration/secrets/_index.nb.md
@@ -9,7 +9,7 @@ tags: [translate-to-english]
Som applikasjonsutvikler administrerer man selv hemmelighetene som applikasjonen benytter i Azure Key Vault.
-[Rutiner for bestilling av tilgang til din organisasjons ressurser er beskrevet her](/altinn-studio/guides/access-management/apps/).
+[Rutiner for bestilling av tilgang til din organisasjons ressurser er beskrevet her](/altinn-studio/guides/administration/access-management/apps/).
## Konfigurer støtte for hemmeligheter i din app
diff --git a/content/altinn-studio/reference/configuration/stateless/_index.en.md b/content/altinn-studio/reference/configuration/stateless/_index.en.md
index 8b1b215daac..67095a3f7f3 100644
--- a/content/altinn-studio/reference/configuration/stateless/_index.en.md
+++ b/content/altinn-studio/reference/configuration/stateless/_index.en.md
@@ -22,7 +22,7 @@ Stateless applications work well as access services where an end-user or a syste
This is brand new functionality. Setup has to be completed manually until further notice.
-**Notice:** To make use of this functionality, version >= 4.5.2 of the [nuget-packages](../../maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` and `Altinn.App.Api` is required.
+**Notice:** To make use of this functionality, version >= 4.5.2 of the [nuget-packages](../../../guides/administration/maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` and `Altinn.App.Api` is required.
{{% /notice %}}
@@ -129,7 +129,7 @@ The App frontend will read the configuration from `applicationmetadata.json` and
{{% notice warning %}}
Note! Form components that affect process (Button for submission or instantiation) are not supported for anonymous users!
-**Note:** To make use of this functionality you must use version >= 5.1.0 of the [nuget-packages](../../maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` and `Altinn.App.Api`.
+**Note:** To make use of this functionality you must use version >= 5.1.0 of the [nuget-packages](../../../guides/administration/maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` and `Altinn.App.Api`.
{{% /notice %}}
@@ -470,7 +470,7 @@ The other check calls `_finanstilsynet.HasReqiuiredLicence()`, a method which lo
This is brand new functionality. Setup must be completed manually until further notice and will not be supported in Altinn Studio.
-**Note:** To make use of this functionality you must use version >= 4.17.2 of the [nuget-packages](../../maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` og `Altinn.App.Api`.
+**Note:** To make use of this functionality you must use version >= 4.17.2 of the [nuget-packages](../../../guides/administration/maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` og `Altinn.App.Api`.
{{%/notice%}}
diff --git a/content/altinn-studio/reference/configuration/stateless/_index.nb.md b/content/altinn-studio/reference/configuration/stateless/_index.nb.md
index 69f9d153406..a211efeca66 100644
--- a/content/altinn-studio/reference/configuration/stateless/_index.nb.md
+++ b/content/altinn-studio/reference/configuration/stateless/_index.nb.md
@@ -21,7 +21,7 @@ hverken skjemadata eller metadata om instanser av applikasjonen. Applikasjonen v
Dette er helt ny funksjonalitet. Oppsett må gjøres manuelt inntil videre.
-**MERK:** for å benytte denne funksjonaliteten må man versjon >= 4.5.2 av [nuget-pakkene](../../maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` og `Altinn.App.Api`.
+**MERK:** for å benytte denne funksjonaliteten må man versjon >= 4.5.2 av [nuget-pakkene](../../../guides/administration/maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` og `Altinn.App.Api`.
{{% /notice %}}
@@ -129,7 +129,7 @@ Appens frontend vil lese konfigurasjonen fra `applicationmetadata.json` og forst
{{%notice warning%}}
OBS! Skjemakomponenter som påvirker prosess (knapp for innsending eller instansiering) er ikke støttet for anonyme brukere!
-**MERK:** for å benytte denne funksjonaliteten må man bruke versjon >= 5.1.0 av [nuget-pakkene](../../maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` og `Altinn.App.Api`.
+**MERK:** for å benytte denne funksjonaliteten må man bruke versjon >= 5.1.0 av [nuget-pakkene](../../../guides/administration/maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` og `Altinn.App.Api`.
{{%/notice%}}
@@ -469,7 +469,7 @@ Videre i eksempelet vil betegnelsen *bruker* være synonymt med en virksomhet re
Dette er helt ny funksjonalitet. Oppsett må gjøres manuelt inntil videre og vil ikke være støttet i Altinn Studio.
-**MERK:** for å benytte denne funksjonaliteten må man versjon >= 4.17.2 av [nuget-pakkene](../../maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` og `Altinn.App.Api`.
+**MERK:** for å benytte denne funksjonaliteten må man versjon >= 4.17.2 av [nuget-pakkene](../../../guides/administration/maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` og `Altinn.App.Api`.
{{%/notice%}}
diff --git a/content/altinn-studio/reference/data/data-modeling/_index.en.md b/content/altinn-studio/reference/data/data-modeling/_index.en.md
index 5bbe381542e..d38c937dd3c 100644
--- a/content/altinn-studio/reference/data/data-modeling/_index.en.md
+++ b/content/altinn-studio/reference/data/data-modeling/_index.en.md
@@ -60,7 +60,7 @@ If you only need to upload XSD files for storage and do not intend to use the to
[1]: https://altinn.studio/repos
[2]: /altinn-studio/getting-started/create-user/
-[3]: /altinn-studio/guides/access-management/studio/
+[3]: /altinn-studio/guides/administration/access-management/studio/
## Altinn Studio Data Modeling
@@ -74,8 +74,8 @@ Altinn Studio Data Modeling is a tool for developing [data models](#data-models)
{{% expandlarge id="links" header="Useful links" %}}
* [Known issues and shortcomings for Altinn Studio Datamodellering](https://github.com/orgs/Altinn/projects/1/views/10)
* [Planned new functionality for Altinn Studio Datamodellering](https://github.com/orgs/Altinn/projects/1/views/6)
-* [Development of data model for Altinn 2](/altinn-studio/guides/altinn-2-datamodel/)
-* [Migrating from Seres to Altinn Studio Datamodellering](/altinn-studio/guides/seres-migration/)
+* [Development of data model for Altinn 2](/altinn-studio/guides/altinn-2/altinn-2-datamodel/)
+* [Migrating from Seres to Altinn Studio Datamodellering](/altinn-studio/guides/altinn-2/seres-migration/)
{{% /expandlarge %}}
### Navigating to Altinn Studio Data Modeling
@@ -242,6 +242,6 @@ A generated XSD file can be downloaded by accessing the repository: click on the
![Download XSD repo](./download-xsd.png "Download XSD from repo")
-[1]: /altinn-studio/guides/altinn-2-datamodel/#dataformatid-og-dataformatversion
-[2]: /altinn-studio/guides/altinn-2-datamodel/#xsd-attributter
-[3]: /altinn-studio/guides/altinn-2-datamodel/#xsd-namespaces
+[1]: /altinn-studio/guides/altinn-2/altinn-2-datamodel/#dataformatid-og-dataformatversion
+[2]: /altinn-studio/guides/altinn-2/altinn-2-datamodel/#xsd-attributter
+[3]: /altinn-studio/guides/altinn-2/altinn-2-datamodel/#xsd-namespaces
diff --git a/content/altinn-studio/reference/data/data-modeling/_index.nb.md b/content/altinn-studio/reference/data/data-modeling/_index.nb.md
index 5f2b26107c2..48deef48197 100644
--- a/content/altinn-studio/reference/data/data-modeling/_index.nb.md
+++ b/content/altinn-studio/reference/data/data-modeling/_index.nb.md
@@ -61,7 +61,7 @@ for å bekrefte.
[1]: https://altinn.studio/repos
[2]: /nb/altinn-studio/getting-started/create-user/
-[3]: /nb/altinn-studio/guides/access-management/studio/
+[3]: /nb/altinn-studio/guides/administration/access-management/studio/
## Altinn Studio Datamodellering
@@ -75,8 +75,8 @@ format og kan ut fra dette generere XSD- og C#-modeller (se [Datamodeller for Ap
{{% expandlarge id="links" header="Nyttige lenker" %}}
* [Registrerte feil og mangler for Altinn Studio Datamodellering](https://github.com/orgs/Altinn/projects/1/views/10)
* [Planlagt ny funksjonalitet for Altinn Studio Datamodellering](https://github.com/orgs/Altinn/projects/1/views/6)
-* [Utvikling av datamodell for Altinn 2](/nb/altinn-studio/guides/altinn-2-datamodel/)
-* [Overgang fra Seres til Altinn Studio Datamodellering](/nb/altinn-studio/guides/seres-migration/)
+* [Utvikling av datamodell for Altinn 2](/nb/altinn-studio/guides/altinn-2/altinn-2-datamodel/)
+* [Overgang fra Seres til Altinn Studio Datamodellering](/nb/altinn-studio/guides/altinn-2/seres-migration/)
{{% /expandlarge %}}
### Navigere til Altinn Studio Datamodellering
@@ -242,6 +242,6 @@ En generert XSD fil kan lastes ned ved å gå til repoet: klikk på person-ikone
![Last ned XSD fra repo](./download-xsd.png "Last ned XSD fra repo")
-[1]: /nb/altinn-studio/guides/altinn-2-datamodel/#dataformatid-og-dataformatversion
-[2]: /nb/altinn-studio/guides/altinn-2-datamodel/altinn-2-datamodel/#xsd-attributter
-[3]: /nb/altinn-studio/guides/altinn-2-datamodel/#xsd-namespaces
+[1]: /nb/altinn-studio/guides/altinn-2/altinn-2-datamodel/#dataformatid-og-dataformatversion
+[2]: /nb/altinn-studio/guides/altinn-2/altinn-2-datamodel/altinn-2-datamodel/#xsd-attributter
+[3]: /nb/altinn-studio/guides/altinn-2/altinn-2-datamodel/#xsd-namespaces
diff --git a/content/altinn-studio/reference/data/prefill/_index.en.md b/content/altinn-studio/reference/data/prefill/_index.en.md
index f187e2f0597..659bc0a5ee1 100644
--- a/content/altinn-studio/reference/data/prefill/_index.en.md
+++ b/content/altinn-studio/reference/data/prefill/_index.en.md
@@ -5,7 +5,7 @@ description: Reference of available fields when using prefill configuration file
weight: 10
---
Read more about prefill [here](../../../concepts/prefill/), and see the guide for how to set it up in your app
-[here](../../../guides/prefill/config/).
+[here](../../../guides/development/prefill/config/).
## Fields in the _prefill.json_ file
@@ -84,7 +84,7 @@ Kari Nordmann, the data retrieved from here would belong to Ola. For the objects
you will find the same fields that are included in ER and DSF-prefill. Note that Party.Organization will be null if the
user is logged in as an individual, and the equivalent if they are logged in with a business user. The prefill will fail
if the object you prefill from does not exist, so if you wish to dynamically prefill based on these values it has to be
-setup as [custom prefill.](../../../guides/prefill/custom/).
+setup as [custom prefill.](../../../guides/development/prefill/custom/).
Available values for prefill includes:
- UserId
diff --git a/content/altinn-studio/reference/data/prefill/_index.nb.md b/content/altinn-studio/reference/data/prefill/_index.nb.md
index cf6bde69c6d..2b764562d0c 100644
--- a/content/altinn-studio/reference/data/prefill/_index.nb.md
+++ b/content/altinn-studio/reference/data/prefill/_index.nb.md
@@ -5,7 +5,7 @@ description: Oversikt over tilgjengelige felter for forhåndsutfylling med konfi
weight: 10
---
Les mer om forhåndsutfylling [her](../../../concepts/prefill/), og se veiledning for hvordan det settes opp
-[her](../../../guides/prefill/config/).
+[her](../../../guides/development/prefill/config/).
## Felter i _prefill.json_-filen
@@ -84,7 +84,7 @@ vil data som hentes ut herfra være knyttet til Ola. For objektene Party.Organiz
samme feltene som man ser i ER og DSF-prefill. Merk at Party.Organization vil være null om brukeren er logget inn som en
privatperson, og tilsvarende for Party.Person om man er logget inn med en virksomhetsbruker. Preutfyllingen vil feile
om objektet man preutfyller fra ikke finnes. Om man ønsker å dynamisk preutfylle basert på disse verdiene må dette settes
-opp som [egendefinert prefill](../../../guides/prefill/custom/).
+opp som [egendefinert prefill](../../../guides/development/prefill/custom/).
Tilgjengelige verdier for prefill inkluderer:
- UserId
diff --git a/content/altinn-studio/reference/deployment/_index.nb.md b/content/altinn-studio/reference/deployment/_index.nb.md
index 7c86f84187e..677cccb9e2a 100644
--- a/content/altinn-studio/reference/deployment/_index.nb.md
+++ b/content/altinn-studio/reference/deployment/_index.nb.md
@@ -21,7 +21,7 @@ Denne rutinen trenger bare å følges en gang. Når clusteret er satt opp, er l
Produksjonssetting av applikasjonen gjøres på [samme måte som for testmiljøer](/nb/altinn-studio/reference/testing/deploy).
Den som skal produksjonssette app'en må være medlem av gruppen `Deploy-Production` for sin organisasjon i Altinn Studio.
Tilgang til grupper i Altinn Studio administreres av hver enkelt organisasjon i Altinn Studio.
-[Les mer om tilganger i Altinn Studio](/nb/altinn-studio/guides/access-management/studio/).
+[Les mer om tilganger i Altinn Studio](/nb/altinn-studio/guides/administration/access-management/studio/).
## Bestille Om skjema-side
diff --git a/content/altinn-studio/reference/logic/expressions/_index.en.md b/content/altinn-studio/reference/logic/expressions/_index.en.md
index 8d5f2cfded7..786daa74815 100644
--- a/content/altinn-studio/reference/logic/expressions/_index.en.md
+++ b/content/altinn-studio/reference/logic/expressions/_index.en.md
@@ -25,7 +25,7 @@ These expressions are available in all Altinn 3 apps that use frontend version
[3.54.0](https://github.com/Altinn/app-frontend-react/releases/tag/v3.54.0) or later. By using this version or the
latest major version, you can use dynamic expressions for [several use cases](#use-cases).
-Starting from version `7.2.0` of the [nuget packages](../../maintainance/dependencies#nuget) the expressions are also
+Starting from version `7.2.0` of the [nuget packages](../../../guides/administration/maintainance/dependencies#nuget) the expressions are also
supported in the backend. This means that the server will be able to evaluate the expressions and remove data upon
submission that is potentially stored in the [data model](../../data/data-model) /*9+and is associated with
fields/components that are later hidden. Note that this only applies to data in the data model that is associated with
@@ -36,7 +36,7 @@ It also makes it possible to omit submitting data that is otherwise associated w
fields are hidden in the form using dynamic expressions. This also applies when submitting directly from the API.
**Note:** Note that automatic removal of hidden data must currently be manually activated (opt-in) by adding the following
-line to `App/appsettings.json` after upgrading the [nuget packages](../../maintainance/dependencies#nuget)
+line to `App/appsettings.json` after upgrading the [nuget packages](../../../guides/administration/maintainance/dependencies#nuget)
to `7.2.0` or later:
{{}}
diff --git a/content/altinn-studio/reference/logic/expressions/_index.nb.md b/content/altinn-studio/reference/logic/expressions/_index.nb.md
index 9f8646fac5c..58442a76a6e 100644
--- a/content/altinn-studio/reference/logic/expressions/_index.nb.md
+++ b/content/altinn-studio/reference/logic/expressions/_index.nb.md
@@ -25,7 +25,7 @@ Uttrykkene er tilgjengelige i alle Altinn 3-apper som bruker frontend-versjon
[3.54.0](https://github.com/Altinn/app-frontend-react/releases/tag/v3.54.0) eller nyere. Bruker man denne versjonen
(eller siste hovedversjon) har man mulighet til å benytte dynamiske uttrykk til [flere bruksområder](#bruksområder).
-Fra versjon `7.2.0` av [nuget-pakkene](../../maintainance/dependencies#nuget) er også uttrykkene støttet i backend.
+Fra versjon `7.2.0` av [nuget-pakkene](../../../guides/administration/maintainance/dependencies/#nuget) er også uttrykkene støttet i backend.
Det gjør at serveren vil kunne evaluere uttrykkene og fjerne data ved innsending som potensielt er lagret
i [datamodellen](../../data/data-model) og er knyttet til felter/komponenter som i ettertid er skjult.
Merk at dette bare gjelder data i datamodellen som er knyttet til skjulte komponenter - data i datamodellen som ikke
@@ -35,7 +35,7 @@ Det gjør det også mulig å unnlate å sende inn data som ellers er tilknyttet
feltene er skjult i skjemaet ved hjelp av dynamiske uttrykk. Dette gjelder også ved innsending direkte fra API.
**NB:** Automatisk fjerning av skjult data må foreløpig aktiveres manuelt (_opt-in_) ved at man legger til følgende
-linje i `App/appsettings.json` etter at man har oppgradert [nuget-pakkene](../../maintainance/dependencies#nuget)
+linje i `App/appsettings.json` etter at man har oppgradert [nuget-pakkene](../../../guides/administration/maintainance/dependencies#nuget)
til `7.2.0` eller nyere:
{{}}
diff --git a/content/altinn-studio/reference/logic/instantiation/_index.en.md b/content/altinn-studio/reference/logic/instantiation/_index.en.md
index 7f2e136229b..533ce8e919d 100644
--- a/content/altinn-studio/reference/logic/instantiation/_index.en.md
+++ b/content/altinn-studio/reference/logic/instantiation/_index.en.md
@@ -9,7 +9,7 @@ toc: true
Application logic connected to instantiation can be defined by implementing an interface and registrering them in `Program.cs`
- `IInstantiationValidator` - create your own tests for determining whether a user/submitter is allowed to instantiate.
- - `IInstantiationProcessor` - create customized prefill data, this is described in the [prefill chapter](/altinn-studio/guides/prefill/custom/).
+ - `IInstantiationProcessor` - create customized prefill data, this is described in the [prefill chapter](/altinn-studio/guides/development/prefill/custom/).
## Custom validation rules for instantiation
Validation rules for instantiation can include validating a time to specific user instructions and complex tests that
diff --git a/content/altinn-studio/reference/logic/instantiation/_index.nb.md b/content/altinn-studio/reference/logic/instantiation/_index.nb.md
index bfd6a601942..4bc43f23f1a 100644
--- a/content/altinn-studio/reference/logic/instantiation/_index.nb.md
+++ b/content/altinn-studio/reference/logic/instantiation/_index.nb.md
@@ -9,7 +9,7 @@ toc: true
Applikasjonslogikk knyttet til instansiering kan defineres ved å implmentere interfaces og registrere dem i `Program.cs`
- `IInstantiationValidator` - lag egne sjekker for å avgjøre om en bruker/avgiver får lov til å instansiere.
- - `IInstantiationProcessor` - lag tilpasset prefill data, dette er beskrevet i [prefill kapitlet](/nb/altinn-studio/guides/prefill/custom/).
+ - `IInstantiationProcessor` - lag tilpasset prefill data, dette er beskrevet i [prefill kapitlet](/nb/altinn-studio/guides/development/prefill/custom/).
## Egendefinerte valideringsregler for instansiering
Valideringsregler for instansiering kan innebære å validere tidspunkt til spesifikke brukerrestriksjoner og komplekse sjekker som krever eksterne API-kall.
diff --git a/content/altinn-studio/reference/maintainance/_index.nb.md b/content/altinn-studio/reference/maintainance/_index.nb.md
deleted file mode 100644
index d728b7700ba..00000000000
--- a/content/altinn-studio/reference/maintainance/_index.nb.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-title: Vedlikehold av app i produksjon
-linktitle: Vedlikehold
-description: Applikasjoner i produksjon krever jevnlig vedlikehold og oppdateringer.
-weight: 120
----
-
-Når applikasjonen er satt i produksjon, vil det oppstå behov for å vedlikeholde applikasjonen.
-Den vanligste vedlikeholdstypen vil være å [oppdatere avhengigheter](./dependencies).
-
-For å gjøre en ny versjon av applikasjonen tilgjengelig, produksjonssetter man den på samme måte som vanlig.
-
-Instanser av appen i brukers innboks vil automatisk oppdateres til å bruke siste versjon av applikasjonen,
-så det er viktig at man ikke innfører endringer som knekker eksisterende instanser.
-
-{{}}
\ No newline at end of file
diff --git a/content/altinn-studio/reference/monitoring/_index.en.md b/content/altinn-studio/reference/monitoring/_index.en.md
index 4f0d1d38f85..17a4dde037d 100644
--- a/content/altinn-studio/reference/monitoring/_index.en.md
+++ b/content/altinn-studio/reference/monitoring/_index.en.md
@@ -17,7 +17,7 @@ Setting up custom rules and alerts is currently not available to application own
but we are aiming to support this during the autumn of 2024.
{{% /notice %}}
-To get started with monitoring in you app, see [instrumentation and monitoring user guide](/altinn-studio/guides/monitor-and-instrument/).
+To get started with monitoring in you app, see [instrumentation and monitoring user guide](/altinn-studio/guides/administration/monitor-and-instrument/).
This documentation contains information needed to support app developers and service owners in
operating, monitoring/observing and instrumenting applications on the Altinn 3 platform.
diff --git a/content/altinn-studio/reference/monitoring/_index.nb.md b/content/altinn-studio/reference/monitoring/_index.nb.md
index f9a5281d928..6c9d0d09c22 100644
--- a/content/altinn-studio/reference/monitoring/_index.nb.md
+++ b/content/altinn-studio/reference/monitoring/_index.nb.md
@@ -17,7 +17,7 @@ Konfigurering av egendefinerte regler og varsler er for øyeblikket ikke tilgjen
men vi har som mål å støtte dette i løpet av høsten 2024.
{{% /notice %}}
-Se [brukerveiledning for instrumentering og monitorering](/nb/altinn-studio/guides/monitor-and-instrument/) for å komme i gang i din app.
+Se [brukerveiledning for instrumentering og monitorering](/nb/altinn-studio/guides/administration/monitor-and-instrument/) for å komme i gang i din app.
Denne dokumentasjonen inneholder nødvendig informasjon for å støtte apputviklere og tjenesteeiere i å
drifte, overvåke/observere og instrumentere applikasjoner på Altinn 3 plattformen.
diff --git a/content/altinn-studio/reference/monitoring/visualisation/_index.en.md b/content/altinn-studio/reference/monitoring/visualisation/_index.en.md
index f492643cb03..38b49dd9aeb 100644
--- a/content/altinn-studio/reference/monitoring/visualisation/_index.en.md
+++ b/content/altinn-studio/reference/monitoring/visualisation/_index.en.md
@@ -32,7 +32,7 @@ user experience.
- **Test Developer or Production Developer role in Azure.**
Test Developer role grants access to AI for apps in TT02 and Production Developer role grants access to apps in production.
- [Instructions on how to request access is available here](/altinn-studio/guides/access-management/apps/)
+ [Instructions on how to request access is available here](/altinn-studio/guides/administration/access-management/apps/)
- **General overview of AI features**
AI has a number of features available.
diff --git a/content/altinn-studio/reference/monitoring/visualisation/_index.nb.md b/content/altinn-studio/reference/monitoring/visualisation/_index.nb.md
index cd75b3a600d..a3865c64b91 100644
--- a/content/altinn-studio/reference/monitoring/visualisation/_index.nb.md
+++ b/content/altinn-studio/reference/monitoring/visualisation/_index.nb.md
@@ -32,7 +32,7 @@ brukeropplevelsen til en sluttbruker. Feilsøking og varsling* gjør AI til en v
Test Developer-rollen gir tilgang til AI for apper i TT02 og Production Developer-rollen gir tilgang
til apper i produksjon.
- [Instrukser på hvordan be om rollen er tilgjengelig her](/nb/altinn-studio/guides/access-management/apps/)
+ [Instrukser på hvordan be om rollen er tilgjengelig her](/nb/altinn-studio/guides/administration/access-management/apps/)
- **Generell oversikt over AI features**
AI har flere funksjoner tilgjengelig.
diff --git a/content/altinn-studio/reference/subform/_index.en.md b/content/altinn-studio/reference/subform/_index.en.md
index 470880bc95a..08c571a0fc0 100644
--- a/content/altinn-studio/reference/subform/_index.en.md
+++ b/content/altinn-studio/reference/subform/_index.en.md
@@ -11,7 +11,7 @@ This documentation is a work in progess. Subforms are currently in preview-relea
Subforms are contained in a subform table. Let us go through configuring a subform table and the subform contained within.
-1. [Create a data model](../../../app/development/data/data-modeling) for the subform.
+1. [Create a data model](../data/data-modeling) for the subform.
2. You should now see the three files under `App/model`. The c# class, the json schema and the xsd.
3. Set [appLogic.allowInSubform](../../../api/models/app-metadata/#applicationlogic) to **true** in **applicationMetadata.json**.
4. Create a folder under **App/ui** with your desired subform name.
@@ -20,7 +20,7 @@ Subforms are contained in a subform table. Let us go through configuring a subfo
{{< notice warning >}}
Subforms do not support attachments, and nesting subforms is not allowed (subform in subform).
{{< /notice >}}
-7. The button which closes the subform must be a [CustomButton](../../reference/ux/components/custombutton) with a `closeSubform` action. Optionally you can also trigger validation before exiting.
+7. The button which closes the subform must be a [CustomButton](../ux/components/custombutton) with a `closeSubform` action. Optionally you can also trigger validation before exiting.
```json
{
"id": "subform-exitbutton",
@@ -41,7 +41,7 @@ Subforms are contained in a subform table. Let us go through configuring a subfo
]
}
```
-8. The **Settings.json** file for the sub form is [configured as normal](../../../app/development/ux/pages/#settings).
+8. The **Settings.json** file for the sub form is [configured as normal](../ux/pages/#settings).
9. Add a layout set to `layout-sets.json` with the data type of the data model from step 1. The **type** is **subform**. Choose your subform folder name as the id.
```json
{
@@ -51,7 +51,7 @@ Subforms are contained in a subform table. Let us go through configuring a subfo
}
```
10. Navigate to the layout for the page in the main form in which you want to add the sub form table.
-11. Add `Subform` with the [configuration you want](../../reference/subform/config-options/). Example:
+11. Add `Subform` with the [configuration you want](./config-options/). Example:
```json
{
"id": "subform-test",
diff --git a/content/altinn-studio/reference/subform/_index.nb.md b/content/altinn-studio/reference/subform/_index.nb.md
index a879bebe671..b07890b9926 100644
--- a/content/altinn-studio/reference/subform/_index.nb.md
+++ b/content/altinn-studio/reference/subform/_index.nb.md
@@ -11,7 +11,7 @@ Dette dokumentet er under utvikling. Underskjema er kun i preview-release.
Underskjemaer tilhører en underskjematabell. La oss gå gjennom opprettelse av en underskjematabell med tilhørende underskjema.
-1. [Opprett en datamodell](../../../app/development/data/data-modeling) for underskjemaet.
+1. [Opprett en datamodell](../data/data-modeling) for underskjemaet.
2. Du skal nå se tre filer under `App/model`. Klassen i c#, json schema og xsd.
3. Sett [appLogic.allowInSubform](../../../api/models/app-metadata/#applicationlogic) til **true** i **applicationMetadata.json**.
4. Opprett en mappe under **App/ui** med ditt ønskede underskjemanavn.
@@ -20,8 +20,8 @@ Underskjemaer tilhører en underskjematabell. La oss gå gjennom opprettelse av
{{< notice warning >}}
Underskjema støtter ikke vedlegg, og nøsting av underskjema er ikke tillatt (underskjema i underskjema).
{{< /notice >}}
-7. **Settings.json** filen for underskjema [konfigureres som normalt](../../../app/development/ux/pages/#innstillinger).
-8. Knappen som brukes for å lukke underskjema må være en [CustomButton](../../reference/ux/components/custombutton) med `closeSubform` action. Det er valgfritt å validere underskjema før det lukkes.
+7. **Settings.json** filen for underskjema [konfigureres som normalt](../ux/pages/#innstillinger).
+8. Knappen som brukes for å lukke underskjema må være en [CustomButton](../ux/components/custombutton) med `closeSubform` action. Det er valgfritt å validere underskjema før det lukkes.
```json
{
"id": "subform-exitbutton",
@@ -51,7 +51,7 @@ Underskjemaer tilhører en underskjematabell. La oss gå gjennom opprettelse av
},
```
10. Naviger til layout for siden i hovedskjemaet der du ønsker å legge inn underskjematabellen.
-11. Legg til `Subform` med [ønsket konfigurasjon](../../reference/subform/config-options/). Eksempel:
+11. Legg til `Subform` med [ønsket konfigurasjon](./config-options/). Eksempel:
```json
{
"id": "subform-test",
diff --git a/content/altinn-studio/reference/ux/pages/layout-sets/_index.en.md b/content/altinn-studio/reference/ux/pages/layout-sets/_index.en.md
index 8258dd7270c..3a043186d0f 100644
--- a/content/altinn-studio/reference/ux/pages/layout-sets/_index.en.md
+++ b/content/altinn-studio/reference/ux/pages/layout-sets/_index.en.md
@@ -13,7 +13,7 @@ This is new functionality. Setup must be done manually as of today. Support for
To get functionality for multiple forms in a service, the nuget-version of the packets the app uses **must** be upgraded
to version `3.1.4` _or newer_.
-See instructions on how that is done [here](../../../maintainance/dependencies).
+See instructions on how that is done [here](../../../../guides/administration/maintainance/dependencies).
A key to the solution is that there are multiple layout-sets that consists of one or more pages and configurations. Each
layout-set consists of the same files as a form service.
diff --git a/content/altinn-studio/reference/ux/pages/layout-sets/_index.nb.md b/content/altinn-studio/reference/ux/pages/layout-sets/_index.nb.md
index 27deb2c6e20..fe83bd68732 100644
--- a/content/altinn-studio/reference/ux/pages/layout-sets/_index.nb.md
+++ b/content/altinn-studio/reference/ux/pages/layout-sets/_index.nb.md
@@ -13,7 +13,7 @@ Dette er helt ny funksjonalitet. Oppsett må gjøres manuelt inntil videre. Stø
## Oppsett
For å få funksjonalitet for flere skjema i tjeneste, **må** nuget-versjon til pakkene app'en bruker oppgraderes til versjon `3.1.4` _eller nyere_.
-Se instrukser for hvordan det gjøres [her](../../../maintainance/dependencies).
+Se instrukser for hvordan det gjøres [her](../../../../guides/administration/maintainance/dependencies).
Sentralt i løsningen er at man har flere layout-sets som består av en eller flere sider og configurasjon. Hvert layout-set består av tilsvarende filer som en skjema tjenester.
diff --git a/content/app/_index.en.md b/content/app/_index.en.md
deleted file mode 100644
index f031f2770ed..00000000000
--- a/content/app/_index.en.md
+++ /dev/null
@@ -1,66 +0,0 @@
----
-title: Create apps
-linktitle: Create apps
-description: Altinn Studio is our new tool for developing digital services, aka apps. These can be anything from simple forms to very advanced applications.
-weight: 10
-toc: true
----
-
-
-{{% panel %}}
-**Who can use Altinn Studio?**
-Anyone can log into [altinn.studio](https://altinn.studio) and check out the possibilities!
-You have to be a [service owner](https://www.altinndigital.no/kom-i-gang/) in Altinn and
-[accept the conditions for Altinn in public cloud](https://digdir.apps.altinn.no/digdir/godkjenn-bruksvilkaar/) to be able to deploy apps to the production environment.
-{{% /panel %}}
-
-If you have questions or feedback, then you can contact us on [Slack](https://altinnstudio.slack.com)
-or [GitHub](https://github.com/Altinn/altinn-studio/issues/new/choose), or just keep on reading this documentation.
-
----
-
-## Get started
-
-Follow these steps to start developing apps in Altinn Studio.
-1. [Create user](/app/getting-started/create-user)
-2. [Learn to navigate Altinn Studio](/app/getting-started/navigation)
-3. [Create an application in Altinn Studio](/app/getting-started/create-app)
-4. [Get to know Altinn Studio Designer](/app/getting-started)
-5. [Prepare for local development](/app/getting-started/local-dev)
-
-[![Go to intro course](introcourse_en.png "Go to intro course")](/app/app-dev-course/)
-
----
-
-## App development
-Create and edit apps in Altinn Studio.
-
-| | | | | |
-|---|---|---|---|---|
-| [Data](/app/development/data) | [User interface](/app/development/ux) | [Configuration](/app/development/configuration) | [Logic](/app/development/logic) | [API](/app/development/api) |
-
----
-
-## Guides
-How to perform specific tasks related to app development in Altinn Studio.
-
-| | | | | |
-|---|---|---|---|---|
-| [Design](/app/guides/design) | [Testing](/app/testing) | [Copy app](/app/guides/copy-app) | [Access management](/altinn-studio/guides/access-management) | [Migrate from Altinn 2](/app/guides/migrate-services) |
-
-## App examples
-Draw inspiration from applications developed by Digdir or external organizations.
-
-### [Digdir](/app/launched-apps/digdir)
-Documentation for applications developed by Digitaliseringsdirektoratet.
-
-### [External](/app/launched-apps/external)
-Applications created by external organizations.
-
----
-
-## Next steps
-
-- [Deployment](/app/deployment/)
-- [Monitoring](/app/monitoring/)
-- [Maintenance](/app/maintainance/)
\ No newline at end of file
diff --git a/content/app/_index.nb.md b/content/app/_index.nb.md
deleted file mode 100644
index 73769f0554d..00000000000
--- a/content/app/_index.nb.md
+++ /dev/null
@@ -1,118 +0,0 @@
----
-title: Lage apper
-description: Altinn Studio er vårt nye verktøy for å utvikle digitale tjenester (apps). Dette kan være alt fra helt enkle skjema til veldig avanserte applikasjoner.
-weight: 10
----
-
-
-{{% panel %}}
-**Hvem kan ta i bruk Altinn Studio?**
-Alle kan logge inn i [altinn.studio](https://altinn.studio) og teste ut mulighetene!
-Du må være [tjenesteeier](https://www.altinndigital.no/kom-i-gang/) i Altinn samt
-[godta bruksvilkår for Altinn i skyen](https://digdir.apps.altinn.no/digdir/godkjenn-bruksvilkaar/) for å kunne produksjonssette apper.
-{{% /panel %}}
-
-Hvis du lurer på noe så er det bare å ta kontakt med oss på [Slack](https://altinnstudio.slack.com)
-eller [GitHub](https://github.com/Altinn/altinn-studio/issues/new/choose), eller lese denne dokumentasjonen.
-
----
-## Kom i gang
-
-Følg disse grunnleggende stegene for å komme i gang med utvikling av applikasjoner i Altinn Studio.
-1. [Opprett bruker](/nb/app/getting-started/create-user)
-2. [Lær å navigere Altinn Studio](/nb/app/getting-started/navigation)
-3. [Opprett applikasjon i Altinn Studio](/nb/app/getting-started/create-app)
-4. [Gjør deg kjent med Altinn Studio Designer](/nb/app/getting-started)
-5. [Klargjør for lokal utvikling](/nb/app/getting-started/local-dev)
-
-[![Gå til introkurs](introcourse.png "Gå til introkurs")](/nb/app/app-dev-course/)
-
-### [Retningslinjer for design](/nb/app/guides/design/guidelines)
-
-
----
-
-## [Apputvikling](/nb/app/development)
-Opprett og rediger applikasjoner i Altinn Studio.
-
-### [Data](/nb/app/development/data)
-
-| | | | |
-|---|---|---|---|
-| [Datamodell](/nb/app/development/data/data-model) | [Forhåndsutfylling](/nb/app/development/data/prefill) | [Flervalg (kodelister)](/nb/app/development/data/options) | [Vedlegg](/nb/app/development/data/attachments) |
-
-### [Brukergrensesnitt](/nb/app/development/ux)
-
-| | | | | | | |
-|---|---|---|---|---|---|---|
-| [Komponenter](/nb/app/development/ux/components) | [Sider](/nb/app/development/ux/pages) | [Felter](/nb/app/development/ux/fields) | [Bunntekst](/nb/app/development/ux/footer) | [Styling](/nb/app/development/ux/styling) | [Tekster](/nb/app/development/ux/texts) | [PDF](/nb/app/development/ux/pdf) |
-
-### [Logikk](/nb/app/development/logic)
-
-| | | | | |
-|---|---|---|---|---|
-| [App Events](/nb/app/development/logic/events) | [Generelt](/nb/app/development/logic/generic) | [Tjenester](/nb/app/development/logic/services) | [Dataprosessering](/nb/app/development/logic/dataprocessing) | [Dynamikk](/nb/app/development/logic/dynamic) |
-| [Instansiering](/nb/app/development/logic/instantiation) | [Uttrykk](/nb/app/development/logic/expressions) | [Validering](/nb/app/development/logic/validation) |
-
-### [API](/nb/app/development/api)
-
-| | | |
-|---|---|---|
-| [Eksponere](/nb/app/development/api/expose) | [Instans](/nb/app/development/api/instance) | [Konsumere](/nb/app/development/api/consume) |
-
-### [Konfigurasjon](/nb/app/development/configuration)
-
-| | | | |
-|---|---|---|---|
-| [Autorisasjon](/nb/app/development/configuration/authorization) | [Autentisering](/nb/app/development/configuration/authentication) | [Aktørtyper](/nb/app/development/configuration/partytype) | [Prosess](/nb/app/development/configuration/process) |
-| [Produksjonssetting (deployment)](/nb/app/development/configuration/deployment) | [Secrets](/nb/app/development/configuration/secrets) | [Startup](/nb/app/development/configuration/startup) | [Stateless](/nb/app/development/configuration/stateless) |
-| [Query parametre](/nb/app/development/configuration/queryparameters) | [Hjelpefelter](/nb/app/development/configuration/shadowfields) | [Datafelter](/nb/app/development/configuration/datafields) | [eFormidling](/nb/app/development/configuration/) |
-| [App-innstillinger](/nb/app/development/configuration/settings) | [Events](/nb/app/development/configuration/events) | [Meldingsboks](/nb/app/development/configuration/messagebox) | [Virusscan](/app/development/configuration/filescan) |
----
-
-## [Testing](/nb/app/testing)
-
-### [Lokal testing](/nb/app/testing/local)
-Konfigurer et lokalt testmiljø for testing av applikasjonen.
-
-### [Testmiljø](/nb/app/testing/deploy)
-Bygg applikasjonen og produksjonssett (deploy) den til organisasjonens testmiljø.
-
----
-
-## Veiledninger
-Hvordan utføre spesifikke oppgaver relatert til app-utvikling i Altinn studio.
-
-### [Design](/nb/app/guides/design)
-| | | | |
-|---|---|---|---|
-| [Retningslinjer](/nb/app/guides/design/guidelines) | [Innsiktsfase](/nb/app/guides/design/insight) | [Prototyping](/nb/app/guides/design/prototype) | [Brukertesting](/nb/app/guides/design/usertest) |
-
-
-### Altinn 2
-
-| | | |
-|---|---|---|
-| [Migrere fra Altinn 2](/nb/app/guides/migrate-services) | [Altinn 2 datamodell](/nb/app/guides/altinn-2-datamodel) | [Sereserstatning](/nb/app/guides/seres-migration) |
-
-### Diverse
-
-| | |
-|---|---|
-| [Kopiere app](/nb/app/guides/copy-app) | [Tilgangsstyring](/nb/altinn-studio/guides/access-management) |
-
-## App-eksempler
-
-### [Digdir](/nb/app/launched-apps/digdir)
-Dokumentasjon for applikasjoner utviklet av Digitaliseringsdirektoratet.
-
-### [External](/nb/app/launched-apps/external)
-Applikasjoner opprettet av eksterne organisasjoner.
-
----
-
-## Neste steg
-
-### [Produksjonssetting](/nb/app/deployment/)
-### [Monitorering](/nb/app/monitoring/)
-### [Vedlikehold](/nb/app/maintainance/)
\ No newline at end of file
diff --git a/content/app/app_structure.drawio.svg b/content/app/app_structure.drawio.svg
deleted file mode 100644
index 881552ed99c..00000000000
--- a/content/app/app_structure.drawio.svg
+++ /dev/null
@@ -1,5056 +0,0 @@
-
\ No newline at end of file
diff --git a/content/app/cli/_index.en.md b/content/app/cli/_index.en.md
deleted file mode 100644
index 5ace70b51a9..00000000000
--- a/content/app/cli/_index.en.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-title: Altinn Studio CLI
-description: Command line tool for upgrading Altinn Apps
-weight: 60
----
-
-The Altinn Studio CLI is a command line tool for upgrading Altinn Apps. The tool is able to fix most breaking changes between version 7 and 8 of the Altinn.App.* NuGet packages, and version 3 and 4 of the Altinn App Frontend.
-
-{{}}
diff --git a/content/app/cli/_index.nb.md b/content/app/cli/_index.nb.md
deleted file mode 100644
index 684e3952c81..00000000000
--- a/content/app/cli/_index.nb.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-title: Altinn Studio CLI
-description: Kommandolinje-verktøy for oppgradering av Altinn-apper
-weight: 60
----
-
-Altinn Studio CLI er et kommandolinje-verktøy for oppgradering av Altinn-apper. Verktøyet kan fikse de fleste breaking changes imellom versjon 7 og 8 av NuGet-pakkene Altinn.App.*, og imellom versjon 3 og 4 av Altinn App-Frontend.
-
-{{}}
diff --git a/content/app/cli/install/_index.en.md b/content/app/cli/install/_index.en.md
deleted file mode 100644
index a7f13b98c86..00000000000
--- a/content/app/cli/install/_index.en.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-title: Installation
-description: How to install the Altinn Studio CLI
-weight: 50
----
-
-**Note**: The Altinn Studio CLI requires .Net 8.0 or later to be installed. See [Microsoft's documentation](https://dotnet.microsoft.com/en-us/download) to install .Net 8.0.
-
-To install the CLI, run the following command in your terminal:
-
-```bash
-dotnet tool install -g altinn.studio.cli
-```
-
-To verify that the installation was successful, run the following command:
-
-```bash
-altinn-studio --version
-```
-
diff --git a/content/app/cli/install/_index.nb.md b/content/app/cli/install/_index.nb.md
deleted file mode 100644
index 6dc7fa2a2ae..00000000000
--- a/content/app/cli/install/_index.nb.md
+++ /dev/null
@@ -1,19 +0,0 @@
----
-title: Installering
-description: Hvordan installere Altinn Studio CLI
-weight: 50
----
-
-**NB**: Altinn Studio CLI krever at .Net 8.0 eller senere er installert. Se [Microsofts dokumentasjon](https://dotnet.microsoft.com/en-us/download) for installasjon av .Net 8.0.
-
-For å installere verktøyet, kjør følgende kommando i terminalen:
-
-```bash
-dotnet tool install -g altinn.studio.cli
-```
-
-For å verifisere at installasjonen var vellykket, kjør følgende kommando:
-
-```bash
-altinn-studio --version
-```
diff --git a/content/app/deployment/_index.en.md b/content/app/deployment/_index.en.md
deleted file mode 100644
index c4c547fbde1..00000000000
--- a/content/app/deployment/_index.en.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-title: Deployment of apps to production
-linktitle: Deployment
-description: App owners can deploy their applications themselves.
-toc: true
-weight: 60
----
-
-## Getting access to a production environment
-
-Before you can deploy an application to the production environment for the first time, a separate cluster for the service owner needs to be provisioned.
-
-To get the cluster provisioned, the following process applies:
-
-1. [Send an e-mail](mailto:tjenesteeier@digdir.no) with a message about which apps you have ready for deployment to production.
-2. [Confirm that service owner accepts the terms of use](https://digdir.apps.altinn.no/digdir/godkjenn-bruksvilkaar)
-3. Wait for a reply that cluster is created.
-
-This routine just needs to be followed once. When the cluster is set up, the solution is 100% self-serviced afterwards.
-
-## Deployment of app
-
-Deploy of an application to production is done in [the same way as for test environments](/app/testing/deploy).
-The user that will deploy an application to production must be a member of the `Deploy-Production` group in Altinn Studio.
-Access to groups in Altinn Studio is administrated by each organization in Altinn Studio.
-[Read more about access in Altinn Studio](/altinn-studio/guides/access-management/studio/).
-
-## Order "About form"-page on altinn.no
-
-Altinn maintains [an overview of all services](https://www.altinn.no/skjemaoversikt/).
-In order for Altinn User Service to be able to help users with a service, information must be entered here. To ensure effective communication with Altinn user service and a seamless allocation of rights to the service, it is crucial to register the exact same name on both the "About form'-page and in the App.
-The order form is called _"Publiser informasjon om tjeneste på Altinn PROD og TT02"_, and can be found after login on [altinndigtal.no](https://altinndigital.no).
-
-
-**NB!** The form is currently optimized for Altinn II services. Therefore, do the following:
-
-- In the field _"Tjenestekode"_, enter 9999 and in the field _"Utgavekode"_ enter 9999.
-- In the field _"Hvem skal bruke skjemaet"_ remember to specify which roles are required for using the app in addition to the description of who the app is meant for.
-
-{{}}
diff --git a/content/app/deployment/_index.nb.md b/content/app/deployment/_index.nb.md
deleted file mode 100644
index 5ea9b1d31e6..00000000000
--- a/content/app/deployment/_index.nb.md
+++ /dev/null
@@ -1,36 +0,0 @@
----
-title: Produksjonssetting av apper
-linktitle: Produksjonssetting
-description: Tjenesteeier kan selv produksjonssette sine applikasjoner, og gjøre vedlikehold av kode og avhengigheter.
-toc: true
-weight: 60
----
-
-## Få tilgang til et produksjonsmiljø
-
-Første gang man skal gjøre deploy av en applikasjon til produksjonsmiljøet er det behov for at det er satt opp et eget tjenesteeier-cluster.
-For å få dette gjelder følgende prosess:
-
-1. [Send en e-post](mailto:tjenesteeier@digdir.no) med en beskjed om hvilken/hvilke apps du har klar til produksjonssetting.
-2. Vent på beskjed om at cluster er opprettet.
-
-Denne rutinen trenger bare å følges en gang. Når clusteret er satt opp, er løsningen selvbetjent etterpå.
-
-## Produksjonssette en app
-
-Produksjonssetting av applikasjonen gjøres på [samme måte som for testmiljøer](/nb/app/testing/deploy).
-Den som skal produksjonssette app'en må være medlem av gruppen `Deploy-Production` for sin organisasjon i Altinn Studio.
-Tilgang til grupper i Altinn Studio administreres av hver enkelt organisasjon i Altinn Studio.
-[Les mer om tilganger i Altinn Studio](/nb/altinn-studio/guides/access-management/studio/).
-
-## Bestille Om skjema-side
-
-Altinn vedlikeholder en [oversikt over alle tjenester i løsningen](https://www.altinn.no/skjemaoversikt/). For at Altinn brukerservice skal kunne hjelpe brukerne med en tjeneste, må informasjon legges inn her. For å sikre effektiv kommunikasjon med Altinn brukerservice og en smidig tildeling av rettigheter til tjenesten, er det avgjørende å registrere nøyaktig samme navn på både Om skjema-siden og i Appen. Bestillingsskjemaet heter _"Publiser informasjon om tjeneste på Altinn PROD og TT02"_, og finnes etter innlogging på [altinndigtal.no](https://altinndigital.no).
-
-
-**Merk!** Bestillingsskjemaet er inntil videre optimalisert for Altinn II-tjenester. Gjør derfor følgende:
-
-- I feltet _"Tjenestekode"_, oppgi 9999 og i feltet _"Utgavekode"_ oppgi 9999
-- I feltet _"Hvem skal bruke skjemaet"_ husk å angi hvilke roller som er satt på tjenesten i tillegg til beskrivelsen av hvem tjenesten er for.
-
-{{}}
diff --git a/content/app/deployment/runtime-environment/_index.en.md b/content/app/deployment/runtime-environment/_index.en.md
deleted file mode 100644
index 28e1c772721..00000000000
--- a/content/app/deployment/runtime-environment/_index.en.md
+++ /dev/null
@@ -1,57 +0,0 @@
----
-title: Runtime Environment
-description: Description of the Runtime Environment for Altinn 3 applications for a service owner.
-weight: 40
-tags: [translate-to-english]
----
-
-Altinn 3 applikasjoner for en tjenesteeier kjører i Azure Kubernetes Service (AKS) fra Microsoft Azure. Dette er en såkalt Managed Service hvor vi lar Microsoft Azure ta seg av den underliggende driften av Kubernetes clusteret. Altinn står for konfigurering og provisjonering av clusteret, mens tjenesteeier har selv ansvar for utrulling av applikasjonene til clusteret.
-
-For detaljert dokumentasjon av hvilke muligheter som finnes må man se på:
-* [Azure Kubernetes Services](https://docs.microsoft.com/en-us/azure/aks/)
-* [Kubernetes](https://kubernetes.io/docs/home/), og da spesielt hvordan [ressurser administreres](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/) - et ansvar som er delt mellom Altinn og tjenesteeier.
-
-Alle tjenesteeiere vil ha egne Kubernetes cluster for test og produksjon. Dette sikrer at applikasjoner for en tjenesteeier ikke påvirker applikasjoner for andre tjenesteeiere.
-
-## Ressursadministrasjon
-Selv om man ofte tenker at en skyløsning har ubegrenset kapasitet, så vil også ubegrenset kapasitet gjerne føre til ubegrenset kostnadsbruk. Det er derfor viktig å ha kontroll på hva man forbruker av ressurser, hvor mange applikasjoner man kjører og hvor mye CPU/minne den enkelte applikasjon legger beslag på. Før eller siden vil man gå tom for ressurser (CPU og minne) på clusteret, og det er da viktig å forstå hvilke faktorer som påvirker.
-
-## Komponentene i et cluster
-Et AKS Cluster kjører på et antall noder (virtuelle maskiner) av en gitt type. Per i dag er dette B2 som har 2 vCPU og 8 GiB minne. Som standard settes det opp minimum 3 noder både i TT02 og produksjon med automatisk skalering opp til 6 noder avhengig av trafikk. Clusteret vil da ha 12 vCPU og 48 GiB minne som da blir den øvre kapasiteten clusteret har til å betjene de applikasjonene som til enhver tid er deployet.
-
-{{%panel info%}}
-**Merk:** Et cluster kan skaleres automatisk opp til 1000 noder, men dette vil også medføre tilsvarende kostnadsøkning. Hva som er det rette "taket" for den enkelte tjensteeier vil avhenge av antall applikasjoner, hvor mye ressurser disse krever som minimum og trafikken som disse genererer. Ta kontakt med oss i Altinn om dere har behov for mer ressurser enn det som er satt opp som standard.
-{{% /panel%}}
-
-
-
-
-
-
-[Fullscreen](kubernetes-scaling-concepts.drawio.svg)
-
-### Applikasjoner / Apps
-Når vi snakker om en Altinn 3 App så snakker vi om den logiske applikasjonen som det bare finnes 1 av. For å sikre at en app hele tiden er oppe så kjører vi som regel med 2 eller flere instanser av applikasjonen. Minne og CPU reservasjoner gjelder per instans.
-
-### Docker Containers
-En Docker Container, eller bare container, inneholder i vårt tilfelle den kjørende koden for en Altinn 3 App. Men det finnes også andre containere i clusteret som inneholder systemtekniske ting som må kjøre. F. eks. så vil enhver Altinn 3 app container få følge av en Linkerd container som tar seg av kryptering/dekryptering av trafikk inn og ut av Altinn 3 applikasjonen.
-
-### Pods
-En pod er den minste kjørbare enheten i et kubernetes cluster og er det vi allokerer ressurser til. En pod kan bestå av en eller flere containere. En Altinn 3 applikasjon vil typisk bestå av en app container og en såkalt sidecar container som kjører Linkerd. Linkerd er den komponenten som tar seg av kryptering/dekryptering av kommunikasjon mellom pods i et cluster. Grunnen til at vi nevner denne er at denne også vil kreve minne og CPU ressurser.
-
-### Deployments
-En deployment styrer levetiden til en applikasjon, hvor mange instanser den skal ha samt allokering av minne og CPU. I Altinn 3 spesifiseres dette ved hjelp av såkalte Helm charts,. Dette kan sees på som en innpakking av en applikasjon med fornuftige standard verdier, men standard konfigurasjonen kan overstyres.
-
-
-{{%panel info%}}
-**Merk:** Noe av ressursene i et Kubernetes cluster vil gå med til systemtekniske prosesser både fra Kubernetes selv og fra Altinn infrastrukturen, så ikke alle ressurser i et cluster vil være tilgjengelig til fordeling til apps.
-
-{{% /panel%}}
-{{}}
-
diff --git a/content/app/deployment/runtime-environment/_index.nb.md b/content/app/deployment/runtime-environment/_index.nb.md
deleted file mode 100644
index cdfb8bd355a..00000000000
--- a/content/app/deployment/runtime-environment/_index.nb.md
+++ /dev/null
@@ -1,56 +0,0 @@
----
-title: Kjøremiljø
-description: Beskrivelse av kjøremiljøet for en Alttin 3 applikasjoner for en tjenesteeier.
-weight: 40
----
-
-Altinn 3 applikasjoner for en tjenesteeier kjører i Azure Kubernetes Service (AKS) fra Microsoft Azure. Dette er en såkalt Managed Service hvor vi lar Microsoft Azure ta seg av den underliggende driften av Kubernetes clusteret. Altinn står for konfigurering og provisjonering av clusteret, mens tjenesteeier har selv ansvar for utrulling av applikasjonene til clusteret.
-
-For detaljert dokumentasjon av hvilke muligheter som finnes må man se på:
-* [Azure Kubernetes Services](https://docs.microsoft.com/en-us/azure/aks/)
-* [Kubernetes](https://kubernetes.io/docs/home/), og da spesielt hvordan [ressurser administreres](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/) - et ansvar som er delt mellom Altinn og tjenesteeier.
-
-Alle tjenesteeiere vil ha egne Kubernetes cluster for test og produksjon. Dette sikrer at applikasjoner for en tjenesteeier ikke påvirker applikasjoner for andre tjenesteeiere.
-
-## Ressursadministrasjon
-Selv om man ofte tenker at en skyløsning har ubegrenset kapasitet, så vil også ubegrenset kapasitet gjerne føre til ubegrenset kostnadsbruk. Det er derfor viktig å ha kontroll på hva man forbruker av ressurser, hvor mange applikasjoner man kjører og hvor mye CPU/minne den enkelte applikasjon legger beslag på. Før eller siden vil man gå tom for ressurser (CPU og minne) på clusteret, og det er da viktig å forstå hvilke faktorer som påvirker.
-
-## Komponentene i et cluster
-Et AKS Cluster kjører på et antall noder (virtuelle maskiner) av en gitt type. Per i dag er dette B2 som har 2 vCPU og 8 GiB minne. Som standard settes det opp minimum 3 noder både i TT02 og produksjon med automatisk skalering opp til 6 noder avhengig av trafikk. Clusteret vil da ha 12 vCPU og 48 GiB minne som da blir den øvre kapasiteten clusteret har til å betjene de applikasjonene som til enhver tid er deployet.
-
-{{%panel info%}}
-**Merk:** Et cluster kan skaleres automatisk opp til 1000 noder, men dette vil også medføre tilsvarende kostnadsøkning. Hva som er det rette "taket" for den enkelte tjensteeier vil avhenge av antall applikasjoner, hvor mye ressurser disse krever som minimum og trafikken som disse genererer. Ta kontakt med oss i Altinn om dere har behov for mer ressurser enn det som er satt opp som standard.
-{{% /panel%}}
-
-
-
-
-
-
-[Fullscreen](kubernetes-scaling-concepts.drawio.svg)
-
-### Applikasjoner / Apps
-Når vi snakker om en Altinn 3 App så snakker vi om den logiske applikasjonen som det bare finnes 1 av. For å sikre at en app hele tiden er oppe så kjører vi som regel med 2 eller flere instanser av applikasjonen. Minne og CPU reservasjoner gjelder per instans.
-
-### Docker Containers
-En Docker Container, eller bare container, inneholder i vårt tilfelle den kjørende koden for en Altinn 3 App. Men det finnes også andre containere i clusteret som inneholder systemtekniske ting som må kjøre. F. eks. så vil enhver Altinn 3 app container få følge av en Linkerd container som tar seg av kryptering/dekryptering av trafikk inn og ut av Altinn 3 applikasjonen.
-
-### Pods
-En pod er den minste kjørbare enheten i et kubernetes cluster og er det vi allokerer ressurser til. En pod kan bestå av en eller flere containere. En Altinn 3 applikasjon vil typisk bestå av en app container og en såkalt sidecar container som kjører Linkerd. Linkerd er den komponenten som tar seg av kryptering/dekryptering av kommunikasjon mellom pods i et cluster. Grunnen til at vi nevner denne er at denne også vil kreve minne og CPU ressurser.
-
-### Deployments
-En deployment styrer levetiden til en applikasjon, hvor mange instanser den skal ha samt allokering av minne og CPU. I Altinn 3 spesifiseres dette ved hjelp av såkalte Helm charts,. Dette kan sees på som en innpakking av en applikasjon med fornuftige standard verdier, men standard konfigurasjonen kan overstyres.
-
-
-{{%panel info%}}
-**Merk:** Noe av ressursene i et Kubernetes cluster vil gå med til systemtekniske prosesser både fra Kubernetes selv og fra Altinn infrastrukturen, så ikke alle ressurser i et cluster vil være tilgjengelig til fordeling til apps.
-
-{{% /panel%}}
-{{}}
-
diff --git a/content/app/deployment/runtime-environment/kubernetes-scaling-concepts.drawio.svg b/content/app/deployment/runtime-environment/kubernetes-scaling-concepts.drawio.svg
deleted file mode 100644
index 25b03d13da5..00000000000
--- a/content/app/deployment/runtime-environment/kubernetes-scaling-concepts.drawio.svg
+++ /dev/null
@@ -1,195 +0,0 @@
-
\ No newline at end of file
diff --git a/content/app/deployment/runtime-environment/resource-allocation-tips/_index.en.md b/content/app/deployment/runtime-environment/resource-allocation-tips/_index.en.md
deleted file mode 100644
index 711184a5d40..00000000000
--- a/content/app/deployment/runtime-environment/resource-allocation-tips/_index.en.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-title: Practical tips for resource allocation
-description:
-weight: 40
-tags: [translate-to-english]
----
-
-Før vi går på konkrete tips må vi kort introdusere Helm Chart. Helm Chart er de(n) filen(e) som styrer hvordan applikasjonen din [deployes](/app/development/configuration/deployment/)) til Kubernetes. Det er også her man styrer CPU og minne allokering. Du finner `Chart.yaml`og `values.yaml`i deployment mappen i applikasjonen din. Dette er viktige filer som kan være lett å overse og ikke ha et aktivt forhold til.
-
-## Tips 1 - Kjør siste versjon av Helm Chart
-Med siste versjon får du de mest oppdaterte innstillingene som standard. Se [Endringslogg for deployment](/community/changelog/deployment/) for hvordan oppgradere til siste versjon.
-
-## Tips 2 - Ha et aktivt forhold til hva applikasjonen krever av minne og CPU
-Altinn kommer med en standard på 50m CPU og 128Mi minne, men hva som faktisk kreves er det jo bare den som utvikler en applikasjon som vet. Hvis det caches mye data, vil det kreve mye minne. Hvis det er tunge operasjoner så vil det kreve mye CPU. De faktiske kravene bør gjenspeiles i Helm Chart hvis de avviker fra standarden.
-
-## Tips 3 - Reduser antall instanser i testmiljø
-Trenger man 2 kjørende instanser i test eller kan man klare seg med 1? Ønsker man å teste hvordan en app oppfører seg med flere instanser så trenger man nødvendigvis 2 eller flere, men ofte så holder det men 1 kjørende instans i test og man tåler litt nedetid ved deploy.
-
-{{%panel info%}}
-**Merk:** Har man gjort de tiltakene man kan, men alikevel har nådd taket på hva clusteret håndterer så er neste steg å øke antallet noder evt. ha kraftigere noder. Ta kontakt med oss i Altinn så ser vi på dette sammen med dere.
-
-{{% /panel%}}
-
-{{}}
diff --git a/content/app/deployment/runtime-environment/resource-allocation-tips/_index.nb.md b/content/app/deployment/runtime-environment/resource-allocation-tips/_index.nb.md
deleted file mode 100644
index 74654272c08..00000000000
--- a/content/app/deployment/runtime-environment/resource-allocation-tips/_index.nb.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-title: Tips til ressurserfordeling
-description: Hva kan/bør man gjøre utover standard innstillinger?
-weight: 40
----
-
-Før vi går på konkrete tips må vi kort introdusere Helm Chart. Helm Chart er de(n) filen(e) som styrer hvordan applikasjonen din [deployes](/nb/app/development/configuration/deployment/)) til Kubernetes. Det er også her man styrer CPU og minne allokering. Du finner `Chart.yaml`og `values.yaml`i deployment mappen i applikasjonen din. Dette er viktige filer som kan være lett å overse og ikke ha et aktivt forhold til.
-
-## Tips 1 - Kjør siste versjon av Helm Chart
-Med siste versjon får du de mest oppdaterte innstillingene som standard. Se [Endringslogg for deployment](/nb/community/changelog/deployment) for hvordan oppgradere til siste versjon.
-
-## Tips 2 - Ha et aktivt forhold til hva applikasjonen krever av minne og CPU
-Altinn kommer med en standard på 50m CPU og 128Mi minne, men hva som faktisk kreves er det jo bare den som utvikler en applikasjon som vet. Hvis det caches mye data, vil det kreve mye minne. Hvis det er tunge operasjoner så vil det kreve mye CPU. De faktiske kravene bør gjenspeiles i Helm Chart hvis de avviker fra standarden.
-
-## Tips 3 - Reduser antall instanser i testmiljø
-Trenger man 2 kjørende instanser i test eller kan man klare seg med 1? Ønsker man å teste hvordan en app oppfører seg med flere instanser så trenger man nødvendigvis 2 eller flere, men ofte så holder det men 1 kjørende instans i test og man tåler litt nedetid ved deploy.
-
-{{%panel info%}}
-**Merk:** Har man gjort de tiltakene man kan, men alikevel har nådd taket på hva clusteret håndterer så er neste steg å øke antallet noder evt. ha kraftigere noder. Ta kontakt med oss i Altinn så ser vi på dette sammen med dere.
-
-{{% /panel%}}
-
-{{}}
diff --git a/content/app/deployment/runtime-environment/resource-allocation/_index.en.md b/content/app/deployment/runtime-environment/resource-allocation/_index.en.md
deleted file mode 100644
index 4972bbc66ea..00000000000
--- a/content/app/deployment/runtime-environment/resource-allocation/_index.en.md
+++ /dev/null
@@ -1,38 +0,0 @@
----
-title: Resource Allocation
-description: Which resources are allocated in a cluster and how?
-toc: true
-weight: 40
-tags: [translate-to-english]
----
-
-Primært vil det være CPU og minne som fordeles. Man kan sette minimum (requests) og et tak (limit) for en container.
-Hvis en pod har flere containere vil kubernetes summere opp disse.
-
-I Altinn 3 benytter vi som default requests, dvs. minimum for hva en applikasjon vil legge beslag på.
-
-## CPU
-CPU spesifiseres i CPU enheter, hvor 1 CPU enhet = 1 fysisk CPU kjerne eller 1 virtuell kjerne. Man kan spesifisere fraksjoner og enten spesifisere 0.1 eller 100m (som leses hundre millicores). Vi anbefaler at man benytter m notasjonen og ikke desimal notasjonen slik at man skriver 1m og ikke 0.001 (som er det minste man kan spesifisere).
-
-Som standard har man 12 kjerner til fordeling i TT02, dvs. 12 000m, gitt dagens oppsett med 6 noder á 2 kjerner. Fra dette må vi trekke fra de systemtekniske containerne som kubernetes selv kjører, det tilsvarer ca. 30% av CPU, da er vi nede i 8000m til fordeling til Altinn 3 applikasjoner.
-
-For en app er CPU satt som default til 50m. Dvs. man skal i teorien ha plass til 8000 / 50m = 160 apps på et slikt cluster. Men en app vil som standard kjøres opp i 2 instanser, da har vi brukt 2x50m=100m. I tillegg har hver app en såkalt sidecar container (Linkerd for kryptering/dekryptering) som får 25m. Denne følger instansen og det blir da 2x25=50m. Så en app vil da totalt kreve 150m for 2 instanser. Gitt 8 cpu’er tilgjengelig så får vi 53 apps med dagens oppsett. Dette er veiledende tall, men gir en grei pekepinn. Hvis en app krever mer CPU enn minimum vil den få det gitt at det finnes mer tilgjengelig.
-
-## Minne
-Minne spesifiseres i byte, og man kan benytte ulike suffixer som Mi, M Ki etc. Altinn 3 spesifiserer dette i Mi som er Mebibyte som er tilnærmet det samme som Megabyte.
-
-Som standard har vi 48GiB (Gibi Byte) minne tilgjengelig i clusteret totalt, men dette er fordelt med 8GiB på hver av de 6 nodene. Fra dette må vi trekke fra ca. 0.5 - 1GiB som går til systemtekniske containere som kubernetes selv kjører, det tilsvarer ca. 10-20%. Dvs. at vi da har 6 noder x 7Mi = 42GiB (40054Mi) totalt i clusteret og 7GiB (7168Mi) per. Node til fordeling.
-
-For en app er minne satt til 128Mi som default. Dvs. man skal i teorien ha plass til 7168Mi / 128Mi = 56 app instanser per node og 336 apps totalt i clusteret hvis vi kun ser på minne. Når vi ser på tallene over minneforbruk så er det et overforbruk av minne, så 256Mi er nok et bedre tall per app. Korrigert for dette så kan vi halvere tallene slik at det blir 24 app instanser per node og 168 app instanser totalt i clusteret.
-
-## Hvordan fungerer ressursallokering i clusteret?
-Når en ny app skal deployes til et Kubernetes cluster vil Kubernetes litt forenklet se på hvor mye minne og CPU det er spurt om som minimum og prøve å finne node som har ledig plass. Hvis den ikke finner en node med ledig plass så vil den se om det er noen av de kjørende applikasjonene som overforbruker ressurser i forhold til hva de har spurt om å kaste ut den eller de som har høyest overforbruk for å gi plass til den nye.
-
-{{%panel info%}}
-**Merk:** Det at Kubernetes vil kaste ut en applikasjon som overforbruker gjør det svært viktig å ha et forhold til hvor mye ressurser man har tilgjengelig, hvor mye hver enkelt app krever og at summen av dette går opp - hvis ikke risikerer man ustabilitet i miljøet.
-
-{{% /panel%}}
-
-
-{{}}
-
diff --git a/content/app/deployment/runtime-environment/resource-allocation/_index.nb.md b/content/app/deployment/runtime-environment/resource-allocation/_index.nb.md
deleted file mode 100644
index 99e74a006d8..00000000000
--- a/content/app/deployment/runtime-environment/resource-allocation/_index.nb.md
+++ /dev/null
@@ -1,37 +0,0 @@
----
-title: Ressurserfordeling
-description: Hvilke ressurser fordeles i et cluster og hvordan?
-toc: true
-weight: 40
----
-
-Primært vil det være CPU og minne som fordeles. Man kan sette minimum (requests) og et tak (limit) for en container.
-Hvis en pod har flere containere vil kubernetes summere opp disse.
-
- I Altinn 3 benytter vi som default requests, dvs. minimum for hva en applikasjon vil legge beslag på.
-
-## CPU
-CPU spesifiseres i CPU enheter, hvor 1 CPU enhet = 1 fysisk CPU kjerne eller 1 virtuell kjerne. Man kan spesifisere fraksjoner og enten spesifisere 0.1 eller 100m (som leses hundre millicores). Vi anbefaler at man benytter m notasjonen og ikke desimal notasjonen slik at man skriver 1m og ikke 0.001 (som er det minste man kan spesifisere).
-
-Som standard har man 12 kjerner til fordeling i TT02, dvs. 12 000m, gitt dagens oppsett med 6 noder á 2 kjerner. Fra dette må vi trekke fra de systemtekniske containerne som kubernetes selv kjører, det tilsvarer ca. 30% av CPU, da er vi nede i 8000m til fordeling til Altinn 3 applikasjoner.
-
-For en app er CPU satt som default til 50m. Dvs. man skal i teorien ha plass til 8000 / 50m = 160 apps på et slikt cluster. Men en app vil som standard kjøres opp i 2 instanser, da har vi brukt 2x50m=100m. I tillegg har hver app en såkalt sidecar container (Linkerd for kryptering/dekryptering) som får 25m. Denne følger instansen og det blir da 2x25=50m. Så en app vil da totalt kreve 150m for 2 instanser. Gitt 8 cpu’er tilgjengelig så får vi 53 apps med dagens oppsett. Dette er veiledende tall, men gir en grei pekepinn. Hvis en app krever mer CPU enn minimum vil den få det gitt at det finnes mer tilgjengelig.
-
-## Minne
-Minne spesifiseres i byte, og man kan benytte ulike suffixer som Mi, M Ki etc. Altinn 3 spesifiserer dette i Mi som er Mebibyte som er tilnærmet det samme som Megabyte.
-
-Som standard har vi 48GiB (Gibi Byte) minne tilgjengelig i clusteret totalt, men dette er fordelt med 8GiB på hver av de 6 nodene. Fra dette må vi trekke fra ca. 0.5 - 1GiB som går til systemtekniske containere som kubernetes selv kjører, det tilsvarer ca. 10-20%. Dvs. at vi da har 6 noder x 7Mi = 42GiB (40054Mi) totalt i clusteret og 7GiB (7168Mi) per. Node til fordeling.
-
-For en app er minne satt til 128Mi som default. Dvs. man skal i teorien ha plass til 7168Mi / 128Mi = 56 app instanser per node og 336 apps totalt i clusteret hvis vi kun ser på minne. Når vi ser på tallene over minneforbruk så er det et overforbruk av minne, så 256Mi er nok et bedre tall per app. Korrigert for dette så kan vi halvere tallene slik at det blir 24 app instanser per node og 168 app instanser totalt i clusteret.
-
-## Hvordan fungerer ressursallokering i clusteret?
-Når en ny app skal deployes til et Kubernetes cluster vil Kubernetes litt forenklet se på hvor mye minne og CPU det er spurt om som minimum og prøve å finne node som har ledig plass. Hvis den ikke finner en node med ledig plass så vil den se om det er noen av de kjørende applikasjonene som overforbruker ressurser i forhold til hva de har spurt om å kaste ut den eller de som har høyest overforbruk for å gi plass til den nye.
-
-{{%panel info%}}
-**Merk:** Det at Kubernetes vil kaste ut en applikasjon som overforbruker gjør det svært viktig å ha et forhold til hvor mye ressurser man har tilgjengelig, hvor mye hver enkelt app krever og at summen av dette går opp - hvis ikke risikerer man ustabilitet i miljøet.
-
-{{% /panel%}}
-
-
-{{}}
-
diff --git a/content/app/development/_index.en.md b/content/app/development/_index.en.md
deleted file mode 100644
index 888f76e5dd9..00000000000
--- a/content/app/development/_index.en.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: Development
-description: How to create and edit apps in Altinn Studio.
-weight: 40
----
-
-{{}}
-
diff --git a/content/app/development/_index.nb.md b/content/app/development/_index.nb.md
deleted file mode 100644
index 8a3f0c7885c..00000000000
--- a/content/app/development/_index.nb.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: Utvikling
-description: Hvordan opprette og redigere apper i Altinn Studio.
-weight: 40
----
-
-{{}}
-
diff --git a/content/app/development/api/_index.en.md b/content/app/development/api/_index.en.md
deleted file mode 100644
index 485587bdce3..00000000000
--- a/content/app/development/api/_index.en.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: API
-description: The apps developed in Altinn Studio can expose both standard and custom APIs, and take advantage of APIs. Here are guides on how to do it.
-weight: 50
----
-
-{{}}
diff --git a/content/app/development/api/_index.nb.md b/content/app/development/api/_index.nb.md
deleted file mode 100644
index fb36dedf5a0..00000000000
--- a/content/app/development/api/_index.nb.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: API
-description: Appene som man utvikler i Altinn Studio kan eksponere både standard og egendefinerte API-er, og benytte seg av API-er. Her er veiledninger på hvordan man gjør det.
-weight: 50
----
-
-{{}}
diff --git a/content/app/development/api/consume/_index.en.md b/content/app/development/api/consume/_index.en.md
deleted file mode 100644
index fd5564c0854..00000000000
--- a/content/app/development/api/consume/_index.en.md
+++ /dev/null
@@ -1,503 +0,0 @@
----
-title: Consume APIs in an app
-linktitle: Consume
-description: An application can consume open and closed APIs available through the Internet.
-toc: true
----
-
-ASP.NET Core has good opportunities to consume different types of API.
-
-This can be useful if you want to expose your organization's own APIs via an app or need help from external APIs in the application logic.
-
-On this page, an example of using an external open API to enrich form data is presented.
-[The example app is available in Altinn Studio](https://altinn.studio/repos/ttd/consume-api-example).
-
-We will be using the [RestCountries v3](https://restcountries.com/#api-endpoints-v3) API,
-and more specifically the endpoint `https://restcountries.com/v3.1/name/{country}`.
-This endpoint returns metadata about the provided country.
-
-You may test the API in your browser and study the response: [https://restcountries.com/v3.1/name/Norway](https://restcountries.com/v3.1/name/Norway).
-
-We would like to enrich the form data with details about the country that the end user fills out.
-
-## Creating models for the API
-
-If the API you are consuming is documented with Swagger or OpenAPI,
-you can easily generate C# classes based on the documentation.
-
-This can be done manually, or by using available online tools.
-
-In this example, the response object is quite large and contains much more data than we are interested in.
-
-Here is an abbreviated version of the response object for Norway:
-```json {linenos=false,hl_lines=[9,10,11,13]}
-[
- {
- "name": {
- "common": "Norway",
- "official": "Kingdom of Norway",
- "nativeName": {}
- },
- "idd": {},
- "capital": [
- "Oslo"
- ],
- "altSpellings": [],
- "region": "Europe",
- "subregion": "Northern Europe",
- "languages": {},
- "translations": {},
- "latlng": [
- 62,
- 10
- ],
- "landlocked": false,
- "borders": [],
- "area": 323802,
- "demonyms": {},
- "flag": "🇳🇴",
- "maps": {},
- "population": 5379475,
- "postalCode": {
- "format": "###",
- "regex": "^(\\d{4})$"
- }
- }
-]
-```
-
-In the application we are only interested in the data in the lines highlighted:
-capital and region. We create a minimal response object that only contains the properties we are interested in.
-
-In the folder _App/models_ a new file `Country.cs` is created.
-
-```C#
-using System.Collections.Generic;
-
-namespace Altinn.App.models
-{
- public class Country
- {
- public List Capital { get; set; }
- public string Region { get; set; }
- }
-}
-```
-
-The `Country` object contains the fields `Capital` og `Region`.
-`Capital` is a list of strings as a country can contain multiple capital cities.
-
-In this example, the API doesn't require a complex request object, so we only need this one model.
-Should you need a separate model for the request object, a class can be created the same way.
-
-## Setting up an interface for the client
-
-It is recommended that an interface is defined for the client that will call the API.
-This enables you to benefit from the strengths of .NET with dependency injection and efficient handling of HTTP clients.
-
-In the application repository, a new folder _App/clients_ is created.
-Within this folder, a new file `ICountryClient.cs` is created.
-
-The interface consists of a single method `GetCountry`, which accepts a string and returns a _Country_-object.
-
-Define the interface as shown below.
-
-```C#
-using System.Threading.Tasks;
-
-using Altinn.App.models;
-
-namespace Altinn.App.client
-{
- public interface ICountryClient
- {
- ///
- /// Retrieves metadata about the provided country.
- ///
- /// The name of the country
- /// A country object
- public Task GetCountry(string country);
- }
-}
-```
-
-The return object is framed by `Task<...>`, this is added to support the asynchronous running of this method.
-
-## Implement the client
-
-The client contains the code that makes the request towards the API and maps the response to the `Country`-model,
-which is what the methods using the client expect as an output.
-
-The full implementation of _CountryClient_ is shown below.
-
-```C#
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net.Http;
-using System.Text.Json;
-using System.Threading.Tasks;
-
-using Altinn.App.models;
-
-using Microsoft.Extensions.Logging;
-
-namespace Altinn.App.client
-{
- public class CountryClient : ICountryClient
- {
- HttpClient _client;
- ILogger _logger;
- JsonSerializerOptions _serializerOptions;
-
- public CountryClient(HttpClient client, ILogger logger)
- {
- _logger = logger;
-
- _client = client;
- _client.BaseAddress = new Uri("https://restcountries.com/v3.1");
-
- _serializerOptions = new()
- {
- PropertyNameCaseInsensitive = true
- };
- }
-
- public async Task GetCountry(string country)
- {
- string query = $"name/{country}";
-
- HttpResponseMessage res = await _client.GetAsync(query);
-
- if (res.IsSuccessStatusCode)
- {
- string resString = await res.Content.ReadAsStringAsync();
-
- List countryResponse = JsonSerializer.Deserialize>(resString, _serializerOptions);
-
- return countryResponse.Any() ? countryResponse.First() : null;
- }
- else
- {
- _logger.LogError("Retrieving country {country} failed with status code {statusCode}", country, res.StatusCode);
- return null;
- }
- }
- }
-}
-
-```
-
-At the top of the file you find a reference to all the namespaces the class depends on.
-
-```cs
-using System;
-using System.Linq;
-using System.Net.Http;
-using System.Text.Json;
-using System.Threading.Tasks;
-
-using Altinn.App.models;
-
-using Microsoft.Extensions.Logging;
-```
-
-Further, we define the class and which interface it inherits from.
-
-```cs
-public class CountryClient : ICountryClient
-```
-
-Further, three private objects __client_, __logger and __serializerOptions_
-
-```cs
-private readonly HttpClient _client;
-private readonly ILogger _logger;
-private readonly JsonSerializerOptions _serializerOptions;
-```
-
-The underscore before the name is simply a naming convention and does not have a functional effect.
-
-- __client_ will be populated with an HTTP client in the constructor
-- __logger_ will be populated with a logger, enabling logging error messages and other messages in the client logic
-- __serializerOptions_ will be instantiated and configured in the constructor to support deserialization of the API
- response
-
-Further in the class, the constructor is defined.
-
-```cs
-public CountryClient(HttpClient client, ILogger logger)
-{
- _logger = logger;
- _client = client;
- _client.BaseAddress = new Uri("https://restcountries.com/v3.1");
-
- _serializerOptions = new()
- {
- PropertyNameCaseInsensitive = true
- };
-}
-```
-
-Objects are populated if there are matching inputs in the constructor,
-and the remaining objects are instantiated directly in the constructor.
-
-If you require additional services in this class, simply add a private object and inject its interface
-in the constructor as we have done for __logger_ and __client_.
-
-Further, you find the implementation of `GetCountry`.
-
-```cs
-public async Task GetCountry(string country)
-{
- string query = $"name/{country}";
- HttpResponseMessage res = await _client.GetAsync(query);
-
- if (res.IsSuccessStatusCode)
- {
- string resString = await res.Content.ReadAsStringAsync();
-
- List countryResponse = JsonSerializer.Deserialize>(resString, _serializerOptions);
-
- return countryResponse.Any() ? countryResponse.First() : null;
- }
- else
- {
- _logger.LogError("Retrieving country {country} failed with status code {statusCode}", country, res.StatusCode);
- return null;
- }
-}
-```
-
-Here, the status code of the API call is verified before it is deserialized and the country object returned.
-If the statusCode is not one that indicates success, a log entry is made and _null_ is returned.
-
-## Registering the client in the application
-
-Once the interface and client is implemented, it should be registered in _App/Program.cs_ (.NET 6) or _App/Startup.cs_ (.NET 5),
-to make it available to use in the application.
-
-In the `Program.cs` class, the line below is included. In addition, `using Altinn.App.client;` and `using Altinn.App.AppLogic.DataProcessing;` is added at the top of the file.
-
-```C#
-void RegisterCustomAppServices(IServiceCollection services, IConfiguration config, IWebHostEnvironment env)
-{
- services.AddHttpClient();
- services.AddTransient();
- // Register your apps custom service implementations here.
-}
-```
-
-## Using the client in the application logic
-
-To enrich the form data we need to include the use of our client in the logic in the method _ProcessDataWrite_ in _App/logic/DataProcessingHandler.cs_ for versions prior to v7 of the application template. For v7 please refer to the documentation on [DataProcessing](../../logic/dataprocessing/).
-
-First the client must be made available by injecting it in the constructor of the class.
-DataProcessingHandler does not have a constructor by default, so this needs to be created.
-In addition, `using Altinn.App.client;` must be added to the top of the file.
-
-```cs
-public DataProcessingHandler()
-{
-}
-```
-
-Further, add a private field for the client, inject the client into the constructor and assign it to the private client instance.
-The result should look like this:
-
-```cs
-private readonly ICountryClient _countryClient;
-
-public DataProcessingHandler(ICountryClient countryClient)
-{
- _countryClient = countryClient;
-}
-```
-`using Altinn.App.client;` must be added to this file as well.
-
-__countryClient_ is now available in DataProcessingHandler, and we're ready to implement the logic in the _ProcessDataWrite_ method.
-
-
-
-{{%notice warning%}}
-
-**NOTE**: Stateless apps don't call ProcessDataWrite. Use ProcessDataRead for stateless apps.
-{{%/notice%}}
-
-```cs
-public async Task ProcessDataWrite(Instance instance, Guid? dataId, object data)
-{
- if (data.GetType() == typeof(skjema))
- {
- skjema skjema = (skjema)data;
- if (!string.IsNullOrEmpty(skjema.land))
- {
- Country country = await _countryClient.GetCountry(skjema.land.Trim());
-
- if (country != null)
- {
- skjema.hovedstad = string.Join(",", country.Capital);
- skjema.region = country.Region;
- }
- else
- {
- skjema.hovedstad = skjema.region = string.Empty;
- }
-
- return true;
- }
- else
- {
- skjema.hovedstad = string.Empty;
- skjema.region = string.Empty;
- }
- }
- return await Task.FromResult(false);
-}
-```
-
-If you attempt to build the application at this point, an error will occur.
-DataProcessingHandler is instantiated in App.cs,
-so all dependencies must be included in this file and included in the initialization of DataProcessingHandler.
-
-In the file _App/logic/App.cs_, the following changes are made.
-
-- Add a reference to the namespace of the client at the top of the file.
- ```cs
- using Altinn.App.client;
- ```
-- Inject `ICountryClient` as the last element of the App.cs-constructor.
-
- This is done in line 14:
- ```cs {linenos=inline,hl_lines=[14]}
- public App(
- IAppResources appResourcesService,
- ILogger logger,
- IData dataService,
- IProcess processService,
- IPDF pdfService,
- IProfile profileService,
- IRegister registerService,
- IPrefill prefillService,
- IInstance instanceService,
- IOptions settings,
- IText textService,
- IHttpContextAccessor httpContextAccessor,
- ICountryClient countryClient) : base(
- appResourcesService,
- logger,
- dataService,
- processService,
- pdfService,
- prefillService,
- instanceService,
- registerService,
- settings,
- profileService,
- textService,
- httpContextAccessor)
- ```
-
-- Include countryClient in the initialization of DataProcessingHandler.
- ```cs
- _dataProcessingHandler = new DataProcessingHandler(countryClient);
- ```
-
-
-## Caching of response data
-
-One drawback of the example as it now stands, is that a request will be made to the API every time
-any of the form data is updated.
-
-It is a reasonable assumption that a country's capital and region will not change frequently.
-If information about Norway is retrieved, we can store this in the application for a period of time,
-so that the cost of future requests are reduced.
-
-The changes to the code are not described in detail, but the complete code is available below.
-All of the modifications are made to the _CountryClient.cs_-file.
-
-```cs
-using Altinn.App.models;
-
-using Microsoft.Extensions.Caching.Memory;
-using Microsoft.Extensions.Logging;
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net.Http;
-using System.Text.Json;
-using System.Threading.Tasks;
-
-namespace Altinn.App.client
-{
- public class CountryClient : ICountryClient
- {
- private readonly HttpClient _client;
- private readonly ILogger _logger;
- private readonly JsonSerializerOptions _serializerOptions;
- private readonly IMemoryCache _memoryCache;
- private readonly MemoryCacheEntryOptions _cacheOptions;
-
- public CountryClient(HttpClient client, ILogger logger, IMemoryCache memoryCache)
- {
- _logger = logger;
-
- _client = client;
- _client.BaseAddress = new Uri("https://restcountries.com/v3.1/");
-
- _serializerOptions = new()
- {
- PropertyNameCaseInsensitive = true
- };
-
- _memoryCache = memoryCache;
- _cacheOptions = new()
- {
- AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(24)
- };
- }
-
- public async Task GetCountry(string country)
- {
- string uniqueCacheKey = "Country_" + country;
-
- // Check if country is present in cache, if so return from cache
- if (_memoryCache.TryGetValue(uniqueCacheKey, out Country outputCountry))
- {
- return outputCountry;
- }
-
- string query = $"name/{country}";
-
- HttpResponseMessage res = await _client.GetAsync(query);
-
- if (res.IsSuccessStatusCode)
- {
- string resString = await res.Content.ReadAsStringAsync();
-
- List countryResponse = JsonSerializer.Deserialize>(resString, _serializerOptions);
-
- if (countryResponse.Any())
- {
- outputCountry = countryResponse.First();
-
- // Add response country to cache
- _memoryCache.Set(uniqueCacheKey, outputCountry, _cacheOptions);
- return outputCountry;
- }
- else
- {
- return null;
- }
- }
- else
- {
- _logger.LogError("Retrieving country {country} failed with status code {statusCode}", country, res.StatusCode);
- return null;
- }
- }
- }
-}
-```
-
diff --git a/content/app/development/api/consume/_index.nb.md b/content/app/development/api/consume/_index.nb.md
deleted file mode 100644
index e0e59a2f1c9..00000000000
--- a/content/app/development/api/consume/_index.nb.md
+++ /dev/null
@@ -1,503 +0,0 @@
----
-title: Konsumere API-er i en app
-linktitle: Konsumere
-description: En applikasjon kan konsumere åpne og lukkede API som er tilgjengelig via Internett.
-toc: true
----
-
-ASP.NET Core har gode muligheter til å konsumere API.
-
-Dette kan være nyttig dersom man ønsker å eksponere organisasjonens
-egne API via en app eller har behov for data fra eksterne API i appen.
-
-På denne siden går vi gjennom et eksempel hvor et eksternt, åpent API benyttes til å berike skjemadata.
-[Eksempelappen kan sees i sin helhet i Altinn Studio](https://altinn.studio/repos/ttd/consume-api-example).
-
-API-et som benyttes er [RestCountries v3](https://restcountries.com/#api-endpoints-v3) og det er
-endepunktet `https://restcountries.com/v3.1/name/{country}` vi er interessert i.
-Dette returnerer et sett med detaljer om landet som er oppgitt.
-
-Du kan studere responsen ved å kalle API-et fra nettleseren din: [https://restcountries.com/v3.1/name/Norway](https://restcountries.com/v3.1/name/Norway).
-
-Vi ønsker å berike skjemaet med detaljer om et land som sluttbruker har fylt inn.
-
-## Opprettelse av API modeller
-
-Dersom API-et som skal konsumeres er dokumentert med Swagger eller OpenAPI kan man enkelt genere C# klasser basert på datamodellen.
-Dette kan gjøres manuelt eller ved hjelp av verktøy som tilbyr slik generering.
-
-
-I dette eksempelet er responsobjektet stort og inneholder langt mer data enn den vi er interessert i.
-
-Her er et lite utsnitt av responsobjektet for Norge.
-```json {linenos=false,hl_lines=[9,10,11,13]}
-[
- {
- "name": {
- "common": "Norway",
- "official": "Kingdom of Norway",
- "nativeName": {}
- },
- "idd": {},
- "capital": [
- "Oslo"
- ],
- "altSpellings": [],
- "region": "Europe",
- "subregion": "Northern Europe",
- "languages": {},
- "translations": {},
- "latlng": [
- 62,
- 10
- ],
- "landlocked": false,
- "borders": [],
- "area": 323802,
- "demonyms": {},
- "flag": "🇳🇴",
- "maps": {},
- "population": 5379475,
- "postalCode": {
- "format": "###",
- "regex": "^(\\d{4})$"
- }
- }
-]
-```
-
-I applikasjonen ønsker vi kun å ta med oss dataen fra de markerte linjene, altså hovedstad og region.
-Vi lager et minimalistisk responsobjekt som kun inneholder de feltene vi er interessert i.
-
-I mappen _App/models_ opprettes det en ny fil `Country.cs`.
-
-```C#
-using System.Collections.Generic;
-
-namespace Altinn.App.models
-{
- public class Country
- {
- public List Capital { get; set; }
- public string Region { get; set; }
- }
-}
-```
-
-`Country`-objektet består av feltene `Capital` og `Region`.
-`Capital` er en liste med strenger, da et land kan ha flere hovesteder.
-
-I dette eksempelt krever ikke API-et et komplekst request-objekt og dermed kan vi nøye oss med den ene modellen.
-Skulle det være behov for et request-objekt kan dette opprettes på samme måte.
-
-
-## Oppsett av interface for klienten
-
-Det er anbefalt å definere et interface for klienten som skal kalle API-et.
-Det gjør at vi kan benytte oss av styrkene til .NET med dependency injection og effektiv håndtering av HTTP-klienter.
-
-I applikasjonsrepoet opprettes mappen _App/clients_,
-og i den nye mappen opprettes filen `ICountryClient.cs`.
-
-Interfacet består av én metode `GetCountry` som tar inn en streng og returnerer et _Country_-objekt.
-
-Definér interfacet som vist nedenfor.
-
-```C#
-using System.Threading.Tasks;
-
-using Altinn.App.models;
-
-namespace Altinn.App.client
-{
- public interface ICountryClient
- {
- ///
- /// Retrieves metadata about the provided country.
- ///
- /// The name of the country
- /// A country object
- public Task GetCountry(string country);
- }
-}
-```
-
-Returobjektet er omkranset av `Task<...>`. Dette er lagt inn for å vise til at kallet som skal gjøres
-vil være asynkront.
-
-## Implementere klient
-
-Det er klienten som inneholder koden som gjør kallet mot API-et og omformer resultatet til `Country`-modellen
-som forventes i retur av funksjonene som kaller klienten.
-
-Den fulle implementasjonen av _Country_-klienten er vist nedenfor.
-
-```C#
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net.Http;
-using System.Text.Json;
-using System.Threading.Tasks;
-
-using Altinn.App.models;
-
-using Microsoft.Extensions.Logging;
-
-namespace Altinn.App.client
-{
- public class CountryClient : ICountryClient
- {
- HttpClient _client;
- ILogger _logger;
- JsonSerializerOptions _serializerOptions;
-
- public CountryClient(HttpClient client, ILogger logger)
- {
- _logger = logger;
-
- _client = client;
- _client.BaseAddress = new Uri("https://restcountries.com/v3.1");
-
- _serializerOptions = new()
- {
- PropertyNameCaseInsensitive = true
- };
- }
-
- public async Task GetCountry(string country)
- {
- string query = $"name/{country}";
-
- HttpResponseMessage res = await _client.GetAsync(query);
-
- if (res.IsSuccessStatusCode)
- {
- string resString = await res.Content.ReadAsStringAsync();
-
- List countryResponse = JsonSerializer.Deserialize>(resString, _serializerOptions);
-
- return countryResponse.Any() ? countryResponse.First() : null;
- }
- else
- {
- _logger.LogError("Retrieving country {country} failed with status code {statusCode}", country, res.StatusCode);
- return null;
- }
- }
- }
-}
-
-```
-
-
-Øverst i filen finner du referanser til alle namespace som klassen er avhengig av.
-
-```cs
-using System;
-using System.Linq;
-using System.Net.Http;
-using System.Text.Json;
-using System.Threading.Tasks;
-
-using Altinn.App.models;
-
-using Microsoft.Extensions.Logging;
-```
-
-Videre definerer vi klassen og hvilket interface den arver fra.
-
-```cs
-public class CountryClient : ICountryClient
-```
-
-Videre er tre private objekter __client_, __logger og __serializerOptions_.
-
-```cs
-private readonly HttpClient _client;
-private readonly ILogger _logger;
-private readonly JsonSerializerOptions _serializerOptions;
-```
-
-Understrek foran navnet er kun en navnekonvensjon og har ingen effekt.
-- __client_ vil i konstruktøren populeres med en HTTP-klient.
-- __logger_ vil i konstruktøren populeres med en logger slik at man kan logge feilmeldinger og annet i klassen.
-- __serializerOptions_ vil i konstruktøren instansieres og konfigureres for å kunne deserialisere responsen fra API-et.
-
-Videre i klassen defineres konstruktøren.
-
-```cs
-public CountryClient(HttpClient client, ILogger logger)
-{
- _logger = logger;
- _client = client;
- _client.BaseAddress = new Uri("https://restcountries.com/v3.1");
-
- _serializerOptions = new()
- {
- PropertyNameCaseInsensitive = true
- };
-}
-```
-
-Objekter populeres dersom de kommer som input i konstruktøren og andre objekter instansieres.
-Skulle du ha behov for å bruke en av de andre servicene som er registeret i applikasjonen, er det bare å
-sende den inn i konstruktøren og opprette et privat objekt for å kunne ta det i bruk i klassen, slik vi har gjort
-med __logger_ eller __client_.
-
-
-Videre i klassen finner du implementasjonen av metoden `GetCountry`.
-
-```cs
-public async Task GetCountry(string country)
-{
- string query = $"name/{country}";
- HttpResponseMessage res = await _client.GetAsync(query);
-
- if (res.IsSuccessStatusCode)
- {
- string resString = await res.Content.ReadAsStringAsync();
-
- List countryResponse = JsonSerializer.Deserialize>(resString, _serializerOptions);
-
- return countryResponse.Any() ? countryResponse.First() : null;
- }
- else
- {
- _logger.LogError("Retrieving country {country} failed with status code {statusCode}", country, res.StatusCode);
- return null;
- }
-}
-```
-
-Her sjekker vi om statuskoden på API-kallet er en suksess-kode, før vi deserialiserer og returnerer objektet.
-Dersom det ikke er en suksess-statuskode logger vi en feil og returnerer null.
-
-## Registrere klienten i applikasjonen
-
-Når interface og klient er implementert kan den registreres i _App/Program.cs_ (.NET 6) eller i _App/Startup.cs_ (.NET 5) for bruk i applikasjonen.
-
-I `Program.cs` klassen legger vi til kodelinjen nedenfor.
-I tillegg må `using Altinn.App.client;` og `using Altinn.App.AppLogic.DataProcessing;` legges til øverst i filen.
-
-
-
-```C#
-void RegisterCustomAppServices(IServiceCollection services, IConfiguration config, IWebHostEnvironment env)
-{
- services.AddHttpClient();
- services.AddTransient();
- // Register your apps custom service implementations here.
-}
-```
-
-## Benytte klient i applikasjonslogikk
-
-For å berike skjemadata må vi koble klienten vår til logikken i _App/logic/DataProcessingHandler.cs_ i metoden _ProcessDataWrite_. Merk at for v7 av applikasjonsmalen er dette endret, se [dataprossessering](../../logic/dataprocessing/).
-
-Først må klienten tilgjengeliggjøres ved å _injecte_ den inn i konstruktøren til klassen.
-DataProcessingHandler har ingen konstruktør i utgangspunktet så den må opprettes i klassen.
-
-```cs
-public DataProcessingHandler()
-{
-}
-```
-
-Videre kan vi opprette et privat objekt for klienten, injecte den i konstruktøren og assigne den til det private objektet.
-Resultatet blir seende slik ut:
-
-```cs
-private readonly ICountryClient _countryClient;
-
-public DataProcessingHandler(ICountryClient countryClient)
-{
- _countryClient = countryClient;
-}
-```
-I tillegg må `using Altinn.App.client;` også legges til i denne filen.
-
-__countryClient_ er nå tilgjengelig i DataProcessingHandler, og vi er klare til å implementere logikken i ProcessDataWrite.
-
-{{%notice warning%}}
-
-**MERK**: Stateless apps kaller ikke på ProcessDataWrite. Bruk ProcessDataRead for stateless apps.
-{{%/notice%}}
-
-```cs
-public async Task ProcessDataWrite(Instance instance, Guid? dataId, object data)
-{
- if (data.GetType() == typeof(skjema))
- {
- skjema skjema = (skjema)data;
- if (!string.IsNullOrEmpty(skjema.land))
- {
- Country country = await _countryClient.GetCountry(skjema.land.Trim());
-
- if (country != null)
- {
- skjema.hovedstad = string.Join(",", country.Capital);
- skjema.region = country.Region;
- }
- else
- {
- skjema.hovedstad = skjema.region = string.Empty;
- }
-
- return true;
- }
- else
- {
- skjema.hovedstad = string.Empty;
- skjema.region = string.Empty;
- }
- }
- return await Task.FromResult(false);
-}
-```
-
-Prøver du å bygge applikasjonen nå, vil du få en feil.
-DataProcessingHandler instansieres i App.cs, så alle dependecies må også inn i denne filen
-og deretter sendes videre i konstruktøren til DataProcessingHandler.
-
-I filen _App/logic/App.cs_ gjøres følgende endringer:
-
-- Legg til en referanse til namespaces til klienten øverst i filen.
- ```cs
- using Altinn.App.client;
- ```
-- _Inject_ `ICountryClient` nederst i App.cs-konstruktøren.
-
- Dette er gjort på linje 14.
- ```cs {linenos=inline,hl_lines=[14]}
- public App(
- IAppResources appResourcesService,
- ILogger logger,
- IData dataService,
- IProcess processService,
- IPDF pdfService,
- IProfile profileService,
- IRegister registerService,
- IPrefill prefillService,
- IInstance instanceService,
- IOptions settings,
- IText textService,
- IHttpContextAccessor httpContextAccessor,
- ICountryClient countryClient) : base(
- appResourcesService,
- logger,
- dataService,
- processService,
- pdfService,
- prefillService,
- instanceService,
- registerService,
- settings,
- profileService,
- textService,
- httpContextAccessor)
- ```
-
-- Legg til countryClient i konstruktøren til DataProcessingHandler.
- ```cs
- _dataProcessingHandler = new DataProcessingHandler(countryClient);
- ```
-
-
-## Caching av responsdata
-
-En ulempe med eksempelet slik det står nå, er at for hver gang skjemaet lagres, vil man gjøre et kall
-mot endepunktet for å hente ut data.
-
-Det er rimelig å anta at et lands hovedstad og hvilken region
-det tilhører ikke vil endre seg hyppig. Har vi hentet informasjon om Norge kan vi lagre denne lokalt i applikasjonen
-i en tidsperiode, så vi slipper å gjøre kallet igjen.
-
-Kodeendringene beskrives ikke steg for steg, men er vist i sin helhet nedenfor.
-Det kreves kun endringer i _CountryClient.cs_.
-
-```cs
-using Altinn.App.models;
-
-using Microsoft.Extensions.Caching.Memory;
-using Microsoft.Extensions.Logging;
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net.Http;
-using System.Text.Json;
-using System.Threading.Tasks;
-
-namespace Altinn.App.client
-{
- public class CountryClient : ICountryClient
- {
- private readonly HttpClient _client;
- private readonly ILogger _logger;
- private readonly JsonSerializerOptions _serializerOptions;
- private readonly IMemoryCache _memoryCache;
- private readonly MemoryCacheEntryOptions _cacheOptions;
-
- public CountryClient(HttpClient client, ILogger logger, IMemoryCache memoryCache)
- {
- _logger = logger;
-
- _client = client;
- _client.BaseAddress = new Uri("https://restcountries.com/v3.1/");
-
- _serializerOptions = new()
- {
- PropertyNameCaseInsensitive = true
- };
-
- _memoryCache = memoryCache;
- _cacheOptions = new()
- {
- AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(24)
- };
- }
-
- public async Task GetCountry(string country)
- {
- string uniqueCacheKey = "Country_" + country;
-
- // Check if country is present in cache, if so return from cache
- if (_memoryCache.TryGetValue(uniqueCacheKey, out Country outputCountry))
- {
- return outputCountry;
- }
-
- string query = $"name/{country}";
-
- HttpResponseMessage res = await _client.GetAsync(query);
-
- if (res.IsSuccessStatusCode)
- {
- string resString = await res.Content.ReadAsStringAsync();
-
- List countryResponse = JsonSerializer.Deserialize>(resString, _serializerOptions);
-
- if (countryResponse.Any())
- {
- outputCountry = countryResponse.First();
-
- // Add response country to cache
- _memoryCache.Set(uniqueCacheKey, outputCountry, _cacheOptions);
- return outputCountry;
- }
- else
- {
- return null;
- }
- }
- else
- {
- _logger.LogError("Retrieving country {country} failed with status code {statusCode}", country, res.StatusCode);
- return null;
- }
- }
- }
-}
-```
-
diff --git a/content/app/development/api/consume/capital-app-example.gif b/content/app/development/api/consume/capital-app-example.gif
deleted file mode 100644
index 5fdc4ea8d1f..00000000000
Binary files a/content/app/development/api/consume/capital-app-example.gif and /dev/null differ
diff --git a/content/app/development/api/expose/_index.en.md b/content/app/development/api/expose/_index.en.md
deleted file mode 100644
index 5ffc0e1635e..00000000000
--- a/content/app/development/api/expose/_index.en.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-title: Exposing APIs from an app
-linktitle: Expose
-description: More APIs can be added than what is defined as the default API for applications developed in Altinn Studio.
-toc: false
----
-
-
-The applications that are developed in Altinn Studio are based on [ASP.NET Core](https://docs.microsoft.com/en-us/aspnet/core/introduction-to-aspnet-core) for back-end.
-This provides a highly flexible environment to change and modify the applications.
-
-
-## Adding an API controller
-
-To expose a new API to an application, you have to add one or more API controllers.
-
-Below is an example from an API controller which has been added to an app.
-This is where the API path listener is set up along with the API logic.
-
-
-```C# {linenos=false,hl_lines=[8,11]}
-using System;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Mvc;
-
-namespace Altinn.App.Api.Controllers
-{
- [ApiController]
- [Route("{org}/{app}/CustomApi")]
- public class CustomApiController : ControllerBase
- {
- [HttpGet("TimeInfo")]
- public async Task Get()
- {
- return Ok(DateTime.Now);
- }
- }
-}
-```
-
-![Test of API in web browser](apiresponse1.png "API response")
-
-The code can be viewed
-in [this repository](https://altinn.studio/repos/ttd/mva/src/branch/master/App/controllers/CustomApiController.cs).
-
-You can read more details about [the possibilities for exposing an API](https://docs.microsoft.com/en-us/aspnet/core/web-api/) in the documentation for ASP.NET.
diff --git a/content/app/development/api/expose/_index.nb.md b/content/app/development/api/expose/_index.nb.md
deleted file mode 100644
index ce9244031aa..00000000000
--- a/content/app/development/api/expose/_index.nb.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-title: Eksponere API fra en app
-linktitle: Eksponere
-description: Man kan legge til flere API enn det som er definert som standard API for applikasjoner utviklet i Altinn Studio.
-toc: false
----
-
-
-Applikasjonene som utvikles i Altinn Studio baserer seg i dag på [ASP.NET Core](https://docs.microsoft.com/en-us/aspnet/core/introduction-to-aspnet-core) for back-end.
-Dette gir høy fleksibiltet til å endre og modifisere applikasjonene.
-
-
-## Legge til en API-kontroller
-
-For å kunne eksponere et nytt API i en applikasjon, må det legges til én eller flere API-kontrollere.
-
-
-Nedenfor vises et eksempel fra en API-kontroller som er lagt til i en gitt app.
-Her settes det opp hvilken path API skal lytte på, og logikken knyttet til dette.
-
-
-```C# {linenos=false,hl_lines=[8,11]}
-using System;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Mvc;
-
-namespace Altinn.App.Api.Controllers
-{
- [ApiController]
- [Route("{org}/{app}/CustomApi")]
- public class CustomApiController : ControllerBase
- {
- [HttpGet("TimeInfo")]
- public async Task Get()
- {
- return Ok(DateTime.Now);
- }
- }
-}
-```
-
-![Test av API i nettleser](apiresponse1.png "API-respons")
-
-Koden kan ses i [dette repositoriet](https://altinn.studio/repos/ttd/mva/src/branch/master/App/controllers/CustomApiController.cs).
-
-I dokumentasjonen til ASP.NET kan du lese flere detaljer om [mulighetene for å eksponere API](https://docs.microsoft.com/en-us/aspnet/core/web-api/).
diff --git a/content/app/development/api/expose/apiresponse1.png b/content/app/development/api/expose/apiresponse1.png
deleted file mode 100644
index 924ba978710..00000000000
Binary files a/content/app/development/api/expose/apiresponse1.png and /dev/null differ
diff --git a/content/app/development/api/instance/_index.en.md b/content/app/development/api/instance/_index.en.md
deleted file mode 100644
index b51cc9fece5..00000000000
--- a/content/app/development/api/instance/_index.en.md
+++ /dev/null
@@ -1,77 +0,0 @@
----
-title: Instance
-linktitle: Instance
-description: How to make changes to application instances
-toc: true
----
-
-⚠️ This page is currently incomplete and more information will be provided at a later date.
-
-An instantiated application will have a corresponding instance object. This object contains metadata about the specific
-instance.
-If you want to learn more about the instance and the affiliated API, you can read the technical documentation about this
-under [API](../../../../api).
-
-## Sub status
-
-As an app-owner you can set a sub status for the instance. This gives the end user more information about the
-current state of the instance.
-The sub status is displayed both in the Altinn message box and on the receipt page.
-
-The sub status is an object which can be set in the instance object. How this is done is described under [API](../../../../api).
-Sub status is a simple object which contains `label` and `description`. These fields can either contain plain text, or a
-text key that refers to the application
-texts. It is worth noting that variables in text are not supported for these texts.
-In the message box, `label` is displayed in its entirety if it contains 25 symbols or fewer. If `label` contains more that 25 symbols, only the first 22 symbols
-will be displayed and "..." will be added to the end.
-
-Example of a status object:
-```json
-{
- "label": "some.label",
- "description": "Description in clear text"
-}
-```
-
-Below you see an example of how sub status looks like in the message box and in the receipt where the sub status is set
-up in the following way:
-```json
-{
- "label": "Accepted",
- "description": "Your application has been accepted by the king."
-}
-```
-
-![Substatus in message box](meldingsboks.png "Substatus in message box")
-
-![Substatus in receipt](app.png "Substatus in receipt")
-
-## Automatic deletion of drafts
-
-As an application owner you may want to delete a user's draft after a certain period of time.
-To achieve this, three steps are required:
-
-1. Configure the application to allow the service owner to delete instances.
-2. Identify which instances are incomplete by querying storage.
-3. Delete the instance through an exposed endpoint within the application.
-
-### Step 1: Configure the application
-
-Service owners are by default not allowed to delete instances.
-To get the required permissions, a rule must be added to `policy.xml` in `App/config/authorization`.
-The rule can be copied from our [rule library](../../configuration/authorization/rules/#org-can-delete-an-instance-of-orgapp-in-any-task-or-event).
-
-### Step 2: Identify incomplete instances by sending a request to storage
-
-Storage exposes a set of query parameters which can be used to retrieve a set of instances.
-The example below retrieves all non-submitted instances of an application that was instantiated on the 30th of September 2020 or earlier.
-
-You can experiment with query parameters for your service here:
-
-`HTTP GET https://platform.altinn.no/storage/api/v1/instances?appId={org}/{app}&created=lte:2020-09-30&process.currentTask=Task_1`
-
-### Step 3: Delete instance through endpoint exposed in the application
-
-After identifying the instances that are to be deleted, you can send a call with the instance ID (instanceOwner.partyId/instanceGuid) to the application to delete them.
-
-`HTTP DELETE https://ttd.apps.altinn.no/ttd/apps-test/instances/{instanceOwner.partyId}/{instanceGuid}`
diff --git a/content/app/development/api/instance/_index.nb.md b/content/app/development/api/instance/_index.nb.md
deleted file mode 100644
index 20938d9d1f5..00000000000
--- a/content/app/development/api/instance/_index.nb.md
+++ /dev/null
@@ -1,73 +0,0 @@
----
-title: Instans
-linktitle: Instans
-description: Hvordan gjøre endringer på applikasjonsinstanser
-toc: true
----
-
-⚠️ Denne siden er foreløpig ikke fullstendig. Mer informasjon vil komme på et senere tidspunkt.
-
-En instansiert applikasjon vil ha et tilhørende instansobjekt. Dette objektet inneholder metadata om den spesifikke instansen.
-Om du ønsker å lære mer om instans og API-et rundt, så kan du lese teknisk dokumentasjon om dette under [API](../../../../api).
-
-
-## Substatus
-
-Som app-eier kan man sette en substatus på instansen. Dette er for å kunne gi sluttbruker ytterligere informasjon om hvilken tilstand instansen befinner seg i.
-Substatus vil vises frem både i meldingsboksen i Altinn og på kvitteringssiden.
-
-Substatusen er et objekt som kan settes på instansobjektet. Hvordan dette gjøres står beskrevet under [API](../../../../api).
-Substatus er et enkelt objekt som inneholder `label` og `description`. Disse feltene kan enten inneholde ren tekst, eller en tekstnøkkel som referer til applikasjonstekstene. Det er verdt å merke seg at variabler i tekst støttes ikke for disse tekstene.
-I meldingsboksen vises `label` i sin helhet hvis den har en lengde på inntil 25 tegn. Hvis `label` består av mer enn 25 tegn, vises bare de 22 første tegnene, og "..." legges på til slutt.
-
-Eksempel på et substatus-objekt:
-```json
-{
- "label": "some.label",
- "description": "Beskrivelse i klartekst"
-}
-```
-
-Under ser du eksempel på hvordan substatus ser ut i meldingsboksen og i kvitteringen, når substatusen settes opp slik:
-```json
-{
- "label": "Godkjent",
- "description": "Din søknad er godkjent av kongen."
-}
-```
-
-![Substatus i meldingsboks](meldingsboks.png "Substatus i meldingsboks")
-
-![Substatus i kvitteringen](app.png "Substatus i kvitteringen")
-
-## Automatisert sletting av utkast
-
-Som applikasjonseier kan man i noen tilfeller ønske å slette sluttbrukerens utkast av en tjeneste dersom det har gått en viss tid siden instansiering.
-For å oppnå dette, er det tre steg som må tas.
-
-1. Konfigurér applikasjonen slik at tjenesteeier har lov til å slette instanser.
-2. Identifisér hvilke instanser som ikke er fullført ved hjelp av spørring mot storage.
-3. Slett instans via endepunkt eksponert i applikasjonen.
-
-### Steg 1: Konfigurér applikasjonen
-
-Som standard har ikke tjenesteeier lov til å slette instanser knyttet til en applikasjon.
-For å få lov til dette, må det legges til en ny regel i `policy.xml` som finnes i `App/config/authorization`.
-Regelen kan kopieres fra [regelbiblioteket](../../configuration/authorization/rules/#org-kan-slette-en-instans-av-orgapp-uavhengig-av-hvor-den-er-i-prosessen).
-
-### Steg 2: Identifisér hvilke instanser som ikke er fullført ved hjelp av spørring mot storage
-
-Storage eksponerer et sett med queryparametere som kan brukes for å hente ut et sett med instanser.
-I eksempelet nedenfor får man ut alle instanser som er instansiert av en gitt applikasjon 30. september 2020 eller tidligere,
-og som enda står i utfyllingssteget.
-
-Her kan man prøve seg litt fram for å finne de rette queryparameterene for akkurat deres tjeneste:
-
-`HTTP GET https://platform.altinn.no/storage/api/v1/instances?appId={org}/{app}&created=lte:2020-09-30&process.currentTask=Task_1`
-
-### Steg 3: Slett instans via endepunkt eksponert i applikasjonen
-
-Når man har identifisert instansene som skal slettes, er det bare å sende et kall
-til applikasjonen for å få slettet disse. Da må ID på instansene (instanceOwner.partyId/instanceGuid) oppgis.
-
-`HTTP DELETE https://ttd.apps.altinn.no/ttd/apps-test/instances/{instanceOwner.partyId}/{instanceGuid}`
diff --git a/content/app/development/api/instance/app.png b/content/app/development/api/instance/app.png
deleted file mode 100644
index 8cf3a47f922..00000000000
Binary files a/content/app/development/api/instance/app.png and /dev/null differ
diff --git a/content/app/development/api/instance/meldingsboks.png b/content/app/development/api/instance/meldingsboks.png
deleted file mode 100644
index 9a5ddd501ad..00000000000
Binary files a/content/app/development/api/instance/meldingsboks.png and /dev/null differ
diff --git a/content/app/development/configuration/_index.en.md b/content/app/development/configuration/_index.en.md
deleted file mode 100644
index 040bc4a668c..00000000000
--- a/content/app/development/configuration/_index.en.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Configuration
-description: Configuring different aspects of an app.
-weight: 40
----
-
-{{}}
\ No newline at end of file
diff --git a/content/app/development/configuration/_index.nb.md b/content/app/development/configuration/_index.nb.md
deleted file mode 100644
index 2f8a505f0bf..00000000000
--- a/content/app/development/configuration/_index.nb.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Konfigurasjon
-description: Konfigurering av ulike aspekter av en app.
-weight: 40
----
-
-{{}}
\ No newline at end of file
diff --git a/content/app/development/configuration/authentication/_index.en.md b/content/app/development/configuration/authentication/_index.en.md
deleted file mode 100644
index bfad8fd9f74..00000000000
--- a/content/app/development/configuration/authentication/_index.en.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-title: Configuration of authentication
-linktitle: Authentication
-description: Some configurations can be useful when it comes to authentication
-weight: 800
----
-
-
-## Authentication level
-
-Required authentication level is set in the [XACML Policy](../authorization/) as an obligation.
-
-## ID-provider
-
-It is possible to set up that an app will use a special ID-provider which is not the standard option. The standard option is ID-porten / Altinn's login.
-
-Currently the only approved ID-providers are:
-
-- [FEIDE](https://www.feide.no/)
-- [UIDP](https://www.udir.no/verktoy/uidp/)
-
-Use of OIDC provider is set in appSettings
-
-```json
- "AppOidcProvider": "uidp"
-```
-
-
-Read more about OIDC support under [architecture](/technology/architecture/capabilities/runtime/security/authentication/oidcproviders/).
-
diff --git a/content/app/development/configuration/authentication/_index.nb.md b/content/app/development/configuration/authentication/_index.nb.md
deleted file mode 100644
index c5a42d3aa58..00000000000
--- a/content/app/development/configuration/authentication/_index.nb.md
+++ /dev/null
@@ -1,26 +0,0 @@
----
-title: Konfigurasjon av autentisering
-linktitle: Autentisering
-description: Når det gjelder autentisering er det noen konfigurasjoner som kan være aktuell
-weight: 800
-tags:
----
-## Autentiseringsnivå
-
-Påkrevd autentiseringsnivå settes i [XACML Policy](../authorization) som obligation.
-
-## ID-provider
-
-Det er mulig å sette at app skal bruke en spesiell ID-provider som ikke er standardvalget. Standarvalg betyr ID-porten / Altinn pålogging.
-
-De eneste godkjente ID-providerene for øyeblikket er
-
-- [FEIDE](https://www.feide.no/)
-- [UIDP](https://www.udir.no/verktoy/uidp/)
-
-Bruk av OIDC provider settes i appSettings
-
-```json
- "AppOidcProvider": "uidp"
-```
-Les mer om OIDC støtten under [arkitektur](/technology/architecture/capabilities/runtime/security/authentication/oidcproviders/).
diff --git a/content/app/development/configuration/authorization/Guidelines b/content/app/development/configuration/authorization/Guidelines
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/content/app/development/configuration/authorization/_index.en.md b/content/app/development/configuration/authorization/_index.en.md
deleted file mode 100644
index 513e16cc221..00000000000
--- a/content/app/development/configuration/authorization/_index.en.md
+++ /dev/null
@@ -1,131 +0,0 @@
----
-title: Defining Authorization Policy
-linktitle: Authorization
-description: In Altinn Studio designer, the application developer can define the policy for the application created
-weight: 100
----
-
-The application developer defines the authorization rules for an application in an XACML policy file placed in the app repository. The XACML Policy contains one or more rules which determine who can perform different actions on different resources.
-You can edit the XACML file in a text editor of your choice.
-
-## Rules from the application template
-
-When you create an app in Altinn studio, it is based on the current asp.net template and will include an autogenerated [XACML policy file](https://raw.githubusercontent.com/Altinn/altinn-studio/master/src/studio/AppTemplates/AspNet/App/config/authorization/policy.xml).
-
-The application developer can change the authorization rules in *policy.xml*, which lies in `App/config/authorization` in the application repository.
-You can find details about configuring the policy file below.
-You can also find a good amount of example rules [here](rules).
-
-{{%notice warning%}}
-Please note that changes to the policy file are at your own risk and that it is always recommended to delegate read permissions to entities with writing permissions.
-{{% /notice%}}
-
-## Resource Attributes
-
-The resource attributes of rules describe which application or part of the rules apply.
-
-| Attribute | Description |
-| ------------ | ----------------------------------------------------------------------------------------------------- |
-| urn:altinn:org | The org part of the resource attribute defines which org that owns the app. |
-| urn:altinn:app | The app part that identifies the app itself. |
-| urn:altinn:task | The task part of the resource makes it possible to have separate rules for the different tasks. |
-| urn:altinn:event | The event part of the resource makes it possible to have separate rules for reading events. |
-
-### Example
-
-The below example shows a part of the XACML 3.0 Policy where a resource is defined.
-
-```xml {linenos=false,hl_lines=[3,7,11]}
-
-
- skd
-
-
-
- taxreport
-
-
-
- instansiate
-
-
-
-```
-
-## Subject Attributes
-
-The subject part of the target for the rule defines who the rule target.
-
-| Attribute | Description |
-| --------- | ----------------------------------------------------------------- |
-| urn:altinn:rolecode | The role code is used for rule that target end users and systems. |
-| urn:altinn:org | The org code is used for rule that target orgs. |
-
-A complete list of role types can be found [here](https://www.altinn.no/api/metadata/roledefinitions).
-
-**It is important to read the [guidelines](guidelines_authorization) before selecting role.**
-
-### Examples
-
-Example with role code:
-
-```xml {linenos=false,hl_lines=[3]}
-
-
- regna
-
-
-
-```
-
-Example with org:
-
-```xml {linenos=false,hl_lines=[3]}
-
-
- skd
-
-
-
-```
-
-## Action Attributes
-
-| Attribute | Description |
-| --------- | ----------------------------------------------------------------- |
-| urn:oasis:names:tc:xacml:1.0:action:action-id | The action that rule apply to. In [app](https://github.com/Altinn/app-lib-dotnet/blob/main/src/Altinn.App.Api/Extensions/ServiceCollectionExtensions.cs#L96) this can be read, write, instantiate, complete and delete. This will be expanded when new functionality is added |
-
-Example with read action:
-
-```xml {linenos=false,hl_lines=[2]}
-
- read
-
-
-
-```
-
-## Obligation
-
-The obligation part is used to define information that should be used by PEP. The required authentication level is set
-to 2 by default. This is done as an obligation in the XACML Policy file.
-
-If the required authentication level is set to 4, you must define that the service owner can interact with it through
-level 3 authentication for Maskinporten.
-This is because Maskinporten is defined as level 3. See the rule library for examples.
-
-Example with authentication level 2
-
-```xml {linenos=false,hl_lines=[4]}
-
-
-
- 2
-
-
-
-```
-
-
-
-{{}}
diff --git a/content/app/development/configuration/authorization/_index.nb.md b/content/app/development/configuration/authorization/_index.nb.md
deleted file mode 100644
index 218b55cfa69..00000000000
--- a/content/app/development/configuration/authorization/_index.nb.md
+++ /dev/null
@@ -1,130 +0,0 @@
----
-title: Definere autorisasjonspolicy
-linktitle: Autorisasjon
-description: I Altinn Studio designer kan applikasjonsutvikleren definere policyen for applikasjonen som er opprettet
-weight: 100
----
-
-
-Applikasjonsutvikleren definerer autorisasjonsreglene for en applikasjon i en XACML-policyfil som er plassert i applageret. XACML-policyen inneholder en eller flere regler som bestemmer hvem som kan utføre forskjellige handlinger på forskjellige ressurser.
-Du kan redigere XACML-filen i et tekstredigeringsprogram etter eget valg.
-
-## Regler fra applikasjonsmal
-
-Når du oppretter en app i Altinn studio, er den basert på gjeldende asp.net-mal og vil inkludere en autogenerert [XACML policy-fil](https://raw.githubusercontent.com/Altinn/altinn-studio/master/src/studio/AppTemplates/AspNet/App/config/authorization/policy.xml).
-
-Applikasjonsutvikleren kan endre autorisasjonsreglene i *policy.xml*, som ligger i `App/config/authorization` i programlageret.
-Du kan finne detaljer om konfigurering av policyfilen nedenfor.
-Du kan også finne en god mengde eksempler på regler [her](rules).
-
-{{%notice warning%}}
-Vær oppmerksom på at endringer i policyfilen er på egen risiko og at det alltid anbefales å delegere lesetillatelser til enheter med skrivetillatelser.
-{{% /notice%}}
-
-## Ressursattributtene
-
-Ressursattributtene til regler beskriver hvilken applikasjon eller del av reglene som gjelder.
-
-| Attribute | Description |
-| ------------ | ----------------------------------------------------------------------------------------------------- |
-| urn:altinn:org | Organisasjonsdelen av ressursattributtet definerer hvilken organisasjon som eier appen. |
-| urn:altinn:app |Appdelen som identifiserer selve appen |
-| urn:altinn:task | Oppgavedelen av ressursen gjør det mulig å ha egne regler for de ulike oppgavene. |
-| urn:altinn:event |Arrangementsdelen av ressursen gjør det mulig å ha egne regler for lesing av hendelser. |
-
-### Eksempel
-
-Eksempelet nedenfor viser en del av XACML 3.0-policyen der en ressurs er definert.
-
-```xml {linenos=false,hl_lines=[3,7,11]}
-
-
- skd
-
-
-
- taxreport
-
-
-
- instansiate
-
-
-
-```
-
-## Subjektattributene
-
-Subjektdelen for regelen definerer hvem regelen er rettet mot.
-
-| Attribute | Description |
-| --------- | ----------------------------------------------------------------- |
-| urn:altinn:rolecode | The role code is used for rule that target end users and systems. |
-| urn:altinn:org | The org code is used for rule that target orgs. |
-
-En fullstendig liste over rolletyper finner du [her](https://www.altinn.no/api/metadata/roledefinitions).
-
-**Det er viktig å lese [Veiledning for autorisasjonsregler](guidelines_authorization) før du velger rolle.**
-
-### Examples
-
-Eksempel med rollekode
-
-```xml {linenos=false,hl_lines=[3]}
-
-
- regna
-
-
-
-```
-
-Eksempel med org:
-
-```xml {linenos=false,hl_lines=[3]}
-
-
- skd
-
-
-
-```
-
-## Action attributter
-
-Action attributtene beskriver hvilken operasjon regelen gjelder
-
-| Attribute | Description |
-| --------- | ----------------------------------------------------------------- |
-| urn:oasis:names:tc:xacml:1.0:action:action-id | Handlingen som regelen gjelder for. I [appen](https://github.com/Altinn/app-lib-dotnet/blob/main/src/Altinn.App.Api/Extensions/ServiceCollectionExtensions.cs#L96) kan dette være read, write, instantiate, complete aog delete. Dette vil bli utvidet når ny funksjonalitet legges til|
-
-Eksempel med read operasjon.
-
-```xml {linenos=false,hl_lines=[2]}
-
- read
-
-
-
-```
-
-## Obligation
-
-Obligation delen av policy brukes til å definere informasjon som skal brukes av PEP. Det nødvendige autentiseringsnivået er satt til 2 som standard. Dette gjøres som en forpliktelse i XACML Policy-filen.
-
-Hvis nødvendig autentiseringsnivå er satt til 4, må du definere at tjenesteeier kan samhandle med det gjennom nivå 3 autentisering for Maskinporten.
-Dette fordi Maskinporten er definert som nivå 3. Se regelbiblioteket for eksempler.
-
-Eksempel med autentiseringsnivå 2
-
-```xml {linenos=false,hl_lines=[4]}
-
-
-
- 2
-
-
-
-```
-
-{{}}
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/_index.en.md b/content/app/development/configuration/authorization/guidelines_authorization/_index.en.md
deleted file mode 100644
index 74c347b957b..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/_index.en.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-title: Guidelines for authorization rules
-linktitle: Guidelines
-description: Authorization rules must be defined very carefully. These guidelines explain what the application owner must consider before authorization rules are set for an application
-toc: true
----
-
-
-Authorization rules are defined in accordance to the XACML 3.0 standard. The rules will define the conditions that must
-be met in order to give
-a certain user access to perform one or more steps of an
-application [defined work process](/app/development/configuration/process/).
-
-## Make sure you know what you are doing!
-The owner of the service is responsible for creating authorization rules and choosing the right roles that grant access to protected information.
-Although the XACML standard gives the developer great freedom to define rules and choose the roles they want, these guidelines must be followed to ensure that the particular
-user access to the application is correct and works as intended.
-
-In order to make the right choices for creating authorization rules for you app you need an overall understanding of how Altinn Authorization works and how it is used to control access.
-At this [page](https://altinn.github.io/docs/utviklingsguider/styring-av-tilgang/for-tjenesteeier/) you can read more about Altinn Authorization.
-
-## Roles must be chosen with care!
-In the authorization configuration file, roles are used to define who is allowed to perform which actions.
-Altinn offers a set of roles required as a condition to access a specific step in the workflow and information displayed.
-
-Before choosing which role to use, make sure you have sufficient understanding of what these roles mean and what kind of services and information this role is expected to have access to.
-It is important that authorization rules and the choice of roles match the intentions and expectations of the administrator for the party.
-For example, the administrator probably expects that the role "Tax" gives access to services related to, for example, tax reporting, but simultaneously needs to avoid any role giving access to services within payroll and the personnel area.
-Similarly, please be careful about using, for example, the role "Contact Person" from the Entity Register to grant access to services - unless the basis for using this role has been thoroughly evaluated.
-
-## Do NOT change authorization rules after production launch
-Changes to authorization rules after a production release will render existing users unable to access the service and must have the new role delegated and any previous role deleted.
-This will impose an unexpected administrative burden on businesses that will use the service because they will then have to clean up delegations made based on the old policy. Such a practice will usually result in dissatisfied users of the application.
-
-## Contact us - we will gladly provide assistance
-
-As application owner you must always consider if the intentions in the description of the role are consistent with the
-service or access to data that your application provides.
-{{%notice warning%}}
-Giving wrong people access to data they shouldn't have is never good marketing for your service and we therefore
-strongly suggest you contact Altinn for guidance in choosing roles and setting up authorization rules if you have the
-slightest doubt.
-{{% /notice%}}
-
-## Authorization rules must be tested
-Authorization rules, like everything else, must be tested before the application is launched to verify that the correct roles have access to the necessary data.
-
-[Here](test_authorization_application) you can read our recommendations related to testing authorization rules.
-
-## Altinn can impose changes to the authorization rules
-Although it is the application owner's responsibility to construct the correct authorization rule and select the correct roles, Altinn will supervise or carry out spot checks with the authorization rules for services that are put into production.
-If we discover what we consider incorrect use of Altinn Authorization, we may choose to intervene and remove the service from production or impose changes in the authorization rules.
-
-
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/_index.nb.md b/content/app/development/configuration/authorization/guidelines_authorization/_index.nb.md
deleted file mode 100644
index 856fce663a6..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/_index.nb.md
+++ /dev/null
@@ -1,52 +0,0 @@
----
-title: Veiledning for autorisasjonsregler
-linktitle: Veiledning
-description: Autorisasjonsregler må defineres med omhu. Disse retningslinjene forteller hva applikasjonseier må vurdere før autorisasjonsregler settes for en applikasjon
-toc: true
----
-
-Autorisasjonsregler defineres i henhold til XACML 3.0-standarden. Reglene vil angi hvilke betingelser som må være til stede for å gi
-en bestemt bruker tilgang til å utføre ett eller flere trinn i en applikasjons [definerte arbeidsprosess](/app/development/configuration/process/).
-
-## Du må vite hva du gjør!
-Eier av tjenesten er selv ansvarlig for å lage autorisasjonsregler og velge riktige roller som gir tilgang til beskyttet informasjon.
-Selv om XACML-standarden gir utvikleren stor frihet til å definere regler og velge de roller man ønsker, så må disse retningslinjene følges for å sikre at
-tilgang til applikasjonen er korrekt og fungerer etter hensikten.
-
-For å ta de riktige valgene når du lager autorisasjonsregler for appen din trenger du en generell forståelse av hvordan Altinn Autorisasjon fungerer og hvordan den brukes til å kontrollere tilgang.
-På denne [siden](https://altinn.github.io/docs/utviklingsguider/styring-av-tilgang/for-tjenesteeier/) kan du lese mer om Altinn Autorisasjon.
-
-## Roller må velges med omhu!
-I konfigurasjonsfil for autorisasjon brukes roller for å definere hvem som har lov til å utføre hvilke handlinger.
-Altinn tilbyr et sett med roller som kan brukes som betingelse for å få tilgang til et bestemt trinn i arbeidsprosessen og informasjon som vises.
-
-Før du velger hvilken rolle du skal bruke, må du være sikker på at du har en god forståelse av hva disse rollene betyr og hva slags tjenester og informasjon som forventes at denne rollen har tilgang til.
-Det er viktig at autorisasjonsregler og valg av roller samsvarer med intensjoner og forventninger som administrator for aktøren har.
-For eksempel forventer antagelig admnistrator at rollen "Skatt" gir tilgang til tjenester knyttet til for eksempel skatterapportering, men ikke at denne rollen gir tilgang til tjenester innen Lønn og personalområdet.
-På samme måte skal man være forsiktig med å bruke for eksempel rollen "Kontaktperson" fra Enhetsregisteret til å gi tilgang til tjenester med mindre man har vurdert grunnlaget for at denne får tilgang på en grundig måte.
-
-Hvis du ikke finner en rolle du synes passer må du ta kontakt med Altinn slik at vi kan vurdere om nye roller bør opprettes.
-
-[Her](roles_and_rights) kan du lese mer om hvilke roller som finnes i Altinn.
-
-## Unngå endringer av autorisasjonsregler etter produksjonssetting
-Endringer i autorisasjonsregler i etterkant av en produksjonssetting vil medføre at f eks brukere som har fått tilgang til tjenesten gjennom delegering av en rolle som tidligere var satt på tjenesten senere kanskje ikke får utført tjenesten allikevel.
-
-Dette vil pålegge virksomheter som skal bruke tjenesten en administrasjonsbyrde fordi de da må rydde opp i delegeringer gjort med utgangspunkt i gammel policy. En slik praksis vil som regel gi misfornøyde brukere av applikasjonen.
-
-## Be om hjelp!
-Som applikasjonseier må du alltid vurdere om intensjonene i beskrivelsen av rollen stemmer overens med tjenesten eller tilgangen til data som applikasjonen din gir.
-{{%notice warning%}}
-Å gi feil personer tilgang til data de ikke burde ha er ingen god markedsføring for tjenesten din. Vi anbefaler deg derfor sterkt å kontakte Altinn for veiledning i valg av roller og oppsett av autorisasjonsregler hvis du er usikker.
-{{% /notice%}}
-
-## Autorisasjonsregler må testes
-Autorisasjonsregler må som alt annet testes før applikasjonen lanseres for å verifisere at riktige roller har tilgang til nødvendig data.
-
-[Her](test_authorization_application) kan du lese våre anbefalinger knyttet til testing av autorisasjonsregler.
-
-
-## Altinn kan pålegge å endre autorisasjonsregler
-Selv om det er applikasjonseierens ansvar å konstruere riktig autorisasjonsregel og velge riktige roller, vil Altinn gjennomføre stikkkontroller med autorisasjonsreglene for tjenester som settes i produksjon.
-Hvis vi oppdager det vi anser som feil bruk av Altinn Autorisasjon så vil vi, om nødvendig, ta tjenesten ut av produksjon eller pålegge endringer i autorisasjonsregler.
-
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/_index.en.md b/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/_index.en.md
deleted file mode 100644
index e794c8a8b8e..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/_index.en.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Roles used in Altinn
-linktitle: Altinn Roles
-description:
-toc: true
----
-To be translated...
\ No newline at end of file
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/_index.nb.md b/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/_index.nb.md
deleted file mode 100644
index ad456b548f1..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/_index.nb.md
+++ /dev/null
@@ -1,48 +0,0 @@
----
-title: Roller som benyttes i Altinn
-linktitle: Roller
-description: Denne siden inneholder informajson om hvilke typer roller Altinn har som kan brukes til å gi tilgang til en applikasjon
-toc: true
----
-
-En rolle er en type fullmakt en bruker har på vegne av [aktøren](/technology/terms/#actor) som bruker skal opptre på vegne av.
-Roller kan gis til personer eller virksomheter. Disse identifiseres med fødselsnummer (fra Folkeregisteret) eller organisasjonsnummer (fra Enhetsregisteret).
-Det finnes to hovedtyper av roller som man kan knytte en autorisasjonsregel til: Eksterne roller og Altinn roller.
-
-## Eksterne roller
-Informasjon om eksterne roller hentes fra ulike offentlige og autorative register.
-Fullmakten som disse rollene gir er regulert gjennom lover og forskrifter som legitimerer at en rolleinnehaver automatisk skal gis tilgang til bestemte tjenester eller data på vegne av aktør.
-Det er ansvarlig etat som sammen med Altinns forvaltning som bestemmer hvilke fullmakter det er naturlig at en ekstern rolle får i Altinn.
-
-Eksterne roller for en aktør kan bare endres av den ansvarlige virksomheten som eier det autorative registeret.
-Altinn benytter roller fra følgende autorative register:
-
-
-#### Roller fra [Enhetsregisteret](https://www.brreg.no/om-oss/registrene-vare/om-enhetsregisteret/)
-Disse rollene benyttes når [aktøren](/technology/terms/#actor) er en virksomhet.
-Du kan lese mer om hvilke roller fra Enhetsregisteret som benyttes i Altinn [her](roles_er)
-
-#### Roller fra [Skatteeaten](https://www.skatteetaten.no/)
-Disse rollene benyttes når [aktøren](/technology/terms/#actor) er en virksomhet eller person
-Du kan lese mer om hvilke roller fra Skatteetaten som benyttes [her](roles_ske)
-
-#### Roller fra [Arbeidsgiver- og arbeidstakerregisteret](https://www.nav.no/no/bedrift/tjenester-og-skjemaer/aa-registeret-og-a-meldingen)
-Dette er ikke implmentert i dag men ligger i backlogg som ny kilde til eksterne roller
-
-#### Roller om [Vergemål fra Statens sivilrettsforvaltning](https://www.sivilrett.no/vergemaalsordninga.556842.no.html)
-Dette er ikke implmentert i dag men ligger i backlogg som ny kilde til eksterne roller
-#### Roller om [Foreldreansvar](https://www.skatteetaten.no/person/folkeregister/fodsel-og-navnevalg/foreldreansvar/)
-Dette er ikke implmentert i dag men ligger i backlogg som ny kilde til eksterne roller
-#### Roller fra [Advokatregisteret hos Tilsynsrådet for Advokater](https://tilsynet.no/register)
-Dette er ikke implmentert i dag men ligger i backlogg som ny kilde til eksterne roller
-
-## Altinn roller
-Disse rollene benyttes når [aktøren](/technology/terms/#actor) er en virksomhet eller person.
-Altinn roller kan (i motsetning til eksterne roller) administres og endres via Altinn Profile av administrator for [aktøren](/technology/terms/#actor).
-
-Du kan lese mer om hvilke roller fra Skatteetaten som benyttes [her](roles_altinn)
-
-## API for rolleinformasjon
-Det finnes et API for å slå opp informasjon om aller roller som er registrert i Altinn 2.
-Dokumentasjon av API finnes [her](https://altinn.github.io/docs/api/rest/metadata/) under overskriften "Hente metadata om rolledefinisjoner i Altinn".
-APIet er åpen to tilgjengelig for alle på lenken [https://www.altinn.no/api/metadata/roledefinitions](https://www.altinn.no/api/metadata/roledefinitions).
\ No newline at end of file
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_ER/_index.en.md b/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_ER/_index.en.md
deleted file mode 100644
index 264ef261f4e..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_ER/_index.en.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Roles from Enhetsregisteret
-linktitle: ER-Roles
-description:
-toc: true
----
-To be translated...
\ No newline at end of file
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_ER/_index.nb.md b/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_ER/_index.nb.md
deleted file mode 100644
index 9f54d35d64a..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_ER/_index.nb.md
+++ /dev/null
@@ -1,62 +0,0 @@
----
-title: Roller fra Enhetsregisteret
-linktitle: ER-Roller
-description: Denne siden beskriver roller fra Enhetsregisteret som kan benyttes til å gi tilgang til en applikasjon.
-toc: true
----
-
-
-I Enhetsregisteret er det offisielle registeret over virksomheter i Norge. I registeret kan man registrere ulike [organisasjonsformer](https://www.brreg.no/bedrift/organisasjonsformer/) og til de ulike typene finnes forskjellige roller.
-
-Når man velger roller er det derfor viktig å vurdere hvilke typer organisasjoner som skal benytte tjenesten og med det hvilke roller man må knytte til tjenesten for å gi disse tilgang
-
-Fullstendig oversikt over organisasjonsformer og roller som leses inn fra Enhetsregisteret finner du på [Fullmakter fra Enhetsregisteret](/authorization/what-do-you-get/accessgroups/register_er/)
-
-
-## Nøkkelroller
-Altinn har definert et sett med nøkkelroller. Dette er roller som vurderes å ha et særskilt og overordnet ansvar for virksomheten.
-Nøkkelrollene vil tilsammen dekker de fleste organisasjonstypene som finnes og sikre at noen for tilgang tilgang til en gitt applikasjon på vegne av en virksomhet.
-
-Det bør være en særskilt grunn til f eks å ikke gi Daglig leder tilgang til en applikasjon - dette kan f eks være at tjenesten gir tilgang til personsensitiv data som
-daglig leder ikke har tjenslig behov for å ha tilgang til. I slike tilfeller bør roller for taushetsbelagte tjenester vurderes istedet. Ta kontakt med tjenesteeier@altinn.no om det er aktuelt.
-
-Innehaver av en nøkkelrolle fra Enhetsregisteret vil også alltid får rollen hovedadministrator og tilgangsstyrer på vegne av virksomheten. Les mer om hva dette er [her](https://www.altinn.no/hjelp/skjema/alle-altinn-roller/hovedadministrator/).
-
-- **Daglig leder (DAGL)** - kan knyttes til de fleste organisasjonstyper.
-- **Styrets leder (STYR)** - kan knyttes til alle organisasjonstyper som har et styre.
-- **Bestyrende reder(BEST)** - knyttes til organisasjonsformen "partsrederi"
-- **Bostyrer (BOBE)** - knyttes til organisasjonsformen "konkursbo"
-- **Deltaker med delt ansvar (DTPR)** - kan knyttes til organisasjonsformer hvor deltakere har proratarisk ansvar
-- **Deltaker med fullt ansvar (DTSO)** - kan knyttes til organsiasjonsformer hvor deltakere har solidarisk ansvar
-- **Innehaver (INNH)** - kan knyttes til organisasjonsformen "Enkeltpersonforetak"
-- **Komplementar (KOMP)** - kan knyttes til orgnaisasjonsformen "Kommandittselskap"
-- **Norsk representant for utenlandsk enhet (REPR)** - kan knyttes til organisasjonsformen "Norsk avdeling av utenlandsk foretak" (NUF)
-
-
-
-## Rolle for norskregistert Utenlands foretak
-**Kontaktperson for utenlandsk foretak(KNUF)**
-
-Norsk avdeling av utenlansk foretak (NUF) er i utgangspunktet ikke et norsk selskap, men registreres i ER fordi det har aktivitet i Norge og trenger et organisasjonsnummer.
-Det er i dag ingen krav til at et NUF må ha registrert en daglig leder og mange har kun registrert en kontaktperson (KNUF) for Enhetsregisteret. Denne rollen har i juridisk sett i utgangspunktet begrensede fullmakter for den Norske avdelingen men kan i mange sammenhenger være den eneste som i praksis kan representere selskapet digital.
-Hvis dere vet at tjenesten deres benyttes av NUF så bør dere gjøre en vurdering pÃ¥ om det riktig og nødvendig at rollen "Kontaktperson for utenlansk foretak" (KNUF) også får tilgang til tjenesten.
-
-## Øvrige roller fra Enhetsregisteret som kan få tilganger via Altinn Autorisasjon
-I tillegg til nøkkelroller så finnes flere typer roller som kan registreres på en virksomhet.
-Det er ansees ikke som naturlig at disse rollene får tilgang til alle tjenesgter på vegne av en virksomhet, men i enkelt tilfeller kan det allikevel være fornuftig.
-Vurderingen avhenger f eks av
-- av hvilken type tjeneste man tilbyr
-- om dette er en tjeneste det er naturlig at rollen utfører
-- applikasjonen gir tilgang til informasjon som denne rollen bør ha tilgang til
-
-### Følgende øvrige roller hentes fra Enhetsregisteret:
-- Forretningsfører (FFØR)
-- Kontaktperson i kommune (KOMK)
-- Kontaktperson i Administrativ Enhet - offentlig sektor (KEMN)
-- Komplementar (KOMP)
-- Styremedlem (STYR)
-- Nestleder (NEST)
-- Sameiere (SAM)
-- Regnskapsfører (REGN)
-- Revisor (REVI)
-- Varamedlem (VARA)
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_SKE/index.en.md b/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_SKE/index.en.md
deleted file mode 100644
index e3ce084b2d0..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_SKE/index.en.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: Roles from Skatteetaten
-linktitle: SKE-roles
-description:
-toc: true
----
-
-To be translated
\ No newline at end of file
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_SKE/index.nb.md b/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_SKE/index.nb.md
deleted file mode 100644
index ba83065bb50..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_SKE/index.nb.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-title: Roller from Skatteetaten
-linktitle: SKE-roller
-description: Denne siden forklarer rollene fra Skatteetaten som kan benyttes til å gi tilgang til en applikasjon.
-toc: true
----
-
-## Indre selskap
-Skatteetaten leser inn såkalte "Indre selskap" i Altinn og registrerer brukere som har roller på disse.
-Dette er enheter som ikke er registert i Enhetsregisteret men som har rapporteringsplikt mot Skatteetaten.
-[Her](https://www.skatteetaten.no/rettskilder/type/handboker/skatte-abc/gjeldende/selskap-med-deltakerfastsetting--allment-om-deltakerfastsetting/S-4.015/S-4.020/) kan du lese mer om hva indre selskap er.
-
-Indre selskap er identifisert med egen type id-nummer i Altinn. De har 9 siffer og starter med 4.
-Virksomheter fra Enhetsregisteret har også 9 siffre, men starter alltid med 8 eller 9.
-
-Følgende roller er registert på de Indre selskapene: REPR, DTSO, DAGL, REVI, KOMP, REGN, SAM, DTPR, FFØR, MEDL, KONT, LEDE, NEST, INNH, BEST
\ No newline at end of file
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/_index.en.md b/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/_index.en.md
deleted file mode 100644
index 6664d551b67..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/_index.en.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Roles from Altinn
-linktitle: Altinn Roles
-description:
-toc: true
----
-To be translated...
\ No newline at end of file
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/_index.nb.md b/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/_index.nb.md
deleted file mode 100644
index c0b8e618013..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/_index.nb.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-title: Roller fra Altinn
-linktitle: Altinn Roller
-description: Denne siden beskriver Altinn roller som kan benyttes til å gi tilgang til en applikasjon.
-toc: true
----
-Altinn har definert et sett med generiske roller som aktøren (person/virksomhet) kan benytte til å gi andre fullmakt til å utføre tjenester på dere vegne.
-Beskrivelsen av Altinn rollen setter begreninger og angir hvilke trinn i arbeidsprosessen for hvilke typer tjenester som bør knyttes til denne.
-
-Som applikasjonsutvikler må du derfor alltid vurdere om intensjonen bak rollebeskrivelsen fallen innenfor din applikasjons tjenesteområde eller ikke.
-Vi oppfordrer sterkt til å ta kontakt med Altinn for veilednig i valg av rollekrav på tjenesten.
-
-Altinnrollene kan deles opp i to hovedkategorier: roller som benyttes for tilgangstyring på vegne av virksomheter og roller som benyttes for tilgangsstyring på vegne av personer
-
-## Altinn Roller for virksomheter
-Disse rollene kan benytts i autorisasjonsregler for applikasjoner som skal benyttes av virksomheter
-Les mer om hvilke roller dette er [her](altinn_roles_enterprices)
-## Altinn Roller for personer
-Disse rollene kan benytts i autorisasjonsregler for applikasjoner som skal benyttes av personer
-Les mer om hvilke roller dette er [her](altinn_roles_persons)
-
-## Altinn roller for administrasjon av tilganger
-Disse rollene kan ikke benyttes i autorisasjonsregler for applikasjoner.
-Les mer om hvilke roller dette er [her](altinn_roles_administration)
\ No newline at end of file
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_administration/_index.en.md b/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_administration/_index.en.md
deleted file mode 100644
index 7b82a068c4e..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_administration/_index.en.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Altinn roles used for administering access
-linktitle: Administration roles
-description:
-toc: true
----
-To be translated...
\ No newline at end of file
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_administration/_index.nb.md b/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_administration/_index.nb.md
deleted file mode 100644
index 4dc408ce501..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_administration/_index.nb.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-title: Altinn roller som brukes til admnistrasjon av tilganger
-linktitle: Administrator roller
-description: Denne siden beskriver hvilke Altinn roller som kan benyttes for å gi tilgang til å administrere roller og rettigheter på vegne av en virksomhet
-toc: true
----
-Administrator roller skal IKKE benyttes i autorisasjonsregler for en applikasjon.
-Det er allikevel nyttig å vite at de er tilgjengelig for aktøren og at det er nødvendig for bruker som skal styre tilganger for aktøren å ha disse.
-
-
-## Tilgangsstrying
-Beskrivelse: Denne rollen gir administratortilgang til å gi videre rettigheter til andre.
-
-## Hovedadministrator
-Rollen kan kun benyttes for virksomheter, ikke for personer
-Beskrivelse: Denne rollen gir mulighet for å delegere alle roller og rettigheter for en aktør, også de man ikke har selv. Hovedadministrator-rollen kan bare delegeres av daglig leder, styrets leder, innehaver og bestyrende reder.
-
-## Parallell signering
-Rollen kan kun benyttes for virksomheter, ikke for personer
-Beskrivelse: Denne rollen gir rettighet til å signere elementer fra andre avgivere.
-
-## Klientadministrator
-Rollen kan kun benyttes for virksomheter, ikke for personer
-Beskrivelse: Tilgang til å administrere klientroller for regnskapsførere og revisorer
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_enterprices/_index.en.md b/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_enterprices/_index.en.md
deleted file mode 100644
index 5c23c9e31b9..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_enterprices/_index.en.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Altinn roles used by enterprises
-linktitle: Enterprise roles
-description:
-toc: true
----
-To be translated...
\ No newline at end of file
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_enterprices/_index.nb.md b/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_enterprices/_index.nb.md
deleted file mode 100644
index 7adb8513101..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_enterprices/_index.nb.md
+++ /dev/null
@@ -1,64 +0,0 @@
----
-title: Altinn roller brukt av virksomheter
-linktitle: Virksomhetsroller
-description: Denne siden beskriver hvilke Altinn roller som kan benyttes for å gi en bruker tilgang til en applikasjon på vegne av en virksomhet
-toc: true
----
-
-## Lønn og personalmedarbeider
-Beskrivelse: Denne rollen gir rettighet til lønns- og personalrelaterte tjenester. Ved regelverksendringer eller innføring av nye digitale tjenester kan det bli endringer i tilganger som rollen gir.
-
-## Regnskapsmedarbeider
-Beskrivelse: Denne rollen gir rettighet til regnskapsrelaterte skjema og tjenester. Ved regelverksendringer eller innføring av nye digitale tjenester kan det bli endringer i tilganger som rollen gir.
-
-## Begrenset signeringsrettighet
-Beskrivelse: Tilgang til å fylle ut og signere utvalgte skjema og tjenester, hovedsaklig innenfor økonomiske og forretningsmessige forhold. Ved regelverksendringer eller innføring av nye digitale tjenester kan det bli endringer i tilganger som rollen gir.
-
-## Samferdsel
-Beskrivelse: Rollen gir rettighet til tjenester relatert til samferdsel. For eksempel tjenester fra Statens Vegvesen, Sjøfartsdirektoratet og Luftfartstilsynet. Ved regelverksendringer eller innføring av nye digitale tjenester kan det bli endringer i tilganger som rollen gir.
-
-## Utfyller/Innsender
-Beskrivelse: Denne rollen gir rettighet til et bredt utvalg skjema og tjenester som ikke har så strenge krav til autorisasjon. Ved regelverksendringer eller innføring av nye digitale tjenester kan det bli endringer i tilganger som rollen gir.
-
-## Energi, miljø og klima
-Beskrivelse: Tilgang til tjenester relatert til energi, miljø og klima. Ved regelverksendringer eller innføring av nye digitale tjenester kan det bli endringer i tilganger som rollen gir.
-
-## Økokrim rapportering
-Beskrivelse: Tilgang til tjenester fra Økokrim. Ved regelverksendringer eller innføring av nye digitale tjenester kan det bli endringer i tilganger som rollen gir.
-
-## Patent, varemerke og design
-Beskrivelse: Denne rollen gir rettighet til tjenester relatert til patent, varemerke og design. Ved regelverksendringer eller innføring av nye digitale tjenester kan det bli endringer i tilganger som rollen gir.
-
-## Signerer av Samordnet registermelding
-Beskrivelse: Denne rollen gir rettighet til tjenester på vegne av enheter/foretak. Ved regelverksendringer eller innføring av nye digitale tjenester kan det bli endringer i tilganger som rollen gir.
-
-## Helse-, sosial- og velferdstjenester
-Beskrivelse: Tilgang til helse-, sosial- og velferdsrelaterte tjenester. Ved regelverksendringer eller innføring av nye digitale tjenester kan det bli endringer i tilganger som rollen gir.
-
-## Kommunale tjenester
-Beskrivelse: Rollen gor tilgang til kommunale tjenester. Ved regelverksendringer eller innføring av nye digitale tjenester kan det bli endringer i tilganger som rollen gir.
-
-## Primærnæring og næringsmiddel
-Beskrivelse: Denne rollen gir rettighet til tjenester innen import, foredling, produksjon og/eller salg av primærnæringsprodukter og andre næringsmiddel, samt dyrehold, akvakultur, planter og kosmetikk. Ved regelverksendringer eller innføring av nye digitale tjenester kan det bli endringer i tilganger som rollen gir.
-
-## Post/arkiv
-Beskrivelse: Denne rollen gir rettighet til å lese meldinger som blir sendt til brukerens meldingsboks. Ved regelverksendringer eller innføring av nye digitale tjenester kan det bli endringer i tilganger som rollen gir.
-
-## Plan- og byggesak
-Beskrivelse: Rollen er forbeholdt skjemaer og tjenester som er godkjent av Direktoratet for byggkvalitet (DiBK). Ved regelverksendringer eller innføring av nye digitale tjenester kan det bli endringer i tilganger som rollen gir.
-
-## Taushetsbelagt post
- Beskrivelse: Denne rollen gir tilgang til taushetsbelagt post fra stat og kommune. Ved regelverksendringer eller innføring av nye digitale tjenester kan det bli endringer i tilganger som rollen gir.
-
-
- ## Roller som utgår
-
- ### Roller laget i overgang mellom 2.0 og 3.0
- Disse rollene skal ikke lengre benyttes for å tilgangsstyre til applikasjoner:
- #### Algetestdata
-Beskrivelse: Havforskningsinstituttet - registrering av algetestdata
-#### Transportløyvegaranti
- Beskrivelse: Statens vegvesen - rolle som gir tilgang til app for transportløyvegarantister
- ## Revisorattesterer - MVA kompensasjon
-Beskrivelse: Denne rollen gir revisor rettighet til å attestere tjenesten Merverdiavgift - søknad om kompensasjon (RF-0009).
-
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_persons/_index.en.md b/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_persons/_index.en.md
deleted file mode 100644
index 1f2ac9bd9ee..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_persons/_index.en.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Altinn roles used by persons
-linktitle: Person roles
-description:
-toc: true
----
-To be translated...
\ No newline at end of file
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_persons/_index.nb.md b/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_persons/_index.nb.md
deleted file mode 100644
index 7a14f0afe72..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/roles_and_rights/roles_altinn/altinn_roles_persons/_index.nb.md
+++ /dev/null
@@ -1,72 +0,0 @@
----
-title: Altinnroller brukt av personer
-linktitle: Personroller
-description: Denne siden beskriver hvilke Altinn roller som kan benyttes for å gi en bruker tilgang til en applikasjon på vegne av en person
-toc: true
----
-
-Følgende roller finnes i dag for personer
-
-## Begrenset signeringsrettighet
-Beskrivelse: Tilgang til å signere utvalgte skjema og tjenester
-
-Kan delegeres: ja
-## Energi, miljø og klima
-Beskrivelse: Tilgang til tjenester relatert til energi, miljø og klima
-
-Kan delegeres: ja
-## Kommunale tjenester
-Beskrivelse: Rolle for kommunale tjenester
-
-Kan delegeres: ja
-
-## Lønn og personalmedarbeider
-Beskrivelse: Denne rollen gir rettighet til lønns- og personalrelaterte tjenester.
-
-Kan delegeres: ja
-
-## Patent, varemerke og design
-Beskrivelse: Denne rollen gir rettighet til tjenester relatert til patent, varemerke og design.
-
-Kan delegeres: ja
-
-## Plan- og byggesak
-Beskrivelse: Rollen er forbeholdt skjemaer og tjenester som er godkjent av Direktoratet for byggkvalitet (DiBK).
-
-Kan delegeres: ja
-
-## Post/arkiv
-Beskrivelse: Denne rollen gir rettighet til å lese meldinger som blir sendt til brukerens meldingsboks.
-
-Kan delegeres: ja
-
-## Primærnæring og næringsmiddel
-Beskrivelse: Denne rollen gir rettighet til tjenester innen import, foredling, produksjon og/eller salg av primærnæringsprodukter og andre næringsmiddel, samt dyrehold, akvakultur, planter og kosmetikk.
-
-Kan delegeres: ja
-
-## Privatperson begrensede rettigheter
-Beskrivelse: Denne rollen gir mulighet til å benytte tjenester på vegne av en annen privatperson.
-
-Kan delegeres: ja
-
-## Regnskapsmedarbeider
-Beskrivelse: Denne rollen gir rettighet til regnskapsrelaterte skjema og tjenester.
-
-Kan delegeres: ja
-
-## Samferdsel
-Beskrivelse: Rollen gir rettighet til tjenester relatert til samferdsel. For eksempel tjenester fra Statens Vegvesen, Sjøfartsdirektoratet og Luftfartstilsynet.
-
-Kan delegeres: ja
-
-## Skatteforhold for privatpersoner
-Beskrivelse: Tillatelsen gjelder alle opplysninger vedrørende dine eller ditt enkeltpersonsforetaks skatteforhold. Ved regelverksendringer eller innføring av nye digitale tjenester kan Skatteetaten endre i tillatelsen.
-
-Kan delegeres: ja
-
-## Utfyller/innsender
-Beskrivelse: Denne rollen gir rettighet til utvalgte skjema og tjenester.
-
-Kan delegeres: ja
-
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/test_authorization_application/_index.en.md b/content/app/development/configuration/authorization/guidelines_authorization/test_authorization_application/_index.en.md
deleted file mode 100644
index 144cca726b8..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/test_authorization_application/_index.en.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Test of authorization rules
-linktitle: Testing
-description:
----
-To bi translated
\ No newline at end of file
diff --git a/content/app/development/configuration/authorization/guidelines_authorization/test_authorization_application/_index.nb.md b/content/app/development/configuration/authorization/guidelines_authorization/test_authorization_application/_index.nb.md
deleted file mode 100644
index de34a64ac53..00000000000
--- a/content/app/development/configuration/authorization/guidelines_authorization/test_authorization_application/_index.nb.md
+++ /dev/null
@@ -1,35 +0,0 @@
----
-title: Test av autorisasjonsregler
-linktitle: Testing
-description: Testing av autorisasjonsregler er viktig før produksjonssetting for å verifisere at valgte regler fungerer etter intensjon og gir en sikker og brukervennlig opplevelse
----
-{{%notice warning%}}
-Feil i autoriasjonsregler eller valg av ikke passende rolle for et eller flere arbeidstrinn kan i verste fall føre til at urettmessige
-brukere får tilgang til data de ikke skal ha.
-Dette kan få alvorlige konsekvenser for aktør og vil være å betrakte som en sikkerhetsbrudd.
-{{% /notice%}}
-
-## Hva må testes?
-
-Ved testing er det viktig å gjennomføre både positive og negative tester, dvs at man verifiserer at ønskede brukere får tilgang og at andre IKKE får tilgang.
-
-Nedenfor har vi laget en liste over testsituasjoner som applikasjonsutvikler bør lage testscenario på og verifisere.
-Vi anbefaler at man automatiserer disse testene på samme måte som annen app-testing.
-
-- Verifisèr at at ønskede eksterne roller får utført de ulike trinnene i prosessen og får tilgang til nødvendig data for å utføre dette
-- Verifisèr at andre eksterne roller IKKE får utført de ulike trinnene i prosessen og får tilgang til nødvendig data for å utføre dette
-- Verifisèr at brukere som får delegert altinn-roller knyttet til applikasjonen får utført de ulike trinnene i prosessen og får tilgang til nødvendig data for å utføre dette
-- Verifisèr at applikasjonen finnes i listen av delegerbare tjenester og at det er mulig å bare delegere tilgang til applikasjonen uten rolledelegering, se [her](https://www.altinn.no/hjelp/profil/roller-og-rettigheter/gi-roller-eller-rettighet-via-sokefunksjon/)
-- Verifisèr at bruker med for lavt sikkerhetsnivå ikke får tilgang uten å heve sikkerhetsnivå på innlogging
-
-
-## Dokumentasjon av manuell testing
-For å sikre tilstrekkelig kvalitet på test av autorisasjonsregler er det nødvendig med en systematisk tilnærming og dokumenterer testing ved å ha detaljerte test-skript.
-Ved evt feil under testing eller senere er det viktig at man har god kontroll på hvilke brukere og akøtører som ble brukt og hvilke trinn i arbeidsprosessen som ble verifisert.
-
-
-## Testdata
-Det er mulig å benytte [testdata fra Tenor](https://www.skatteetaten.no/skjema/testdata/) i Altinn for å finne brukere med riktige roller for riktige aktører.
-
-Noen ganger kan det være utfordrende å finne til testdata som dekker ønskede testscenario avhengig av hvilke type aktører som benyttes (f eks bestemte organisasjonsformer) eller at man har tatt i bruk "uvanlige" eksterne roller.
-Ta kontakt med Altinn hvis du ikke finner passende testdata så kan vi lese inn testbrukere og -aktører tilpasset ditt behov.
\ No newline at end of file
diff --git a/content/app/development/configuration/authorization/json.md b/content/app/development/configuration/authorization/json.md
deleted file mode 100644
index 0de9e4026c0..00000000000
--- a/content/app/development/configuration/authorization/json.md
+++ /dev/null
@@ -1,411 +0,0 @@
----
-title: Regelbibliotek JSON - UNDER ARBEID!
-linktitle: JSON
-description: Bibliotek av autorisasjonsregler som kan brukes i en app. Husk å bytte ut tags ([ORG], [APP], [RULE_ID]) med din egen data.
-toc: true
-hidden: true
----
-
-## [ORG] can instantiate an instance of [ORG]/[APP]
-
-[ORG_1] og [ORG_2] kan her være like eller ulike. I tilfellet at de er ulike vil [ORG_1] tilsvare applikasjonseieren og [ORG_2] være en annen organisasjon som får lov til å instansiere.
-
-```xml {linenos=false,hl_lines=[2,7,15,19,27]}
-
- [ORG_2] can instantiate an instance of [ORG_1]/[APP]
-
-
-
-
- [ORG_2]
-
-
-
-
-
-
-
- [ORG_1]
-
-
-
- [APP]
-
-
-
-
-
-
-
- instantiate
-
-
-
-
-
-
-```
-
-```json {linenos=false,hl_lines=[9,12,15]}
-{
- "$schema": "https://altinncdn.no/schemas/json/policy/policy.schema.v1.json",
- "Policy": {
- "Rules": [
- {
- "Effect": "Permit",
- "Description": "[ORG_2] can instantiate an instance of [ORG_1]/[APP]",
- "Subjects": [
- "org:[ORG_2]"
- ],
- "Resources": [
- "app:[ORG_1]/[APP]"
- ],
- "Actions": [
- "instantiate"
- ]
- }
- ]
- }
-}
-```
-
-## User with role REGNA can read instances of [ORG]/[APP] when it is in Task_1
-
-Ved å endre på rolle og task i denne regelen vil du kunne gi rettigheter til å lese instansdata på en gitt task i prosessflyten.
-
-```xml {linenos=false,hl_lines=[2,7,15,19,23,31]}
-
- User with role REGNA can read instances of [ORG]/[APP] when it is in Task_1
-
-
-
-
- REGNA
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- Task_1
-
-
-
-
-
-
-
- read
-
-
-
-
-
-
-```
-
-```json {linenos=false,hl_lines=[9,12,15]}
-{
- "$schema": "https://altinncdn.no/schemas/json/policy/policy.schema.v1.json",
- "Policy": {
- "Rules": [
- {
- "Effect": "Permit",
- "Description": "User with role REGNA can read instances of [ORG]/[APP] when it is in Task_1",
- "Subjects": [
- "role:REGNA"
- ],
- "Resources": [
- "app:[ORG]/[APP]/Task_1"
- ],
- "Actions": [
- "read"
- ]
- }
- ]
- }
-}
-```
-
-## [ORG] can write to an instance of [ORG]/[APP] in any task or event
-
-Denne regelen kan brukes dersom applikasjonseier skal kunne oppdatere instanser uavhengig av hvor de er i prosessflyten sin.
-
-```xml {linenos=false,hl_lines=[2,7,15,19,27]}
-
- [ORG] can write to instances of [ORG]/[APP] in any task or event
-
-
-
-
- [ORG]
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
-
-
-
-
- write
-
-
-
-
-
-
-```
-
-```json {linenos=false,hl_lines=[9,12,15]}
-{
- "$schema": "https://altinncdn.no/schemas/json/policy/policy.schema.v1.json",
- "Policy": {
- "Rules": [
- {
- "Effect": "Permit",
- "Description": "[ORG] can write to instances of [ORG]/[APP] in any task or event",
- "Subjects": [
- "org:[ORG]"
- ],
- "Resources": [
- "app:[ORG]/[APP]"
- ],
- "Actions": [
- "write"
- ]
- }
- ]
- }
-}
-```
-
-
-## User with role REGNA or DAGL can confirm instances of [ORG]/[APP] when it is in Task_2
-
-Denne reglen begrenser rettigheten til å bekrefte en instans i en bestemt task til kun to roller.
-Ved å enten modifisere task eller roller vil du her kunne sette regler for hvem som får bekrefte instansen i ulike faser av prosessen.
-
-```xml {linenos=false,hl_lines=[2,7,13,21,25,29,37]}
-
- User with role REGNA or DAGL can confirm instances of [ORG]/[APP] when it is in Task_2
-
-
-
-
- REGNA
-
-
-
-
-
- DAGL
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- Task_2
-
-
-
-
-
-
-
- confirm
-
-
-
-
-
-
-```
-
-```json {linenos=false,hl_lines=[9,10,13,16]}
-{
- "$schema": "https://altinncdn.no/schemas/json/policy/policy.schema.v1.json",
- "Policy": {
- "Rules": [
- {
- "Effect": "Permit",
- "Description": "User with role REGNA or DAGL can confirm instances of [ORG]/[APP] when it is in Task_2",
- "Subjects": [
- "role:REGNA",
- "role:DAGL"
- ],
- "Resources": [
- "app:[ORG]/[APP]/Task_2"
- ],
- "Actions": [
- "confirm"
- ]
- }
- ]
- }
-}
-```
-
-
-## User with role REGNA can read instanes of [ORG]/[APP] when it is in EndEvent_1
-
-Denne regler tillatter en bruker med den gitte rollen å lese instansdata etter at prosessen er avsluttet.
-Dette vil bl.a. inkludere å laste ned vedlegg og kvitteringer knyttet til instansen.
-
-```xml {linenos=false,hl_lines=[2,7,14,18,22,30]}
-
- User with role REGNA can read instanes of [ORG]/[APP] when it is in EndEvent_1
-
-
-
-
- REGNA
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- EndEvent_1
-
-
-
-
-
-
-
- read
-
-
-
-
-
-
-```
-
-```json {linenos=false,hl_lines=[9,12,15]}
-{
- "$schema": "https://altinncdn.no/schemas/json/policy/policy.schema.v1.json",
- "Policy": {
- "Rules": [
- {
- "Effect": "Permit",
- "Description": "User with role REGNA can read instanes of [ORG]/[APP] when it is in EndEvent_1",
- "Subjects": [
- "role:REGNA"
- ],
- "Resources": [
- "app:[ORG]/[APP]/EndEvent_1"
- ],
- "Actions": [
- "read"
- ]
- }
- ]
- }
-}
-```
-
-## Rule that defines that [ORG] can complete an instance of [ORG]/[APP] which state is at the end event.
-
-Denne regelen tillatter applikasjonseier å utføre en kvittering på at de er ferdig med en instans. Instansen må ha en fullført process.
-
-```xml {linenos=false,hl_lines=[2,7,15,19,23,31]}
-
- Rule that defines that [ORG] can complete an instance of [ORG]/[APP] which state is at the end event.
-
-
-
-
- [ORG]
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- EndEvent_1
-
-
-
-
-
-
-
- complete
-
-
-
-
-
-
-```
-
-```json {linenos=false,hl_lines=[9,12,15]}
-{
- "$schema": "https://altinncdn.no/schemas/json/policy/policy.schema.v1.json",
- "Policy": {
- "Rules": [
- {
- "Effect": "Permit",
- "Description": "Rule that defines that [ORG] can complete an instance of [ORG]/[APP] which state is at the end event.",
- "Subjects": [
- "org:[ORG]"
- ],
- "Resources": [
- "app:[ORG]/[APP]/EndEvent_1"
- ],
- "Actions": [
- "complete"
- ]
- }
- ]
- }
-}
-```
diff --git a/content/app/development/configuration/authorization/rules/_index.en.md b/content/app/development/configuration/authorization/rules/_index.en.md
deleted file mode 100644
index 38f321ff3ae..00000000000
--- a/content/app/development/configuration/authorization/rules/_index.en.md
+++ /dev/null
@@ -1,369 +0,0 @@
----
-title: Rule library
-description: Library of authorization rules that can be used in an app. Remember to replace tags ([RULE_ID]) with your own ID. [ORG] and [APP] can will be replaced later, so they can remain in the file if you use Local test from january 2023 or newer.
-toc: true
----
-
-## [ORG] can instantiate an instance of [ORG]/[APP]
-
-[ORG_1] and [ORG_2] can here be the same or different.
-In the case that they are different [ORG_1] will correspond to the application owner and [ORG_2] be another organization
-that is allowed to instantiate.
-
-```xml {linenos=false,hl_lines=[2,7,15,19,27]}
-
- [ORG_2] can instantiate an instance of [ORG_1]/[APP]
-
-
-
-
- [ORG_2]
-
-
-
-
-
-
-
- [ORG_1]
-
-
-
- [APP]
-
-
-
-
-
-
-
- instantiate
-
-
-
-
-
-
-```
-
-## User with role REGNA can read instances of [ORG]/[APP] when it is in Task_1
-
-By changing the role and task in this rule you will be able to give rights to read instance data on a given task in the process flow.
-
-```xml {linenos=false,hl_lines=[2,7,15,19,23,31]}
-
- User with role REGNA can read instances of [ORG]/[APP] when it is in Task_1
-
-
-
-
- REGNA
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- Task_1
-
-
-
-
-
-
-
- read
-
-
-
-
-
-
-```
-
-## [ORG] can write to an instance of [ORG]/[APP] in any task or event
-
-This rule can be used if application owner should be able to update instances regardless of where they are in their process flow.
-
-```xml {linenos=false,hl_lines=[2,7,15,19,27]}
-
- [ORG] can write to instances of [ORG]/[APP] in any task or event
-
-
-
-
- [ORG]
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
-
-
-
-
- write
-
-
-
-
-
-
-```
-
-## User with role REGNA or DAGL can confirm instances of [ORG]/[APP] when it is in Task_2
-
-This rules limits the right to confirm an instance in a particular task to only two roles.
-By either modifying task or roles, you will here be able to set rules for who will confirm the instance in various phases of the process.
-
-```xml {linenos=false,hl_lines=[2,7,13,21,25,29,37]}
-
- User with role REGNA or DAGL can confirm instances of [ORG]/[APP] when it is in Task_2
-
-
-
-
- REGNA
-
-
-
-
-
- DAGL
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- Task_2
-
-
-
-
-
-
-
- confirm
-
-
-
-
-
-
-```
-
-## User with role REGNA can read instances of [ORG]/[APP] when it is in EndEvent_1
-
-This rules permits a user with the given role to read instance data after the process has ended.
-This will, among other things, include downloading attachments and receipts associated with the instance.
-
-```xml {linenos=false,hl_lines=[2,7,14,18,22,30]}
-
- User with role REGNA can read instanes of [ORG]/[APP] when it is in EndEvent_1
-
-
-
-
- REGNA
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- EndEvent_1
-
-
-
-
-
-
-
- read
-
-
-
-
-
-
-```
-
-## Rule that defines that [ORG] can complete an instance of [ORG]/[APP] which state is at the end event.
-
-This rule allows application owner to complete an instance. The instance must have a completed process.
-
-```xml {linenos=false,hl_lines=[2,7,15,19,23,31]}
-
- Rule that defines that [ORG] can complete an instance of [ORG]/[APP] which state is at the end event.
-
-
-
-
- [ORG]
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- EndEvent_1
-
-
-
-
-
-
-
- complete
-
-
-
-
-
-
-```
-
-## [ORG] can delete an instance of [ORG]/[APP] in any task or event.
-
-This rule allows application owner to delete an instance. This can be done regardless of where in the process the instance is.
-
-```xml
-
- [ORG] can delete an instance of [ORG]/[APP] in any task or event.
-
-
-
-
- [ORG]
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
-
-
-
-
- delete
-
-
-
-
-
-
-```
-
-## User with role [REGNA] can read/subscribe to events generated by app [ORG]/[APP]
-
-```xml
-
- A rule giving user with role REGNA the right to read the events generated by the app [ORG]/[APP]
-
-
-
-
- REGNA
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- events
-
-
-
-
-
-
-
- read
-
-
-
-
-
-
- ```
-
-## [ORG] can access with authentication level 3
-
-```xml
-
-
-
- 4
-
-
-
-
- 3
-
-
-
-```
diff --git a/content/app/development/configuration/authorization/rules/_index.nb.md b/content/app/development/configuration/authorization/rules/_index.nb.md
deleted file mode 100644
index 810d40a564a..00000000000
--- a/content/app/development/configuration/authorization/rules/_index.nb.md
+++ /dev/null
@@ -1,367 +0,0 @@
----
-title: Regelbibliotek
-linktitle: Regelbibliotek
-description: Bibliotek av autorisasjonsregler som kan brukes i en app. Husk å bytte ut tags ([RULE_ID]) med en egen ID. [ORG] og [APP] kan stå som de er, siden de blir erstattet med info fra applicationmetadata.json om du har oppdatert LocalTest etter januar 2023.
-toc: true
----
-
-## [ORG] kan instansiere [ORG]/[APP]
-
-[ORG_1] og [ORG_2] kan her være like eller ulike. I tilfellet at de er ulike vil [ORG_1] tilsvare applikasjonseieren og [ORG_2] være en annen organisasjon som får lov til å instansiere.
-
-```xml {linenos=false,hl_lines=[2,7,15,19,27]}
-
- [ORG_2] can instantiate an instance of [ORG_1]/[APP]
-
-
-
-
- [ORG_2]
-
-
-
-
-
-
-
- [ORG_1]
-
-
-
- [APP]
-
-
-
-
-
-
-
- instantiate
-
-
-
-
-
-
-```
-
-## Bruker med rollen REGNA can lese instanser av [ORG]/[APP] som er i Task_1
-
-Ved å endre på rolle og task i denne regelen vil du kunne gi rettigheter til å lese instansdata på en gitt task i prosessflyten.
-
-```xml {linenos=false,hl_lines=[2,7,15,19,23,31]}
-
- User with role REGNA can read instances of [ORG]/[APP] when it is in Task_1
-
-
-
-
- REGNA
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- Task_1
-
-
-
-
-
-
-
- read
-
-
-
-
-
-
-```
-
-## [ORG] kan skrive til en instans av [ORG]/[APP] uavhengig av prosessflyt
-
-Denne regelen kan brukes dersom applikasjonseier skal kunne oppdatere instanser uavhengig av hvor de er i prosessflyten sin.
-
-```xml {linenos=false,hl_lines=[2,7,15,19,27]}
-
- [ORG] can write to instances of [ORG]/[APP] in any task or event
-
-
-
-
- [ORG]
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
-
-
-
-
- write
-
-
-
-
-
-
-```
-
-## Bruker med rollen REGNA eller DAGL kan bekrefte instanser av [ORG]/[APP] som er i Task_2
-
-Denne reglen begrenser rettigheten til å bekrefte en instans i en bestemt task til kun to roller.
-Ved å enten modifisere task eller roller vil du her kunne sette regler for hvem som får bekrefte instansen i ulike faser av prosessen.
-
-```xml {linenos=false,hl_lines=[2,7,13,21,25,29,37]}
-
- User with role REGNA or DAGL can confirm instances of [ORG]/[APP] when it is in Task_2
-
-
-
-
- REGNA
-
-
-
-
-
- DAGL
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- Task_2
-
-
-
-
-
-
-
- confirm
-
-
-
-
-
-
-```
-
-## Bruker med rolle REGNA kan lese instanser av [ORG]/[APP] som er i EndEvent_1
-
-Denne regler tillatter en bruker med den gitte rollen å lese instansdata etter at prosessen er avsluttet.
-Dette vil bl.a. inkludere å laste ned vedlegg og kvitteringer knyttet til instansen.
-
-```xml {linenos=false,hl_lines=[2,7,14,18,22,30]}
-
- User with role REGNA can read instanes of [ORG]/[APP] when it is in EndEvent_1
-
-
-
-
- REGNA
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- EndEvent_1
-
-
-
-
-
-
-
- read
-
-
-
-
-
-
-```
-
-## Regel som definerer at [ORG] kan fullføre en instans av [ORG]/[APP] som har en fullført prosess.
-
-Denne regelen tillatter applikasjonseier å utføre en kvittering på at de er ferdig med en instans. Instansen må ha en fullført process.
-
-```xml {linenos=false,hl_lines=[2,7,15,19,23,31]}
-
- Rule that defines that [ORG] can complete an instance of [ORG]/[APP] which state is at the end event.
-
-
-
-
- [ORG]
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- EndEvent_1
-
-
-
-
-
-
-
- complete
-
-
-
-
-
-
-```
-
-## [ORG] kan slette en instans av [ORG]/[APP] uavhengig av hvor den er i prosessen
-
-Denne regelen tillatter applikasjonseier å slette en instans. Dette kan gjøres uavhengig av hvor i prosessen instansen er.
-
-```xml
-
- [ORG] can delete an instance of [ORG]/[APP] in any task or event.
-
-
-
-
- [ORG]
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
-
-
-
-
- delete
-
-
-
-
-
-
-```
-## Bruker med rollen [REGNA] kan lese/abonnere på events generert av app [ORG]/[APP]
-
-```xml
-
- A rule giving user with role REGNA the right to read the events generated by the app [ORG]/[APP]
-
-
-
-
- REGNA
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- events
-
-
-
-
-
-
-
- read
-
-
-
-
-
-
- ```
-
-## [ORG] kan aksesserere med autentiseringsnivå 3
-
-```xml
-
-
-
- 4
-
-
-
-
- 3
-
-
-
-```
diff --git a/content/app/development/configuration/autoSaveBehavior/_index.en.md b/content/app/development/configuration/autoSaveBehavior/_index.en.md
deleted file mode 100644
index 41d899b4995..00000000000
--- a/content/app/development/configuration/autoSaveBehavior/_index.en.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-title: Auto Save Behavior
-description: Configuring how frequently the client saves the form data
----
-
-{{%notice warning%}}
-This feature does not support single field validation.
-{{%/notice%}}
-
-Changing this behavior can change how often the app saves data to the backend.
-The configuration can be done in both layout-sets.json and Settings.json.
-
-```json
-// layout-sets.json
-{
- "sets": [...],
- "uiSettings": {
- "autoSaveBehavior": "onChangePage"
- }
-}
-```
-
-```json
-// Settings.json
-{
- "pages": {
- "autoSaveBehavior": "onChangePage"
- }
-}
-```
-
-## onChangeFormData (Default)
-
-Saves data to the backend on every interaction with a form component.
-This is the default behavior.
-
-## onChangePage
-
-Saves data to the backend on navigation between pages.
-This includes navigating with the NavigationBar-component, NavigationButtons-component and the Back button Icon.
-
-### Improves server performance on high demand
-
-On change page behavior can improve server performance in Azure if your app has many users in a short period of time.
-However you must consider that the app will not save the form if the user hasn't navigated between pages or submitted.
-A page refresh will then loose the data.
diff --git a/content/app/development/configuration/autoSaveBehavior/_index.nb.md b/content/app/development/configuration/autoSaveBehavior/_index.nb.md
deleted file mode 100644
index a77edfc6fde..00000000000
--- a/content/app/development/configuration/autoSaveBehavior/_index.nb.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-title: Automatisk lagring
-description: Konfigurering av hvor ofte klienten lagrer skjemadata
----
-
-{{%notice warning%}}
-Denne funksjonen støtter ikke validering av enkeltfelt.
-{{%/notice%}}
-
-Å endre denne atferden kan påvirke hvor ofte appen lagrer data til backend.
-Konfigurasjonen kan gjøres både i layout-sets.json og Settings.json.
-
-```json
-// layout-sets.json
-{
- "sets": [...],
- "uiSettings": {
- "autoSaveBehavior": "onChangePage"
- }
-}
-```
-
-```json
-// Settings.json
-{
- "pages": {
- "autoSaveBehavior": "onChangePage"
- }
-}
-```
-
-## onChangeFormData (Default)
-
-Lagrer data til backend ved hver interaksjon med et skjema-komponent.
-Dette er standardoppførselen.
-
-## onChangePage
-
-Lagrer data til backend ved navigering mellom sider.
-Dette inkluderer navigering med NavigationBar-komponenten, NavigationButtons-komponenten og bakknappikonet.
-
-### Forbedrer serverytelse ved høy etterspørsel
-
-OnChangePage-atferd kan forbedre serverytelsen i Azure hvis appen din har mange brukere på kort tid.
-Du må imidlertid vurdere at appen ikke vil lagre skjemaet hvis brukeren ikke har navigert mellom sider eller sendt det inn.
-En sideoppdatering vil da miste dataene.
diff --git a/content/app/development/configuration/datafields/_index.en.md b/content/app/development/configuration/datafields/_index.en.md
deleted file mode 100644
index bfcc24c5ec4..00000000000
--- a/content/app/development/configuration/datafields/_index.en.md
+++ /dev/null
@@ -1,78 +0,0 @@
----
-title: Data fields on instance object
-linktitle: Data fields
-description: Configuration of data fields for app.
-weight: 200
----
-
-It is useful to add extra information to instance objects in some cases. For example allowing routing the instance to the correct system in a service owners backend.
-
-This can be done in two ways, by configuration or manually. Using configuration, the system will extract data from the form fields and add these to the instance object. This method is limited to form fields, but avoids programming it by yourself. If you choose to do it manually you have the freedom to add data you might want from for example external APIs, calculations, string constants, etc.
-
-It is also possible to make use of both methods as long as you use different ids on the data fields. The configured values will then be collected together with the manual ones in the instance.
-
-Data fields are in many ways similar to [presentation fields](../messagebox/presentationfields/). But where the use of presentation fields is predefined, the use of data fields is completely up to the individual application owner.
-
-## Configuration
-Configuration of data fields is done in `applicationmetadata.json` which is located in the folder `App/config`.
-
-Add a new object with the key `dataFields`, using the following properties
-
- Name | Description
-----------|------------
-id | The ID of the datafield. Used to identify the field when saved in the instance.
-path | Datamodel path to the form field. This value is the same value that is bound to a component in the app's layout file.
-dataTypeId| Id of the datamodel where the value is collected from.
-
-The configuration for an app with two defined data fields will look like this:
-
- ```json
-"dataFields": [
- {
- "id": "AnsettelseAntAar",
- "path": "OpplysningerOmArbeidstakeren-grp-8819.Arbeidsforhold-grp-8856.AnsattAar-datadef-33267.value",
- "dataTypeId": "default"
- },
- {
- "id": "Navn",
- "path": "OpplysningerOmArbeidstakeren-grp-8819.OpplysningerOmArbeidstakeren-grp-8855.AnsattNavn-datadef-1223.value",
- "dataTypeId": "default"
- }]
- ```
-
-The result will be a list in the instance object with values from the configured fields:
-```json
-"dataValues": {
- "AnsettelseAntAar": 10,
- "Navn": "Ola Nordmann"
-}
-```
-Notice that the instance object is named `dataValues` even when the configured is named `dataFields`, this is because `dataValues` is the
-result of the configuration which is done in `dataFields`.
-
-## Manually
-To manually add data values the method `UpdateDataValues`from the IInstance interface is used. It is the same method which is called when the fields in `dataValues` are populated from configuration and it will merge all values into a list.
-
-{{%notice warning%}}
-Be aware that it is the application developer's responsibility to ensure unique IDs if you combine data values between configuration and a manual implementation.
-Values that share IDs will override each other and there is no way to guarantee which will be saved in the instance.
-{{% /notice%}}
-
-The example below displays how to set data values manually. In this case it is done by adding code
-within `RunProcessTaskEnd` in `App.cs`, which is run when a task is completed.
-
-```cs
-public override async Task RunProcessTaskEnd(string taskId, Instance instance)
-{
- var customDataValues = new DataValues() { Values = new Dictionary() { { "customKey", "customValue" } } };
- var (instanceOwnerPartyId, instanceGuid) = InstanceHelper.DeconstructInstanceIdFromUrl(_httpContextAccessor.HttpContext.Request.Path.Value);
-
- await _instanceService.UpdateDataValues(instanceOwnerPartyId, instanceGuid, customDataValues);
-
- await Task.CompletedTask;
-}
-```
-
-{{%notice warning%}}
-It is recommended to think through the necessity of these values for the instance object so that it avoids unnecessary API calls which impact the performance of the application.
-{{% /notice%}}
diff --git a/content/app/development/configuration/datafields/_index.nb.md b/content/app/development/configuration/datafields/_index.nb.md
deleted file mode 100644
index 28d19abc22a..00000000000
--- a/content/app/development/configuration/datafields/_index.nb.md
+++ /dev/null
@@ -1,78 +0,0 @@
----
-title: Datafelter på instansobjektet
-linktitle: Datafelter
-description: Konfigurasjon av datafelter for app.
-weight: 200
----
-
-I noen tilfeller kan det være nyttig å legge ekstra informasjon på instansobjektet f. eks. for å kunne basere ruting av instans til rett system i bakkant hos tjenesteeier.
-
-Dette kan gjøres på to måter, ved konfigurasjon eller manuelt. Ved konfigurasjon vil systemet ekstrahere data fra skjemafeltene og legge disse på instansobjektet. Man er da begrenset til skjemafelter, men slipper å programmere dette selv. Hvis man velger å gjøre det manuelt har man frihet til å legge på de dataene man selv ønsker f. eks. fra eksterne apier, kalkuleringer, faste strenger etc.
-
-Det er også mulig å benyttes seg av begge metoder så lenge man benytter seg av forskjellige id'er på datafeltene. De konfigurerte verdiene vil da flettes sammen med de manuelle på instansen.
-
-Datafelter er på mange måter tilsvarende [presentasjonsfelter](../messagebox/presentationfields/). Men der hvor bruken av presentasjonsfelter er forhåndsbestemt (benyttes i meldingsboksen til Altinn), er bruken av datafelter opp til den enkelte applikasjonseier.
-
-## Konfigurasjon
-Konfigurasjon av datafelter gjøres i `applicationmetadata.json` som ligger i repoet under mappen `App/config`.
-
-Legg til en ny seksjon med navn `dataFields` med følgende underfelter
-
- Navn | Beskrivelse
-----------|------------
-id | Id på datafeltet. Benyttes til å identifisere feltet når den er lagret på instansen.
-path | Datamodell path til skjemafeltet. Denne verdien er den samme som bindes til en komponent i layoutfilen til appen.
-dataTypeId| Id på datamodellen som verdien skal hentes fra.
-
-Konfigurasjonen til en app med to definerte datafelter vil se slik ut:
-
- ```json
-"dataFields": [
- {
- "id": "AnsettelseAntAar",
- "path": "OpplysningerOmArbeidstakeren-grp-8819.Arbeidsforhold-grp-8856.AnsattAar-datadef-33267.value",
- "dataTypeId": "default"
- },
- {
- "id": "Navn",
- "path": "OpplysningerOmArbeidstakeren-grp-8819.OpplysningerOmArbeidstakeren-grp-8855.AnsattNavn-datadef-1223.value",
- "dataTypeId": "default"
- }]
- ```
-
-Resultatet vil være en liste på instansobjektet med verdier fra de konfigurerte feltete:
-```json
-"dataValues": {
- "AnsettelseAntAar": 10,
- "Navn": "Ola Nordmann"
-}
-```
-Legg merke til at det på instansobjektet heter `dataValues` mens når det konfigureres heter `dataFields`, det er fordi
-`dataValues`er resultatet av konfigureringen som gjøres på `dataFields`.
-
-## Manuelt
-For å legge til dataverdier manuelt benyttes metoden `UpdateDataValues` fra IInstance interfacet. Det er den samme metoden som kalles når dataverdier populeres fra konfigurasjon og den sørger for å flette sammen verdiene til en liste.
-
-{{%notice warning%}}
-Merk at det er applikasjonsutvikler sitt ansvar å sørge for unike id'er hvis man kombinerer dataverdier fra konfgiurasjon og manuelt.
-Har man ikke unike id'er vil verdier overskrives, og man har ingen garanti for hvilken som blir lagret på instansen.
-{{% /notice%}}
-
-Eksemplet under viser hvordan man kan sette datavedier manuelt. I dette tilfellet gjøres det ved å gjøre legge inn kode
-i `RunProcessTaskEnd` i `App.cs` som kjører når en task avsluttes.
-
-```cs
-public override async Task RunProcessTaskEnd(string taskId, Instance instance)
-{
- var customDataValues = new DataValues() { Values = new Dictionary() { { "customKey", "customValue" } } };
- var (instanceOwnerPartyId, instanceGuid) = InstanceHelper.DeconstructInstanceIdFromUrl(_httpContextAccessor.HttpContext.Request.Path.Value);
-
- await _instanceService.UpdateDataValues(instanceOwnerPartyId, instanceGuid, customDataValues);
-
- await Task.CompletedTask;
-}
-```
-
-{{%notice warning%}}
-Man bør også tenke gjennom når man trenger disse verdiene på instansobjektet slik at man ikke gjør unødvendige api kall og dermed får en dårligere ytelse på applikasjonen.
-{{% /notice%}}
diff --git a/content/app/development/configuration/deployment/_index.en.md b/content/app/development/configuration/deployment/_index.en.md
deleted file mode 100644
index 32c210f8426..00000000000
--- a/content/app/development/configuration/deployment/_index.en.md
+++ /dev/null
@@ -1,275 +0,0 @@
----
-title: Deployment
-description: Configuring settings for deployment and runtime behavior
-toc: true
-weight: 600
----
-
-#### Helm Chart
-
-Altinn applications are published to a Kubernetes cluster using a deployment Helm chart. A Helm chart contains the necessary resources to publish an app, including YAML configuration files.
-
-Based on tests and experiences, we have set some default values in a central [Helm chart](https://github.com/Altinn/altinn-studio-charts/blob/main/charts/deployment/values.yaml) as a starting point for publishing Altinn applications. These values may change as we gain more experience.
-
-{{% notice info %}}
-Starting from version [2.0.0](/community/changelog/deployment/v2) of the 'deployment Helm chart,' autoscaling is available and enabled by default.
-{{% /notice %}}
-
-#### Custom settings
-
-Custom settings are configured in the `App/deployment/values.yaml` file by adding the desired property under
-the `deployment` section.
-These will override corresponding settings in the Helm chart (for exceptions,
-see [here](#settings-overridden-at-deploy-time)).
-See [Initial Scaling](#initial-scaling) for an example.
-
-{{% notice warning %}}
-Please note that the format in `values.yaml` in the central Helm chart differs slightly from `values.yaml` in the
-application; in the Helm chart, the properties are at the top level, while in the app, they must be placed under
-the `deployment` section.
-{{% /notice %}}
-
-## Scaling
-
-### Initial scaling
-
-The initial scaling is defined by `replicaCount`. If autoscaling is enabled, the autoscaler will override this value.
-
-Standard settings in the Helm chart:
-
-{{% code-title %}}
-altinn-studio-charts/charts/deployment/values.yaml
-{{% /code-title %}}
-
-```yaml
-replicaCount: 2
-
-...
-```
-
-To override the settings in your app, you can add `replicaCount` under `deployment` i `App/deployment/values.yaml`:
-
-{{% code-title %}}
-App/deployment/values.yaml
-{{% /code-title %}}
-
-```yaml{linenos=false,hl_lines="3"}
-deployment:
-
- replicaCount: 3
-
-...
-```
-
-### Autoscaling
-
-When configuring how autoscaling behaves, you need to consider the following sections:
-
-1. `resources`: Guarantees and limits for CPU and memory for app pods during runtime. See [Resource Configuration](#resources-configuration).
-2. `autoscaling`: Settings for when the application should scale up or down.
-
-Autoscaling utilizes the [Horizontal Pod Autoscaler](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/) to automatically scale an app up and down based on CPU usage.
-
-The `autoscaling` section configures when an application should automatically scale.
-
-Default settings in the Helm chart:
-
-{{% code-title %}}
-altinn-studio-charts/charts/deployment/values.yaml
-{{% /code-title %}}
-
-```yaml
-...
-
-autoscaling:
- enabled: true
- replicas:
- min: 2
- max: 10
- avgCpuUtilization: 70
- behavior:
- stabilizationWindowSeconds:
- scaleUp: 0
- scaleDown: 120
-
-...
-```
-
-#### `autoscaling.replicas`
-- `min`: The lowest number of pods the autoscaler is allowed to scale down to.
-- `max`: The highest number of pods the autoscaler is allowed to scale up to.
-
-#### `autoscaling.avgCpuUtilization`
-`avgCpuUtilization` sets the threshold for the percentage of CPU requests utilized before scaling up or down.
-
-Scaling up is not immediate, as a new pod takes time to start (1-2 minutes in most cases).
- If all resources in a cluster are reserved, a new node must be started in Azure (5-10 minutes in most cases).
- It is, therefore, wise to have a small buffer so that the application can handle the load until the capacity is expanded.
-
-#### `autoscaling.behavior.stabilizationWindowSeconds`
-The stabilization window limits the flickering of replicas when the values used for scaling vary.
-
-- `scaleUp`: The number of seconds Kubernetes should wait after the last scaling before performing a new scaling-up evaluation.
-- `scaleDown`: The number of seconds Kubernetes should wait after the last scaling before it performs a new evaluation for scaling down.
-
-With standard settings, scaling up will happen once the consumption exceeds the threshold values. Scaling down will wait for two minutes.
-
-## Resources configuration
-The ideal settings for `resources` depend on the application's code and tasks. We have tried to set default values that should work for as many of the apps in Altinn as possible, but they may not be suitable for your app.
-
-Default values in the Helm chart:
-
-{{% code-title %}}
-altinn-studio-charts/charts/deployment/values.yaml
-{{% /code-title %}}
-
-```yaml
-...
-
-resources:
- requests:
- cpu: 300m
- memory: 256Mi
-
-...
-```
-
-Values that are possible to configure (the values below are just an example and by no means definitive):
-
-{{% code-title %}}
-App/deployment/values.yaml
-{{% /code-title %}}
-
-```yaml
-deployment:
-
- resources:
- requests:
- cpu: 200m
- memory: 256Mi
- limits:
- cpu: 1000m
- memory: 512Mi
-
-...
-```
-
-#### `deployment.resources.requests`
-The `requests` property defines the resources reserved for each pod in the app and are used when the Kubernetes scheduler determines which node the pod should run on.
- Based on these settings, the maximum number of pods that can run on a node is calculated.
- The maximum number is limited by the setting allowing the fewest pods.
-
-{{% expandsmall id="example1" header="Example" %}}
-
-Given a cluster with nodes, each having 2 cores (2000 milliCores) and 4Gi memory, and where all pods have requests set to 200m (200 milliCores) and 256Mi:
-- Based on CPU requests, the number of pods that can run on each node is: _2000 / 200 = 10_
-- Based on memory requests, the number of pods that can run on each node is: _4096Mi / 256Mi = 16_
-
-*The maximum number of pods that can run on each node, with or without load in the solution, is 10.*
-{{% /expandsmall %}}
-
-`requests` are also used by the Horizontal Pod Autoscaler to determine whether the app should scale up or down.
-
-The `requests` settings do not limit how much CPU or memory an application can use if there are available resources.
- However, a pod may be "evicted" from the node if there are few available resources and the pod uses more than specified in `requests`.
-
-#### `deployment.resources.limits`
-`limits` define how much of a resource a pod can use at most.
-
-If a pod tries to use more CPU than what is set as a limit, it will be throttled.
-
-If a pod attempts to allocate more memory than what is set as a limit, it will be terminated with an Out Of Memory (OOM) error.
-## Linkerd
-By default, all services are add to the [Linkerd](https://linkerd.io/) service mesh:
-
-{{% code-title %}}
-altinn-studio-charts/charts/deployment/values.yaml
-{{% /code-title %}}
-
-```yaml
-...
-
-linkerd:
- enabled: true
-
-...
-```
-
-{{% notice warning %}}
-We strongly recommend not changing this setting as it adds mutual TLS and other security features to all communication between services in the cluster.
-{{% /notice %}}
-
-## Mounting of volumes
-`volumes` and `volumeMounts` define volumes mounted to the application's filesystem. `Volumes` describe the content of the mounted resource, and `volumeMounts` specify where in the application's filesystem the content should be mounted.
-
-There are two predefined mounted resources and mounting points in the Helm chart that are necessary for standard functionality, including communication with the Altinn Platform:
-
-{{% code-title %}}
-altinn-studio-charts/charts/deployment/values.yaml
-{{% /code-title %}}
-
-```yaml
-...
-
-volumeMounts:
- - name: datakeys
- mountPath: /mnt/keys
- - name: accesstoken
- mountPath: "/accesstoken"
-
-volumes:
- - name : datakeys
- persistentVolumeClaim:
- claimName: keys
- - name: accesstoken
- secret:
- secretName: accesstoken
-
-...
-```
-
-Custom volumes can be added under the `development` section in `App/deployment/values.yaml`.
-
-At the moment, there is only one use case for adding other volumes: [Fetching secrets from Azure Key Vault](/app/development/configuration/secrets/).
-
-## Service
-
-The `service` configuration defines which port is exposed internally in the cluster and which external port it should be mapped to.
-
-Default settings in the Helm chart:
-
-```yaml
-...
-
-service:
- name: deployment
- type: ClusterIP
- externalPort: 80
- ## If your application is running on another port, change only the internal port.
- internalPort: 5005
-
-...
-```
-
-If your application is running on a different port than 5005, you can configure `deployment.service.internalPort` in the application's `values.yaml` file:
-
-```yaml
-deployment:
-...
-
- service:
- internalPort: 5007
-
-...
-```
-
-{{% notice warning %}}
-**Note:** Settings for `externalPort` must not be changed.
-{{% /notice %}}
-
-## Settings overridden at deploy time
-
-- `image`
-- `ingressRoute`
-
-These settings are overridden during publishing, so changes here will have no effect.
\ No newline at end of file
diff --git a/content/app/development/configuration/deployment/_index.nb.md b/content/app/development/configuration/deployment/_index.nb.md
deleted file mode 100644
index 40df0475c74..00000000000
--- a/content/app/development/configuration/deployment/_index.nb.md
+++ /dev/null
@@ -1,291 +0,0 @@
----
-title: Publisering
-description: Konfigurering av innstillinger for publisering og kjøretid
-toc: true
-weight: 600
----
-
-#### Helm Chart
-
-Altinn-applikasjoner publiseres til et Kubernetes-cluster og benytter seg av et såkalt 'deployment Helm chart'.
- Et Helm chart inneholder nødvendige ressurser for å kunne publisere en app, inkludert YAML konfigurasjonsfiler.
-
-Basert på tester og erfaringer har vi satt noen standard verdier i et sentralt [Helm chart](https://github.com/Altinn/altinn-studio-charts/blob/main/charts/deployment/values.yaml) som utgangspunkt for publisering av Altinn-applikasjoner.
-Disse verdiene kan endre seg etter hvert som vi får mer erfaring.
-
-{{% notice info %}}
-Fra versjon [2.0.0](/community/changelog/deployment/v2) av 'deployment Helm chart' er autoskalering tilgjengelig og aktivert som standard.
-{{% /notice %}}
-
-#### Egendefinerte verdier
-
-Egne innstillinger konfigureres i filen `App/deployment/valus.yaml` ved å legge til ønsket egenskap under seksjonen `deployment`.
- Disse innstillingene vil overskrive tilsvarende innstillinger i Helm chart (for unntak, se [her](#innstillinger-som-blir-overskrevet-ved-publisering)).
- Se [Initiell skalering](#initiell-skalering) for et eksempel.
-
-{{% notice warning %}}
-Merk at formatet i `values.yaml` i det sentrale Helm chart skiller seg litt fra formatet i `values.yaml` i applikasjonen;
- i Helm chart ligger egenskapene på toppnivå, mens de i appen må legges under seksjonen `deployment`.
-{{% /notice %}}
-
-## Skalering
-
-### Initiell skalering
-
-Initiell skalering er definert av `replicaCount`. Merk at hvis autoskalering er aktivert vil denne overstyre `replicaCount`.
-
-Standard innstilling i Helm chart:
-
-{{% code-title %}}
-altinn-studio-charts/charts/deployment/values.yaml
-{{% /code-title %}}
-
-```yaml
-replicaCount: 2
-
-...
-```
-
-For å overskrive verdien for din app legger du til `replicaCount` under `deployment` i `App/deployment/values.yaml`:
-
-{{% code-title %}}
-App/deployment/values.yaml
-{{% /code-title %}}
-
-```yaml{linenos=false,hl_lines="3"}
-deployment:
-
- replicaCount: 3
-
-...
-```
-
-### Autoskalering
-
-Når man skal konfigurere hvordan autoskaleringen oppfører seg må man ta hensyn til følgende seksjoner:
-1. `resources`: garantier og grenser for CPU og minnne for app pods under kjøring. Se [Konfigurasjon av ressurser](#konfigurasjon-av-ressurser).
-2. `autoscaling`: innstilling for når applikasjonen skal skaleres opp eller ned.
-
-Autoskalering benytter [Horizontal Pod Autoscaler](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/)
-for å automatisk skalere opp og ned en app basert på CPU-forbruk.
-
-Seksjonen `autoscaling` konfigurerer når en applikasjon automatisk skal skaleres.
-
-Standard innstillinger i Helm chart:
-
-{{% code-title %}}
-altinn-studio-charts/charts/deployment/values.yaml
-{{% /code-title %}}
-
-```yaml
-...
-
-autoscaling:
- enabled: true
- replicas:
- min: 2
- max: 10
- avgCpuUtilization: 70
- behavior:
- stabilizationWindowSeconds:
- scaleUp: 0
- scaleDown: 120
-
-...
-```
-
-#### `autoscaling.replicas`
- - `min`: Det laveste antall pods autoskaleringen har lov til å sette.
- - `max`: Det høyeste antall pods autoskalering har lov til å sette.
-
-#### `autoscaling.avgCpuUtilization`
-
-`avgCpuUtilization` setter terskelen for prosent av cpu request som er utnyttet før opp- eller nedskalering skal skje.
-
-Oppskaleringen er ikke umiddelbar siden en ny pod trenger tid på å starte (1-2 min i de fleste tilfeller).
-Hvis alle ressursene i et cluster er reservert må en ny node startes opp i azure (5-10 min i de fleste tilfeller).
-Det er derfor lurt å ha en liten buffer sånn at applikasjonen kan håndtere lasten frem til kapasiteten er utvidet.
-
-#### `autoscaling.behavior.stabilizationWindowSeconds`
-Stabiliseringsvinduet brukes for å begrense flimringen av kopier når verdiene som brukes for skalering varierer.
-
-
-- `scaleUp`: Antall sekunder kubernetes skal vente etter siste skalering før den gjør en ny evaluering om oppskalering.
-- `scaleDown`: Antall sekunder kubernetes skal vente etter siste skalering før den gjør en ny evaluering om nedskalering.
-
-Som standard vil en oppskalering skje så fort forbruket er over terskelverdiene. Nedskalering vil vente i to minutter.
-
-## Konfigurasjon av ressurser
-
-Hvilke innstillinger som er ideelle for ressurser (`resources`) er avhengig av applikasjonens kode og oppgavene den utfører.
-Vi har forsøkt å sette standard verdier som skal fungere for så mange av appene i Altinn som mulig, men det er ikke sikkert de passer for din app.
-
-Standard verdier i Helm chart:
-
-{{% code-title %}}
-altinn-studio-charts/charts/deployment/values.yaml
-{{% /code-title %}}
-
-```yaml
-...
-
-resources:
- requests:
- cpu: 300m
- memory: 256Mi
-
-...
-```
-
-Verdier som er mulige å konfigurere (verdiene under er kun som et eksempel og på ingen måte en fasit):
-
-{{% code-title %}}
-App/deployment/values.yaml
-{{% /code-title %}}
-
-```yaml
-deplyoment:
-
- resources:
- requests:
- cpu: 200m
- memory: 256Mi
- limits:
- cpu: 1000m
- memory: 512Mi
-
-...
-```
-
-#### `deployment.resources.requests`
-
-`requests` fastsetter ressursene som vil bli reservert for hver pod i appen og brukes når Kubernetes-planleggeren bestemmer hvilken node poden skal kjøre på.
- Basert på disse innstillingene beregnes maksimalt antall pods som kan kjøre på en node.
- Maks antall begrenses av den innstillingen som tillater færrest antall pods.
-
-{{% expandsmall id="eksempel1" header="Eksempel" %}}
-
-Gitt et cluster med noder som hver har 2 cores (2000 millicores) og 4Gi minne og hvor alle pods har requests satt til 200m (200 millicores) og 256Mi:
-- Basert på CPU-request er antall pods som kan kjøre på hver node: _2000 / 200 = 10_
-- Basert på minne-request er antall pods som kan kjøre på hver node: _4096Mi / 256Mi = 16_
-
-*Maksimalt antall pods som kan kjøre på hver node, med eller uten last i løsningen, er da 10.*
-{{% /expandsmall %}}
-
-`requests` brukes også av Horizontal Pod Autoscaler for å avgjøre om appen skal skaleres opp eller ned.
-
-`requests` begrenser ikke hvor mye CPU eller minne en applikasjon kan bruke dersom mer er tilgjengelig.
- En pod kan imidlertid blir "kastet ut" av noden dersom det er lite tilgjengelige ressurser og poden bruker mer enn angitt i `requests`.
-
-#### `deployment.resources.limits`
-
-`limits` definerer hvor mye ressurser en pod kan maksimalt bruke.
-
-Hvis en pod forsøker å benytte mer CPU en det som er satt som limit vil denne bli strupet.
-
-Hvis en pod forsøker å allokere mer minne en det som er satt som limit vil den bli terminert med en Out Of Memory (OOM) error.
-
-## Linkerd
-Alle applikasjoner som publiseres er som standard innlemmet i [Linkerd](https://linkerd.io/) sitt service mesh:
-
-{{% code-title %}}
-altinn-studio-charts/charts/deployment/values.yaml
-{{% /code-title %}}
-
-```yaml
-...
-
-linkerd:
- enabled: true
-
-...
-```
-
-{{% notice warning %}}
-Vi anbefaler på det sterkeste å ikke endre denne innstillingen da den legger til mutual TLS som krypterer all intern kommunikasjon mellom tjenester i clusteret før det forlater en maskin.
-{{% /notice %}}
-
-## Koble til volumer
-
-`volumes` og `volumeMounts` definerer volumer koblet til applikasjonens filsystem.
- `volumes` beskriver innholdet i den tilkoblede ressursen og `volumeMounts` definerer hvor i applikasjonens filsystem innholdet skal kobles til.
-
-Det er to forhåndsdefinerte tilkoblede ressurser og tilkoblingspunkter i Helm chart som er nødvendig for standard funksjonalitet, blant annet for å kommunisere med Altinn Plattform:
-
-{{% code-title %}}
-altinn-studio-charts/charts/deployment/values.yaml
-{{% /code-title %}}
-
-```yaml
-...
-
-volumeMounts:
- - name: datakeys
- mountPath: /mnt/keys
- - name: accesstoken
- mountPath: "/accesstoken"
-
-volumes:
- - name : datakeys
- persistentVolumeClaim:
- claimName: keys
- - name: accesstoken
- secret:
- secretName: accesstoken
-
-...
-```
-
-Egendefinerte volumer kan legges til under `development` i `App/deployment/values.yaml`.
-
-På gjeldende tidspunkt er det kun ett bruksområde for å legge til andre volumer: [Hente hemmeligheter fra Azure Key Vault](/nb/app/development/configuration/secrets/).
-
-## Service
-
-Konfigurasjon av `service` definerer hvilken port som eksponeres internt i clusteret og hvilken ekstern port denne skal mappes til.
-
-Standard innstillinger i Helm chart:
-
-{{% code-title %}}
-altinn-studio-charts/charts/deployment/values.yaml
-{{% /code-title %}}
-
-```yaml
-...
-
-service:
- name: deployment
- type: ClusterIP
- externalPort: 80
- ## If your application is running on another port, change only the internal port.
- internalPort: 5005
-
-...
-```
-
-Hvis din applikasjon kjører på annen port enn 5005 kan du konfigurere dette i applikasjonens `values.yaml` fil:
-
-{{% code-title %}}
-App/deployment/values.yaml
-{{% /code-title %}}
-
-```yaml
-deployment:
-...
-
- service:
- internalPort: 5007
-
-...
-```
-
-{{% notice warning %}}
-**NB!** Innstilling for `eksternalPort` må ikke endres.
-{{% /notice %}}
-
-## Innstillinger som blir overskrevet ved publisering
-
-- `image`
-- `ingressRoute`
-
-Disse innstillingene blir overskrevet ved publisering så endringer her vil ikke ha noen effekt.
diff --git a/content/app/development/configuration/eformidling/_index.en.md b/content/app/development/configuration/eformidling/_index.en.md
deleted file mode 100644
index c5be4cdc8be..00000000000
--- a/content/app/development/configuration/eformidling/_index.en.md
+++ /dev/null
@@ -1,324 +0,0 @@
----
-title: eFormidling
-description: How to configure integration with eFormidling for an app.
-toc: true
-weight: 400
----
-
-## Activate eFormidling integration for your application
-
-{{%notice info%}}
-Nuget versions >= 4.22.0 are required for your application to support eFormidling.
-[See how to update the nuget references of your application here](/app/maintainance/dependencies/).
-{{% /notice%}}
-
-{{%notice info%}}
-In version 7 a change was introduced to ensure that the application knows the delivery status of messages sent through eFormidling and in the case of a failed delivery will log this explicitly. This introduces the need for [inbound event support in the application](/app/development/logic/events)
-{{% /notice%}}
-
-Integration with eFormidling needs to be explicitly activated in the application.
-
-In the file _appsettings.json_ in the folder _App_, the following must be added to the _AppSettings_ section.
-
-```json
-"EnableEFormidling": true
-```
-
-In addition, continuing in the same file, a new section `EFormidlingClientSettings` should be added.
-The contents of the code snippet below can be copied in its entirety.
-This sets up the url for the integration point.
-The link points to the mock that can be ran locally.
-[Read more about setting up the local mock for the integration point here](#testing-eformidling-integration-locally).
-
-When an application is deployed to TT02 or production,
-this value will be substituted to point to the integration point hosted in Altinn Platform.
-
-```json
-"EFormidlingClientSettings": {
- "BaseUrl": "http://localhost:9093/api/"
- }
-```
-
-In the case you do not wish to test the eFormidling integration when running your app locally,
-you can override this configuration in _appsettings.Development.json_.
-
-Create the section _AppSettings_, if it does not already exist, and set _EnableEFormidling_ to false.
-
-```json
-"AppSettings": {
- "EnableEFormidling": false
-}
-```
-{{}}
-
-{{}}
-eFormidling integration is a part of the Altinn.App.Core nuget package, but is not enabled by default. In order to add support for eFormidling in your application you need to register it's services by adding the following to _Program.cs_:
-
-```csharp
-services.AddEFormidlingServices(config);
-```
-
-{{}}
-{{}}
-## Adding support for eFormidling in App.cs
-
-The next step in setting up support of eFormidling ,
-is to make the required services available for the application.
-All changes are made in _App.cs_, which you fill find in the _App/logic folder.
-
-At the top of the file, among the library references, include the following three lines.
-
-```cs
-using Altinn.Common.EFormidlingClient.Models;
-using Altinn.Common.EFormidlingClient;
-using Altinn.Common.AccessTokenClient.Services;
-```
-
-Further, you need to inject services in the constructor of both the class and the base class.
-
-Before making any changes, the constructor should look like the example below,
-but which services are included may vary from application to application.
-This shows the most common setup.
-
-
-```cs
-public App(
-IAppResources appResourcesService,
-(...)
-IHttpContextAccessor httpContextAccessor):base(
-appResourcesService,
-(...)
-httpContextAccessor)
-```
-
-The list of services in the constructor should be extended with the four services listed below.
-
-```cs
-IEFormidlingClient eformidlingClient,
-IOptions appsettings,
-IAccessTokenGenerator tokenGenerator,
-IOptions platformSettings
-```
-
-Further, these services should be forwarded to the base class as well,
-but in this case only include the names, not the types.
-
-
-```cs
-eformidlingClient,
-appsettings,
-platformSettings,
-tokenGenerator
-```
-
-Final result should look like this:
-
-```cs
-public App(
-IAppResources appResourcesService,
-(...)
-IHttpContextAccessor httpContextAccessor,
-IEFormidlingClient eformidlingClient,
-IOptions appsettings,
-IAccessTokenGenerator tokenGenerator,
-IOptions platformSettings):base(
-appResourcesService,
-(...)
-httpContextAccessor,
-eformidlingClient,
-appsettings,
-platformSettings,
-tokenGenerator)
-```
-{{}}
-
-{{}}
-
-## Configuring key values for eFormidling in your application
-
-Metadata related to the eFormidling shipment is required,
-and this is set up in _applicationmetadata.json_.
-You find the file in the _App/config_ folder.
-
-Create a new section `eFormidling` and populate values for the
-parameters defined in the table.
-
-| Id | Description |
-| --------------- | ---------------------------------------------------------------------------------------------------------- |
-| serviceId | Id that specifies the shipment type [DPO](https://samarbeid.digdir.no/eformidling/offentlige-virksomheter-dpo/149)\*, [DPV](https://samarbeid.digdir.no/eformidling/private-virksomheter-dpv/150), [DPI](https://samarbeid.digdir.no/eformidling/innbyggere-dpi/152) or [DPF](https://samarbeid.digdir.no/eformidling/kommunar-dpf/151)\* |
-| dpfShipmentType | The DPF shipment type used for routing in the receiving system |
-| process | Id which wil be included in the scope of the StandardBusinessDocumentHeader\*\* |
-| dataTypes | List of data types to automatically include in the shipment |
-| sendAfterTaskId | Id of the task to be completed before the shipment is sent. We recommend this be a confirmation task |
-| receiver | Organisation number of the receiver. Only Norwegian organisations supported. (Can be omitted) |
-| standard | DocumentIdentification standard |
-| type | Id for the [message type](https://docs.digdir.no/eformidling_nm_message.html#meldingstypene) |
-| typeVersion | Version of the message type |
-| securityLevel | Security lever set on the StandardBusinessDocument |
-
-\* per June 2023 there is support for DPF and DPO.
-
-\*\* available process for each receiver is available at https://platform.altinn.no/eformidling/api/capabilities/{mottaker-orgnummer}
-
-
-An example of a configuration in application metadata:
-
-```json
-"eFormidling": {
- "serviceId": "DPF",
- "dpfShipmentType": "altinn3.skjema",
- "process": "urn:no:difi:profile:arkivmelding:administrasjon:ver1.0",
- "dataTypes": [ "ref-data-as-pdf" ],
- "sendAfterTaskId": "Task_2",
- "receiver": "910075918",
- "standard": "urn:no:difi:arkivmelding:xsd::arkivmelding",
- "type": "arkivmelding",
- "typeVersion": "2.0",
- "securityLevel": 3
-}
-```
-
-## Shipment metadata generation in the application
-
-The application developer is responsible for creating the message that will follow a shipment through eFormidling.
-[Read about the various message types available in eFormidling.](https://docs.digdir.no/eformidling_nm_message.html#meldingstypene)
-
-In versions 4, 5 and 6 this was achieved by including the function below in _App.cs_. While in version 7 this is done by adding a class that implements the `IEFormidlingMetadata` interface which has the same method signature. Remember that in version 7 your implementation need to be registered in _Program.cs_.
-
-Expected output from this function is a tuple containing two elements.
-First, the name of the metadata file and then a stream containing the metadata.
-
-```cs
-///
-public override async Task<(string, Stream)> GenerateEFormidlingMetadata(Instance instance)
-{
- Altinn.Common.EFormidlingClient.Models.Arkivmelding arkivmelding = new ();
-
- // bygg opp arkivmeldingen eller annet metadataobjekt her.
-
- MemoryStream stream = new MemoryStream();
- XmlSerializer serializer = new XmlSerializer(typeof(Altinn.Common.EFormidlingClient.Models.Arkivmelding));
- serializer.Serialize(stream, arkivmelding);
- stream.Position = 0;
- StreamContent streamContent = new StreamContent(stream);
- streamContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/xml");
- return await Task.FromResult(("arkivmelding.xml", stream));
-}
-```
-
-## Dynamically setting the shipment receiver
-This functionally can be used whenever the receiver of a shipment is to be determined dynamically.
-
-{{}}
-{{}}
-In version 7 the GetEformidlingReceivers method is moved to the `IEFormidlingReceivers` interface. Create a class that implements this interface and register the implementation in _Program.cs_. Below is a skeleton example for the implementation.
-```csharp
-public async Task> GetEFormidlingReceivers(Instance instance)
-{
- Identifier identifier = new Identifier
- {
- Authority = "iso6523-actorid-upis"
- };
-
- // 0192 prefix for all Norwegian organisations.
- identifier.Value = "[INSERT ORGANISATION NUMBER HERE WITH PREFIX `0192:`]" ;
-
- Receiver receiver = new Receiver { Identifier = identifier };
- return new List { receiver };
-}
-```
-{{
}}
-{{}}
-In _App.cs_ it is possible to override the method retrieving the receiver from _applicationmetadata.json_.
-Three steps are required when defining the receiver in the application logic,
-and all steps are executed in _App.cs_.
-
-1. At the top of the file, a reference to the eFormidling library must be included.
- ```cs
- using Altinn.Common.EFormidlingClient.Models.SBD;
- ```
-2. Include the function below in the class.
- Expected output from this method is a list containing at least one receiver object.
- ```cs
- public override async Task> GetEFormidlingReceivers(Instance instance)
- {
- Identifier identifier = new Identifier
- {
- Authority = "iso6523-actorid-upis"
- };
-
- // 0192 prefix for all Norwegian organisations.
- identifier.Value = "[INSERT ORGANISATION NUMBER HERE WITH PREFIX `0192:`]" ;
-
- Receiver receiver = new Receiver { Identifier = identifier };
- return new List { receiver };
- }
- ```
-3. Add custom logic to populate _identifier.Value_ in the function.
- Note that only Norwegian organisations are supported,
- and that the prefix `0192:` is required before the organisation number.
-{{
}}
-
-{{}}
-## Testing eFormidling integration locally
-
-It is possible to test the eFormidling integration for an application in
-your development environment.
-In addition to Altinn's Local test, and the application, there are two things that need to run:
-
-1. eFormidling integration point (Integrasjonspunktet)
-2. A mock of eFormidling
-
-### Setup
-
-1. Install the latest version of Java.
- [Download link and installation guide is available here](https://docs.oracle.com/cd/E19182-01/821-0917/inst_jdk_javahome_t/index.html)
-2. In the next steps you will be downloading a number of files.
- Define a suitable placement for everything eFormidling related on your local machine and navigate there in your terminal.
-3. Clone the eFormidling mock repository with the following command
- ```cmd
- git clone --branch development https://github.com/felleslosninger/efm-mocks.git
- ```
-4. [Download the integration point](https://docs.digdir.no/eformidling_download_ip.html).
- The contents can be places at the same level as the `efm-mocks` folder.
-
-
-#### Running eFormidling locally
-
-1. Open a terminal and navigate to `efm-mocks` (Command prompt or bash is recommended, PowerShell will not work.)
-2. Run `docker-compose up -d`
-3. Navigate to the folder where the integration point file exists.
-4. Run the command `java -Xmx2g -Dspring.profiles.active=mock -jar integrasjonspunkt-2.2.6.jar`
- If you have a newer version of the integration point, the commands last section should be adjusted to reflect this.
-
-This has a known issue that prevents it from running on Docker Desktop on Windows, but works on Mac.
-
-#### Verify that eFormidling is set up correctly
-
-This requires that [node and npm](https://www.npmjs.com/get-npm) is present on your machine,
-but they are note required to use the mock.
-
-- Open a terminal and navigate to `efm-mocks/tests/`
-- Run `npm i`
-- Navigate into the folder `next-move`
-- Run `node NextMove.js dpf`
-- Verify in a browser at [localhost:8001](http://localhost:8001/) that there are new table entries containing the sent messages.
-
-[Read more about the mock here](https://github.com/felleslosninger/efm-mocks)
-
-
-## Testing eFormidling integration in a test environment
-
-{{%notice warning%}}
-Thorough testing for the eFormidling integration in an application is encouraged.
-Safety measures and retry mechanisms are in place to ensure that a shipment
-reaches the receiver when errors are due to weak network connections.
-However, invalid shipments, including but not limited to missing attachments or mistakes in the "arkivmelding",
-vil cause the shipment to fail without explicit warning the end user or app owner.
-{{% /notice%}}
-
-The integration point exposes endpoints that allow you to monitor the status of a shipment in the test environment.
-`https://platform.tt02.altinn.no/eformidling/api/conversations?messageId={instanceGuid}`
-
-Replace `{instanceGuid}` with the guid of the instance that has been archived.
-
diff --git a/content/app/development/configuration/eformidling/_index.nb.md b/content/app/development/configuration/eformidling/_index.nb.md
deleted file mode 100644
index a16a3b161d6..00000000000
--- a/content/app/development/configuration/eformidling/_index.nb.md
+++ /dev/null
@@ -1,318 +0,0 @@
----
-title: eFormidling
-description: Hvordan konfigurere eFormidling integrasjon for en app.
-toc: true
-weight: 400
----
-
-## Aktivere integrasjon med eFormidling i applikasjonen din
-
-{{%notice info%}}
-For at applikasjonen din skal kunne sende instansdata videre til eFormidling må den referere til nugetversjon >= 4.22.0.
-[Se hvordan du oppdaterer nugetreferanser for applikasjonen din her](/app/maintainance/dependencies/).
-{{% /notice%}}
-
-{{%notice info%}}
-I versjon 7 ble det innført en endring for å sikre at applikasjonen kjenner den endelige leveransestatsus for meldinger sent gjennom integrasjonspunktet til eFormidling og i tilfelle feilende leveranser vil disse logges eksplisitt. Denne endringer introduserer behovet for [hendelsestøtte i applikasjonen](/app/development/logic/events).
-{{% /notice%}}
-
-Dersom man har behov for integrasjon med eFormidling i applikasjonen må dette aktiveres.
-
-I filen _appsettings.json_ i mappen _App_ må følgende legges til i seksjonen _AppSettings_
-
-```json
-"EnableEFormidling": true
-```
-
-I tillegg må det i samme fil opprettes en ny seksjon; _EFormidlingClientSettings_.
-Innholdet i kodesnutten nedenfor kan kopieres i sin helhet.
-Denne setter opp url til integrasjonspunktet.
-Lenken peker på mocken som kan kjøres opp lokalt.
-[Les mer om oppsettet av eFormidlings mocken her](#lokal-test-av-applikasjon-med-eformidling).
-
-Når en app deployes til TT02 eller produksjon vil denne verdien overskrives
-og peke mot integrasjonspunktet i Altinn Platform.
-
-
-```json
-"EFormidlingClientSettings": {
- "BaseUrl": "http://localhost:9093/api/"
- }
-```
-
-Dersom det ikke er ønskelig å teste integrasjonen med eFormidling når man kjører applikasjonen lokalt kan man overstyre
-denne konfigurasjonen i _appsettings.Development.json_.
-
-Opprett `AppSettings` seksjonen dersom den ikke finnes og sett `EnableEFormidling` til false.
-
-```json
-"AppSettings": {
- "EnableEFormidling": false
-}
-```
-
-{{}}
-
-{{}}
-eFormidlingsintegrasjonen er en del av Altinn.App.Core nuget pakken, men er ikke aktivert som standard. For å aktivere støtte for eFormidling in applikasjonen må du registrere tjenestene ved å legge til følgende i _Program.cs_:
-
-```csharp
-services.AddEFormidlingServices(config);
-```
-{{}}
-{{}}
-## Legge til støtte for eFormidling i App.cs
-
-Neste steg for å få støtte for eFormidling i tjenesten din er å tilgjengeliggjøre services som appen behøver.
-Endringene skal alle gjøres i filen _App.cs_ som ligger i mappen _App/logic.
-
-Øverst i filen, blant bibliotekreferansene legges disse tre linjene til.
-
-```cs
-using Altinn.Common.EFormidlingClient.Models;
-using Altinn.Common.EFormidlingClient;
-using Altinn.Common.AccessTokenClient.Services;
-```
-
-Videre skal vi injecte services i konstruktøren til både klassen og base klassen.
-
-Konstruktøren vil se ut som eksempelet nedenfor, men hvilke services som sendes med kan variere fra tjeneste til tjeneste,
-så her er kun et eksempel på det vanligste oppsettet.
-
-```cs
-public App(
-IAppResources appResourcesService,
-(...)
-IHttpContextAccessor httpContextAccessor):base(
-appResourcesService,
-(...)
-httpContextAccessor)
-```
-
-Listen med services i konstruktøren skal utvides med de fire servicene vist nedenfor.
-
-```cs
-IEFormidlingClient eformidlingClient,
-IOptions appsettings,
-IAccessTokenGenerator tokenGenerator,
-IOptions platformSettings
-```
-
-Videre skal disse servicene sendes med videre til baseklassen, da er det kun navnene som sendes med og ikke typene.
-
-```cs
-eformidlingClient,
-appsettings,
-platformSettings,
-tokenGenerator
-```
-
-Endelig resultat skal se slik ut:
-
-```cs
-public App(
-IAppResources appResourcesService,
-(...)
-IHttpContextAccessor httpContextAccessor,
-IEFormidlingClient eformidlingClient,
-IOptions appsettings,
-IAccessTokenGenerator tokenGenerator,
-IOptions platformSettings):base(
-appResourcesService,
-(...)
-httpContextAccessor,
-eformidlingClient,
-appsettings,
-platformSettings,
-tokenGenerator)
-```
-{{}}
-
-{{}}
-
-## Konfigurere nøkkelverdier for eFormidling i applikasjonen din
-
-Det kreves en del metadata om eFormidlingsforsendelsen og denne defineres i applicationmetadata.json_.
-Filen finner du i repoet under mappen _App/config_.
-
-Opprett seksjonen `eFormidling` og fyll ut verdier for følgende parametre.
-
-| Id | Beskrivelse |
-| --------------- | ---------------------------------------------------------------------------------------------------------- |
-| serviceId | Id som spesifiserer type forsendelse [DPO](https://samarbeid.digdir.no/eformidling/offentlige-virksomheter-dpo/149)\*, [DPV](https://samarbeid.digdir.no/eformidling/private-virksomheter-dpv/150), [DPI](https://samarbeid.digdir.no/eformidling/innbyggere-dpi/152) eller [DPF](https://samarbeid.digdir.no/eformidling/kommunar-dpf/151)\* |
-| dpfShipmentType | Forsendelsestype som benyttes til routing på mottakersiden |
-| process | Id som settes på scopet i StandardBusinessDocumentHeader\*\* |
-| dataTypes | Liste av data typer som automatisk skal legges ved forsendelsen |
-| sendAfterTaskId | Id på tasken som skal avsluttes før forsendelsen sendes. Det er anbefalt at dette er et confirmation steg |
-| receiver | Organisasjonsnummer til mottaker. Støtter kun norske virksomheter. Kan sløyfes og defineres i applogikken |
-| standard | DocumentIdentification standard |
-| type | Id på [meldingstypen](https://docs.digdir.no/eformidling_nm_message.html#meldingstypene) |
-| typeVersion | Versjon av meldingstypen |
-| securityLevel | Sikkerhetsnivå som settes på StandardBusinessDocument |
-
-\* per juni 2023 er det støtte for DPF og DPO.
-
-\*\* tilgjengelige prosesser for mottaker er tilgjengelig på https://platform.altinn.no/eformidling/api/capabilities/{mottaker-orgnummer}
-
-
-Et eksempel for en konfigurasjon i application metadata:
-
-```json
-"eFormidling": {
- "serviceId": "DPF",
- "dpfShipmentType": "altinn3.skjema",
- "process": "urn:no:difi:profile:arkivmelding:administrasjon:ver1.0",
- "dataTypes": [ "ref-data-as-pdf" ],
- "sendAfterTaskId": "Task_2",
- "receiver": "910075918",
- "standard": "urn:no:difi:arkivmelding:xsd::arkivmelding",
- "type": "arkivmelding",
- "typeVersion": "2.0",
- "securityLevel": 3
-}
-```
-
-## Generering av metadata til forsendelsen i applikasjonen
-
-Apputvikler er selv ansvarlig for å sette opp meldingen til en forsendelse som skal via eFormidling.
-[Les om de ulike meldingstypene tilgjengelig i eFormidling.](https://docs.digdir.no/eformidling_nm_message.html#meldingstypene)
-
-I versjon 4, 5 og 6 ble dette gjort ved å legge til funksjonen nedenfor i _App.cs_. Mens i versjon gjør man dette ved å legge til en klasse som implementerer `IEFormidlingMetadata` grensesnittet som har samme metode og signatur. Husk at i versjon 7 må du også registrere implementeringen din i _Program.cs_.
-
-Forventet output fra denne metoden er en tuppel som inneholder navnet på metadatafilen som første element
-og en stream med metadataen som andre element.
-
-```cs
-///
-public override async Task<(string, Stream)> GenerateEFormidlingMetadata(Instance instance)
-{
- Altinn.Common.EFormidlingClient.Models.Arkivmelding arkivmelding = new ();
-
- // bygg opp arkivmeldingen eller annet metadataobjekt her.
-
- MemoryStream stream = new MemoryStream();
- XmlSerializer serializer = new XmlSerializer(typeof(Altinn.Common.EFormidlingClient.Models.Arkivmelding));
- serializer.Serialize(stream, arkivmelding);
- stream.Position = 0;
- StreamContent streamContent = new StreamContent(stream);
- streamContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/xml");
- return await Task.FromResult(("arkivmelding.xml", stream));
-}
-```
-
-## Sette mottaker for forsendelse i applikasjonslogikken
-Denne funksjonaliteten kan benyttes dersom mottaker av forsendelsen skal avgjøres dynamisk.
-
-I App.cs kan man overstyre metoden som henter ut mottaker av forsendelsen fra applicationmetadata.json_.
-
-{{}}
-
-{{}}
-I versjon 7 er GetEformidlingReceivers metoden flyttet til `IEFormidlingReceivers` grensesnittet. Lag en klasse som implementerer dette grensesnittet og registrer den i _Program.cs_. Nedefor er et eksempel på rammene for en slik implementering:
-```csharp
-public async Task> GetEFormidlingReceivers(Instance instance)
-{
- Identifier identifier = new Identifier
- {
- Authority = "iso6523-actorid-upis"
- };
-
- // 0192 prefix for all Norwegian organisations.
- identifier.Value = "[INSERT ORGANISATION NUMBER HERE WITH PREFIX `0192:`]" ;
-
- Receiver receiver = new Receiver { Identifier = identifier };
- return new List { receiver };
-}
-```
-{{
}}
-{{}}
-Det må tre steg til for å sette mottaker i applikasjonslogikken, og alle endringer gjøres i _App.cs_.
-
-1. Øverst i filen må det legges til en referanse til eFormidlings biblioteket.
-
- ```cs
- using Altinn.Common.EFormidlingClient.Models.SBD;
- ```
-
-2. Legg til denne funksjonen i klassen.
- Forventet output fra denne metoden er en liste som inneholder minst ett receiver-objekt.
-
- ```cs
- public override async Task> GetEFormidlingReceivers(Instance instance)
- {
- Identifier identifier = new Identifier
- {
- Authority = "iso6523-actorid-upis"
- };
-
- // 0192 prefix for all Norwegian organisations.
- identifier.Value = "[INSERT ORGANISATION NUMBER HERE WITH PREFIX `0192:`]" ;
-
- Receiver receiver = new Receiver { Identifier = identifier };
- return new List { receiver };
- }
- ```
-
-3. Legg til egen logikk for å populere _identifier.Value_ i funksjonen.
- Merk at det kun er norske organisasjonsnummer som støttes,
- og at prefiksen `0192:` er påkrevd før organisasjonsnummeret.
-{{
}}
-
-{{}}
-## Lokal test av applikasjon med eFormidling
-
-Det er mulig å teste eFormidlingsintegrasjonen i applikasjonen lokalt på utviklingsmiljøet ditt.
-I tillegg til Altinn Localtest og applikasjonen er det to ting som må kjøre:
-1. eFormidling integrasjonspunkt
-2. mock av eFormidling
-
-### Forberedelser
-
-
-1. Installer siste versjon av Java.
- [Finn nedlastingslenke og beskrivelse av nødvendige steg her](https://docs.oracle.com/cd/E19182-01/821-0917/inst_jdk_javahome_t/index.html)
-2. Det skal nå lastes ned en rekke filer. Finn en egnet plassering for eFormidling lokalt på maskinen din og navigér dit i en terminal.
-3. Klon repoet som inneholder eFormidling mocken med følgende commando
-
- ```cmd
- git clone --branch development https://github.com/felleslosninger/efm-mocks.git
- ```
-
-4. [Last ned integrasjonspunktet herfra](https://docs.digdir.no/eformidling_download_ip.html). Dette kan plasseres på samme nivå som mappen `efm-mocks`.
-
-
-#### Kjøre eFormidling lokalt
-
-1. Åpne en terminal og navigér til `efm-mocks` (Command prompt eller bash er anbefalt, PowerShell funker ikke. )
-2. Kjør `docker-compose up -d`
-3. Navigér til mappen der integrasjonspunkt-filen ligger
-4. Kjør kommandoen `java -Xmx2g -Dspring.profiles.active=mock -jar integrasjonspunkt-2.2.0.jar`
- Dersom du har en nyere versjon av integrasjonspunktet enn `2.2.0` må kommandoen siste ledd i siste linje justeres for dette.
-
-#### Verifiser at eFormidling er satt opp korrekt
-
-Dette steget krever [node og npm](https://www.npmjs.com/get-npm) på maskinen din, men er ikke nødvendig for å bruke mocken.
-
-- Åpne en terminal og navigér til `efm-mocks/tests/`
-- Kjør `npm i`
-- Navigér inn i mappen `next-move`
-- Kjør `node NextMove.js dpf`
-- Verifiser i en broswer på [localhost:8001](http://localhost:8001/) at det er nye innslag i tabellen med de sendte meldingene.
-
-Les mer om mockløsningen [her](https://github.com/felleslosninger/efm-mocks)
-
-## Test av eFormidling integrasjon i testmiljø
-
-{{%notice warning%}}
-Det oppfordres til grundig testing av eFormidlingsintegrasjonen i applikasjonene.
-Det er lagt inn sikringer og retry mekanismer for å få en forsendelse fram til
-mottaker dersom feil skyldes svakheter i nettverksforbindelse.
-I tilfellet ugyldige forsendelser, herunder manglende vedlegg eller feil i arkivmelding,
-vil forsendelsen feile uten eksplisitt varsling til sluttbruker eller tjenesteeier.
-{{% /notice%}}
-
-Integrasjonspunktet eksponerer endepunkter der man kan følge statusen for en forsendelse i testmiljø (tt02).
-`https://platform.tt02.altinn.no/eformidling/api/conversations?messageId={instanceGuid}`
-
-Bytt ut `{instanceGuid}` med guiden til instansen som er blitt innsendt.
-
diff --git a/content/app/development/configuration/events/_index.en.md b/content/app/development/configuration/events/_index.en.md
deleted file mode 100644
index 8f8c3c3116e..00000000000
--- a/content/app/development/configuration/events/_index.en.md
+++ /dev/null
@@ -1,160 +0,0 @@
----
-title: Events
-description: How to create custom events for an app.
-toc: true
-weight: 400
----
-
-## Activate generation of events in your application
-
-{{%notice info%}}
-To allow generating events for your application it must refer to nuget version >= 1.2.4.
-See how you update nuget references for your application [here](/app/maintainance/dependencies/).
-{{% /notice%}}
-
-Generation and storing of events is not enabled by default in applications per 22.10.2020.
-Because of this, a manual step is required before your application can generate events.
-
-In the file `appsettings.json` in the folder _App_ the following should be added into the section _AppSettings_
-
-```json
-"RegisterEventsWithEventsComponent": true
-```
-
-## Pushing self defined events into your application
-
-The service `IEvents` is exposed in the application and can be dependency injected
-into the class where you need to generate a self defined event.
-
-The method _AddEvent_ requires the name of the event type and the instance as input
-
-### Code example
-
-In this section you can find an example of how to generate a self
-defined event by instantiation within the application
-
-The logic is implemented in `InstantiationHandler.cs`
-
-```cs
-using Altinn.App.Services.Interface;
-using Altinn.App.PlatformServices.Interface;
-using Altinn.App.Services.Models.Validation;
-using Altinn.Platform.Storage.Interface.Models;
-using System.Threading.Tasks;
-// using Altinn.App.Models; // Uncomment this line to refer to app model(s)
-
-namespace Altinn.App.AppLogic
-{
- public class InstantiationHandler
- {
- private IProfile _profileService;
- private IRegister _registerService;
- private IEvents _eventsService;
-
- ///
- /// Set up access to profile and register services
- ///
- public InstantiationHandler(IProfile profileService, IRegister registerService, IEvents eventsService)
- {
- _profileService = profileService;
- _registerService = registerService;
- _eventsService = eventsService;
- }
-
- ///
- /// Run validations related to instantiation
- ///
- ///
- /// if ([some condition])
- /// {
- /// return new ValidationResult("[error message]");
- /// }
- /// return null;
- ///
- ///
- ///
- /// The validation result object (null if no errors)
- public async Task RunInstantiationValidation(Instance instance)
- {
- return await Task.FromResult((InstantiationValidationResult)null);
- }
-
- ///
- /// Run events related to instantiation
- ///
- ///
- /// For example custom prefill.
- ///
- /// Instance information
- /// The data object created
- public async Task DataCreation(Instance instance, object data)
- {
- await _eventsService.AddEvent("app.test.event", instance);
- await Task.CompletedTask;
- }
- }
-}
-```
-
-1. The private variable in the service is included in the class
-
- ```cs
- private IEvents _eventsService;
- ```
-
-2. Namespace for IEvents must be included in the class.
- Add the line below among the other _using_ statements in the top of the file.
-
- ```cs
- using Altinn.App.PlatformServices.Interface;
- ```
-
-3. The IEvents service is dependency injected into the class. And the private variable is assigned a value.
-
- ```cs
- public InstantiationHandler(IProfile profileService, IRegister registerService, IEvents eventsService)
- {
- _profileService = profileService;
- _registerService = registerService;
- _eventsService = eventsService;
- }
- ```
-
-4. In the method where you need to generate an event you call the service.
-
- Here the self defined event has received the name `app.test.event`,
- in addition the instance is sent. This is used to populate remaining metadata about the event
-
- ```cs
- await _eventsService.AddEvent("app.test.event", instance);
- ```
-
-5. If you try building the solution at this point, it will fail.
-
- IEvents will be missing the location where the InstantiationHandler is instantiated.
- Navigate to `App.cs`and dependency inject the service into App's constructor.
-
- Further the service must be added into the call where InstantiationHandler is instantiated as shown below.
-
- ```cs
- public App(
- IAppResources appResourcesService,
- ILogger logger,
- IData dataService,
- IProcess processService,
- IPDF pdfService,
- IProfile profileService,
- IRegister registerService,
- IPrefill prefillService,
- IEvents eventsService
- ) : base(appResourcesService, logger, dataService, processService, pdfService, prefillService)
- {
- _logger = logger;
- _validationHandler = new ValidationHandler();
- _calculationHandler = new CalculationHandler();
- _instantiationHandler = new InstantiationHandler(profileService, registerService, eventsService);
- }
- ```
-
-6. Your application is now ready to generate a self defined event during instantiation.
-You can [test this locally](https://github.com/Altinn/app-localtest/blob/master/README.md) before eventually deploying to a test environment.
diff --git a/content/app/development/configuration/events/_index.nb.md b/content/app/development/configuration/events/_index.nb.md
deleted file mode 100644
index 2a809b114cb..00000000000
--- a/content/app/development/configuration/events/_index.nb.md
+++ /dev/null
@@ -1,160 +0,0 @@
----
-title: Events
-description: Hvordan lage egendefinerte events for en app.
-toc: true
-weight: 400
----
-
-## Aktivere generering av events i applikasjonen din
-
-{{%notice info%}}
-For at applikasjonen din skal kunne generere events må den referere til nugetversjon >= 1.2.4.
-Se hvordan du oppdaterer nugetreferanser for applikasjonen din [her](/app/maintainance/dependencies/).
-{{% /notice%}}
-
-Generering og lagring av events er ikke enablet som default i applikasjonene per 22.10.2020.
-Det må derfor et manuelt steg til for at applikasjonen din skal generere events.
-
-I filen `appsettings.json` i mappen _App_ må følgende legges til i seksjonen _AppSettings_
-
-```json
-"RegisterEventsWithEventsComponent": true
-```
-
-## Pushe egendefinerte events i applikasjonen din
-
-Servicen `IEvents` er eksponert i applikasjonen og kan dependency injectes
-i den klassen der du har behov for å generere et egendefinert event.
-
-Metoden _AddEvent_ krever navnet på eventypen og instansen som input.
-
-### Kodeeksempel
-
-I denne seksjonen finner du et eksempel på hvordan man kan generere
-et egendefinert event ved instansiering av applikasjonen.
-
-Logikken er implementert i `InstantiationHandler.cs`
-
-```cs
-using Altinn.App.Services.Interface;
-using Altinn.App.PlatformServices.Interface;
-using Altinn.App.Services.Models.Validation;
-using Altinn.Platform.Storage.Interface.Models;
-using System.Threading.Tasks;
-// using Altinn.App.Models; // Uncomment this line to refer to app model(s)
-
-namespace Altinn.App.AppLogic
-{
- public class InstantiationHandler
- {
- private IProfile _profileService;
- private IRegister _registerService;
- private IEvents _eventsService;
-
- ///
- /// Set up access to profile and register services
- ///
- public InstantiationHandler(IProfile profileService, IRegister registerService, IEvents eventsService)
- {
- _profileService = profileService;
- _registerService = registerService;
- _eventsService = eventsService;
- }
-
- ///
- /// Run validations related to instantiation
- ///
- ///
- /// if ([some condition])
- /// {
- /// return new ValidationResult("[error message]");
- /// }
- /// return null;
- ///
- ///
- ///
- /// The validation result object (null if no errors)
- public async Task RunInstantiationValidation(Instance instance)
- {
- return await Task.FromResult((InstantiationValidationResult)null);
- }
-
- ///
- /// Run events related to instantiation
- ///
- ///
- /// For example custom prefill.
- ///
- /// Instance information
- /// The data object created
- public async Task DataCreation(Instance instance, object data)
- {
- await _eventsService.AddEvent("app.test.event", instance);
- await Task.CompletedTask;
- }
- }
-}
-```
-
-1. Den private variabelen for servicen inkluderes i klassen
-
- ```cs
- private IEvents _eventsService;
- ```
-
-2. Namespce for IEvents må inkluderes i klassen.
- Legg til linjen nedenfor blant de andre _using_-statements øverst i filen.
-
- ```cs
- using Altinn.App.PlatformServices.Interface;
- ```
-
-3. IEvents servicen dependency injectes inn i klassen. Og den private variabelen blir assignet en verdi.
-
- ```cs
- public InstantiationHandler(IProfile profileService, IRegister registerService, IEvents eventsService)
- {
- _profileService = profileService;
- _registerService = registerService;
- _eventsService = eventsService;
- }
- ```
-
-4. I metoden der man har behov for å genere et event kaller man på servicen.
-
- Her har det egendefinerte eventet fått navnet `app.test.event`,
- i tillegg sendes instansen med. Denne brukes til å populere resterende metadata om eventet.
-
- ```cs
- await _eventsService.AddEvent("app.test.event", instance);
- ```
-
-5. Dersom du prøver å bygge løsningen nå vil det feile.
-
- IEvents vil mangle der InstantiationHandler instansieres. Naviger til `App.cs`
- og dependency inject servicen inn i konstruktøren til App.
-
- Videre må tjenesten legges til i kallet der InstantiationHandler instansieres som vist nedenfor.
-
- ```cs
- public App(
- IAppResources appResourcesService,
- ILogger logger,
- IData dataService,
- IProcess processService,
- IPDF pdfService,
- IProfile profileService,
- IRegister registerService,
- IPrefill prefillService,
- IEvents eventsService
- ) : base(appResourcesService, logger, dataService, processService, pdfService, prefillService)
- {
- _logger = logger;
- _validationHandler = new ValidationHandler();
- _calculationHandler = new CalculationHandler();
- _instantiationHandler = new InstantiationHandler(profileService, registerService, eventsService);
- }
- ```
-
-6. Applikasjonen din er nå klar til å generere et egendefinert event under instansiering.
-Dette er mulig å [teste lokalt](https://github.com/Altinn/app-localtest/blob/master/README.md) før det evt. deployes til et testmiljø.
\ No newline at end of file
diff --git a/content/app/development/configuration/filescan/_index.en.md b/content/app/development/configuration/filescan/_index.en.md
deleted file mode 100644
index 23f26dc0007..00000000000
--- a/content/app/development/configuration/filescan/_index.en.md
+++ /dev/null
@@ -1,90 +0,0 @@
----
-title: Virus scan
-description: How to configure virus scan for an app
-toc: true
-weight: 400
----
-
-Each application owner storage is protected by Windows Defender, however, if your application requires feedback in realtime on whether or not an uploaded file is infected, enabling virus scan for some or all data types is the way to go.
-Enabling virus scan results in scan of the file immediately after it uploaded to storage. The scan result will later be added to the metadata for the data element and can be reviewed by any entity that is authorized to read the instance.
-
-## Enable file scan in your application
-
-{{%notice info%}}
-To allow generating events for your application it must refer to nuget version >= 7.4.0.
-See how you update nuget references for your application [here](/app/maintainance/dependencies/).
-{{% /notice%}}
-
-Deep scan of files is not enabled by default, to activate this a manual step is required.
-If a file is scanned and found to be infected before the process is complete, this will cause a validation error.
-
-In the file `applicationmetadata.json` in the folder _App/config_ the following should be added for each datatype that should be scanned.
-
-```json
- "enableFileScan": true
-```
-
-If you would like to customize the error message for infected files you can do that by adding a text with key `DataElementFileInfected`.
-
-## Validation error when waiting for file scan
-
-If the ValidationService should should trigger a validation error and prevent the completion of the process before the scan is complete, another value should be added for the datatype.
-.
-```json
- "validationErrorOnPendingFileScan": true
-```
-If you would like to customize the error message for pending files you can do that by adding a text with key `DataElementFileScanPending`.
-
-Example of `applicationmetadata.json` with file scan enabled for datatype _egenerklaring_, no validation error on pending scan.
-
-```json
-{
- "id": "digdir/egenerklaring-2022",
- "org": "digdir",
- "title": {
- "nb": "egenerklaring-2022"
- },
- "dataTypes": [
- {
- "id": "ref-data-as-pdf",
- "allowedContentTypes": [
- "application/pdf"
- ],
- "maxCount": 0,
- "minCount": 0,
- "enablePdfCreation": true,
- "enableFileScan": false,
- "validationErrorOnPendingFileScan": false
- },
- {
- "id": "egenerklaring",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.egenerklaring",
- "allowAnonymousOnStateless": false,
- "autoDeleteOnProcessEnd": false
- },
- "taskId": "Task_1",
- "maxCount": 1,
- "minCount": 1,
- "enablePdfCreation": true,
- "enableFileScan": true,
- "validationErrorOnPendingFileScan": false
- }
- ],
- "partyTypesAllowed": {
- "bankruptcyEstate": false,
- "organisation": false,
- "person": false,
- "subUnit": false
- },
- "autoDeleteOnProcessEnd": false,
- "created": "2023-02-01T13:16:50.1330774Z",
- "createdBy": "altinn",
- "lastChanged": "2023-02-01T13:16:50.1330784Z",
- "lastChangedBy": "altinn"
-}
-```
diff --git a/content/app/development/configuration/filescan/_index.nb.md b/content/app/development/configuration/filescan/_index.nb.md
deleted file mode 100644
index 85a3c669fb0..00000000000
--- a/content/app/development/configuration/filescan/_index.nb.md
+++ /dev/null
@@ -1,87 +0,0 @@
----
-title: Virus skanning
-description: Hvordan konfigurere virus-skanning for en app
-toc: true
-weight: 400
----
-
-Hver applikasjonseier sin storage er beskyttet av Windows Defender. Hvis din applikasjon krever sanntids tilbakemelding om hvorvidt en opplastet fil er infisert eller ikke, kan du aktivere virus-skanning for spesifikke eller alle datatyper. Når virus-skanning er aktivert, blir filen umiddelbart skannet etter opplasting til storage. Resultatet av skanningen legges til senere i metadataene for dataelementet og kan gjennomgås av enhver autorisert enhet.
-
-## Aktiver filskanning i applikasjonen din.
-
-{{%notice info%}}
-For å tillate generering av hendelser for din applikasjon, må den henvise til nuget-versjon >= 7.4.0. Se hvordan du oppdaterer nuget-referanser for din applikasjon [her](/nb/app/maintainance/dependencies/).
-{{% /notice%}}
-
-Dyp skanning av filer er ikke aktivert som standard. For å aktivere dette, kreves en manuell handling. Hvis en fil skannes og blir funnet infisert før prosessen er fullført, vil dette forårsake en valideringsfeil.
-
-I filen `applicationmetadata.json` i mappen _App/config_ skal følgende legges til for hver datatype som skal skannes:
-
-```json
-"enableFileScan": true
-```
-
-Hvis du ønsker å tilpasse feilmeldingen for infiserte filer, kan du gjøre det ved å legge til en tekst med nøkkelen `DataElementFileInfected`.
-
-## Valideringsfeil ved venting på filskanning
-
-Hvis ValidationService skal utløse en valideringsfeil og forhindre fullføring av prosessen før skanningen er fullført, bør det legges til en annen verdi for datatypen.
-.
-```json
- "validationErrorOnPendingFileScan": true
-```
-Hvis du ønsker å tilpasse feilmeldingen for ventende filer, kan du gjøre det ved å legge til en tekst med nøkkelen `DataElementFileScanPending`.
-
-Eksempel på `applicationmetadata.json` med filskanning aktivert for datatypen _egenerklaring_, uten valideringsfeil for ventende skanning.
-
-```json
-{
- "id": "digdir/egenerklaring-2022",
- "org": "digdir",
- "title": {
- "nb": "egenerklaring-2022"
- },
- "dataTypes": [
- {
- "id": "ref-data-as-pdf",
- "allowedContentTypes": [
- "application/pdf"
- ],
- "maxCount": 0,
- "minCount": 0,
- "enablePdfCreation": true,
- "enableFileScan": false,
- "validationErrorOnPendingFileScan": false
- },
- {
- "id": "egenerklaring",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.egenerklaring",
- "allowAnonymousOnStateless": false,
- "autoDeleteOnProcessEnd": false
- },
- "taskId": "Task_1",
- "maxCount": 1,
- "minCount": 1,
- "enablePdfCreation": true,
- "enableFileScan": true,
- "validationErrorOnPendingFileScan": false
- }
- ],
- "partyTypesAllowed": {
- "bankruptcyEstate": false,
- "organisation": false,
- "person": false,
- "subUnit": false
- },
- "autoDeleteOnProcessEnd": false,
- "created": "2023-02-01T13:16:50.1330774Z",
- "createdBy": "altinn",
- "lastChanged": "2023-02-01T13:16:50.1330784Z",
- "lastChangedBy": "altinn"
-}
-```
diff --git a/content/app/development/configuration/messagebox/_index.en.md b/content/app/development/configuration/messagebox/_index.en.md
deleted file mode 100644
index 821a492c223..00000000000
--- a/content/app/development/configuration/messagebox/_index.en.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: MessageBox
-description: Configuring different aspects of the presentation of application instances in the Altinn Message Box.
-weight: 40
----
-
-{{}}
diff --git a/content/app/development/configuration/messagebox/_index.nb.md b/content/app/development/configuration/messagebox/_index.nb.md
deleted file mode 100644
index e68cbd6dd67..00000000000
--- a/content/app/development/configuration/messagebox/_index.nb.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Meldingsboks
-description: Konfigurasjon av presentasjon av applikasjonsinstanser i meldingsboksen i Altinn.
-weight: 40
----
-
-{{}}
diff --git a/content/app/development/configuration/messagebox/create_copy/_index.en.md b/content/app/development/configuration/messagebox/create_copy/_index.en.md
deleted file mode 100644
index 91faf3563bb..00000000000
--- a/content/app/development/configuration/messagebox/create_copy/_index.en.md
+++ /dev/null
@@ -1,69 +0,0 @@
----
-title: Create new copy
-linktitle: Create copy
-description: This page describes how to configure the create new copy functionality in an app.
-weight: 200
----
-
-## Description
-The primary purpose of the create new copy feature is to make it easy for a user of the portal to start a new submission by copying a previously completed submission. The user just need to navigate to the instance they would like to copy and then click on the link Create new copy". The App will then create a new instance and open it in the browser ready for form filling with fields already filled in with data from the original.
-
-{{%notice info%}}
-The Create new copy functionality was introduced in version 7.9.0 of the nuget packages.
-[See how to update the nuget references of your application here](/app/maintainance/dependencies/).
-{{% /notice%}}
-
-## Configuration
-
-{{% notice info %}}
-The configuration has a retroactive effect and will also apply to previously created instances.
-{{% /notice %}}
-
-In addition to turning the functionality on and off, it is possible to exclude data types and data fields in a schema from being copied.
-
-| Name | Description |
-| ------------------ | -------------------------------------------------------------------------------- |
-| enabled | true/false if its possible to create a copy of an instance. |
-| excludedDataTypes | List of DataTypes that should be excluded when a new copy is made. |
-| excludedDataFields | List of fields in the DataModel that should be excluded when a new copy is made. |
-
-### Exclusion of data types
-
-It is possible to provide a list of data types you don't want to be copied over to the new instance, but which data types that can be copied are already fairly limited. The list of excluded data types have therefor limited effect. The copy feature will only copy data elements related to a schema/form. This means that no attachments will be copied. I addition to this the data types being copied needs to be associated with the first step in the process for the app.
-
-### Exclusion of data fields
-
-The list of excluded fields can be used to indicate which fields you don't want to be copied over to the new data element. The purpose of this feature is to empty fields you know will need to vary from one submission to the next. This could be a field that indicate which quarter of the year the submission is relevant for. Here the app developer will need to consider the different fields, the usage of the app and what would be the best for the user. The selected fields should be indicated with dot-notation in the same way as when doing data binding in layout files.
-
-## Examples
-
-Configuration for turning the *Create new copy* feature on and off.
-
-{{< code-title >}}
-applicationmetadata.json
-{{< /code-title >}}
-
-```json
-"copyInstanceSettings": {
- "enabled": true
-}
-```
-
-Configuration where the Create new copy is activated and where two fields in two separate groups within the model is being excluded.
-
-{{< code-title >}}
-applicationmetadata.json
-{{< /code-title >}}
-
-```json
-"copyInstanceSettings": {
- "enabled": true,
- "excludedDataFields": [
- "group1.felt2",
- "group23.felt21"
- ]
-}
-```
-## Programing interface
-
-During the copying of an instance the logic will perform a method call to **IInstantiationProcessor.DataCreation**. This makes it possible to perform programmatic changes to the data as it is being copied. [Programmatic prefill](/app/development/data/prefill/custom/).
diff --git a/content/app/development/configuration/messagebox/create_copy/_index.nb.md b/content/app/development/configuration/messagebox/create_copy/_index.nb.md
deleted file mode 100644
index ae51d1c5867..00000000000
--- a/content/app/development/configuration/messagebox/create_copy/_index.nb.md
+++ /dev/null
@@ -1,71 +0,0 @@
----
-title: Lag ny kopi
-linktitle: Lag kopi
-description: Denne siden beskriver hvordan man konfigurerer lag ny kopi funksjonaliteten i en app.
-weight: 200
----
-
-## Beskrivelse
-Hovedhensikten med **Lag ny kopi** funksjonaliteten er at det skal være enkelt for en bruker av portalen å starte på en ny innsending ved å kopiere en tidligere fullført innsending. Brukeren skal bare måtte navigere seg frem til instansen vedkommende ønsker å kopiere for så å klikke på linken Lag ny Kopi. Appen vil lage en kopi og åpne den i nettleseren klar for utfylling med felter ferdig utfylt med data fra orginalen.
-
-{{%notice info%}}
-Lag ny kopi funksjonaliteten ble introdusert i versjon 7.9.0 av nuget pakkene.
-[Se hvordan du oppdaterer nugetreferanser for applikasjonen din her](/nb/app/maintainance/dependencies/).
-{{% /notice%}}
-
-## Konfigurasjon
-
-{{% notice info %}}
-Konfigurasjonen har tilbakevirkende kraft på tidligere arkiverte instanser.
-{{% /notice %}}
-
-I tillegg til at funksjonaliteten kan skrues av og på er det mulig å ekskludere data typer og data felter i et skjema fra å bli kopiert.
-
-| Navn | Beskrivelse |
-| ------------------ | ---------------------------------------------------------------------------------------------------- |
-| enabled | true/false for å indikere om funksjonaliteten er skrudd på eller ikke. Standard verdi er av(false). |
-| excludedDataTypes | Liste med navn på data typer som ikke skal kopieres over. |
-| excludedDataFields | Liste med navn på felter som ikke skal opieres over. |
-
-### Ekskludering av data typer
-
-Det er mulig å angi en liste over data typer man ikke ønsker at skal kopieres over i ny instans, men hva man kan kopiere av data typer er allerede meget begrenset. Listen med ekskluderte data typer har derfor begrenset funksjon i dagens løsning. Kopierings funksjonaliteten vil bare kopiere data elementer relatert til et skjema. Dette betyr at det ikke blir laget kopier av vedlegg. I tillegg må data typene være knyttet til første steg i prosessen til appen.
-
-### Ekskludering av felter
-
-I listen med ekskluderte felter kan man angi navnene på felter man ikke ønsker å kopiere over i ny instans. Hensikten med denne funksjonaliteten er å få tømt data i felter man vet må variere fra en innsending til en annen. Det kan for eksempel være et felt som indikerer hvilke kvartal i året den nye innsendingen skal gjelde for. Her må apputvikler vurdere behovene og hva slags type bruk som blir mest vanlig. Felter angis ved hjelp av dot-notasjon på samme måte som man gjør ved data binding i layout filer.
-
-## Eksempler
-
-Konfigurasjon for å skru på *Lag ny kopi* uten ekskluderinger. Disse endringene gjøres i applicationmetadata.json.
-
-{{< code-title >}}
-applicationmetadata.json
-{{< /code-title >}}
-
-```json
-"copyInstanceSettings": {
- "enabled": true
-}
-```
-
-Konfigurasjon hvor Lag ny kopi blir aktivert samtidig som det legges til ekskludering av to ulike felter fra to modeller i skjema.
-
-{{< code-title >}}
-applicationmetadata.json
-{{< /code-title >}}
-
-
-```json
-"copyInstanceSettings": {
- "enabled": true,
- "excludedDataFields": [
- "group1.felt2",
- "group23.felt21"
- ]
-}
-```
-
-## Programatiske endringer
-
-Under kopiering av skjema vil logikken utføre metode kall mot **IInstantiationProcessor.DataCreation**. Dette skal gjøre det mulig å gjøre programatiske endringer i data som blir kopiert. [Programatisk prefill](/nb/app/development/data/prefill/custom/).
diff --git a/content/app/development/configuration/messagebox/hide_instances/_index.en.md b/content/app/development/configuration/messagebox/hide_instances/_index.en.md
deleted file mode 100644
index b5fda8df29f..00000000000
--- a/content/app/development/configuration/messagebox/hide_instances/_index.en.md
+++ /dev/null
@@ -1,50 +0,0 @@
-
----
-title: Hide instances
-linktitle: Hide instances
-description: Configuration for hiding instances from the message box.
-weight: 200
----
-
-For applications with a complex process flow it can be useful to hide
-instances from the message box during parts of, or the whole, process.
-
-## Configuration
-
-{{% notice info %}}
-The configuration has a retroactive effect and will also apply to previously created instances.
-{{% /notice %}}
-
-Configuration for hiding instances is defined in `applicationmetadata.json`,
-which you can find in ythe application repository in the folder `App/config`.
-
-Add a new section called `messageBoxConfiguration` with the child property `hideSettings`.
-
-HideSettings can consist of one of two properties
-
- Name | Description
---------------|------------
-hideOnTask | A list of tasks where the instance should be hidden from the messagebox.
-hideAlways | A boolean indicating that the instance should always be hidden.
-
-## Examples
-
-The configuration for an application where instances should be hidden on `Task_1` and `Task_3`, but be visible for all other process tasks.
-
-```json
-"messageBoxConfig": {
- "hideSettings": {
- "hideOnTask":["Task_1", "Task_3"]
- }
-}
-```
-
-The configuration for an application that should never be shown in the message box:
-
-```json
-"messageBoxConfig": {
- "hideSettings": {
- "hideAlways":true
- }
-}
-```
\ No newline at end of file
diff --git a/content/app/development/configuration/messagebox/hide_instances/_index.nb.md b/content/app/development/configuration/messagebox/hide_instances/_index.nb.md
deleted file mode 100644
index 99c4a5a998f..00000000000
--- a/content/app/development/configuration/messagebox/hide_instances/_index.nb.md
+++ /dev/null
@@ -1,49 +0,0 @@
----
-title: Skjule instanser
-linktitle: Skjule instanser
-description: Konfiurasjon for å skjule instanser fra meldingsboksen.
-weight: 200
----
-
-For applikasjoner med en kompleks appflyt kan det være nyttig å skjule instanser
-fra meldingsboksen under deler av prosessen eller for hele prosessen.
-
-
-## Konfigurasjon
-
-{{% notice info %}}
-Konfigurasjonen har tilbakevirkende kraft på tidligere opprettede instanser.
-{{% /notice %}}
-
-Konfigurasjon av skjuling fra meldingsboks gjøres i `applicationmetadata.json` som ligger i repoet under mappen `App/config`.
-
-Legg til en ny seksjon med navn `messageBoxConfiguration` med følgende underfeltet `hideSettings`.
-
-HideSettings kan igjen bestå av én av to properties
-
- Navn | Beskrivelse
---------------|------------
-hideOnTask | En liste med tasker der instanser skal skjules fra meldingsboksen.
-hideAlways | En boolean som indikerer om instansen alltid skal skjules fra meldingsboksen.
-
-## Eksempler
-
-Konfigurasjonen til en app der instanser skal skjules på `Task_1` og `Task_3`, men være synlig på alle andre prosess-steg:
-
-```json
-"messageBoxConfig": {
- "hideSettings": {
- "hideOnTask":["Task_1", "Task_3"]
- }
-}
-```
-
-Konfigurasjonen til en app der instanser aldri skal vises i meldingsboksen.
-
-```json
-"messageBoxConfig": {
- "hideSettings": {
- "hideAlways":true
- }
-}
-```
\ No newline at end of file
diff --git a/content/app/development/configuration/messagebox/presentationfields/_index.en.md b/content/app/development/configuration/messagebox/presentationfields/_index.en.md
deleted file mode 100644
index 6b40a3d9fb5..00000000000
--- a/content/app/development/configuration/messagebox/presentationfields/_index.en.md
+++ /dev/null
@@ -1,49 +0,0 @@
----
-title: Presentation fields
-linktitle: Presentation fields
-description: Configuration of presentation fields for app.
-weight: 200
----
-
-In some cases it can be useful with presentation fields to easier
-differentiate instances of a single application.
-
-By configuring presentation fields on an application,
-these values are extracted from the form data and included in the instance object.
-The data values are appended to the application title when the instance is displayed in the message box.
-
-
-## Configuration
-Configuration of presentation fields is defined in `applicationmetadata.json`,
-which you can find in ythe application repository in the folder `App/config`.
-
-Add a new section named `presentationField` that consists of the properties below.
-
- Name | Description
-----------|------------
-id | Id for the presentation field. used to identify the presentation text when it is stored on the instance object.
-path | Datamodel path to the presentation field. This value is the same that is bound to a component in the layout file of the app.
-dataTypeId| Id of the data type of the data model to retrieve the value from.
-
-The complete presentation fields configuration in an application might look like this:
-
-```json
-"presentationFields": [
- {
- "id": "Ansettelse",
- "path": "OpplysningerOmArbeidstakeren-grp-8819.Arbeidsforhold-grp-8856.AnsattAar-datadef-33267.value",
- "dataTypeId": "default"
- },
- {
- "id": "Navn",
- "path": "OpplysningerOmArbeidstakeren-grp-8819.OpplysningerOmArbeidstakeren-grp-8855.AnsattNavn-datadef-1223.value",
- "dataTypeId": "default"
- }
-]
-```
-
-## Result
-
-The result in the message box will be the title of the application followed by the presentation texts in a comma separated list.
-
-![Instances with presentation fields in the message box](presentationtexts-msgbox.png "Instances with presentation fields in the message box")
\ No newline at end of file
diff --git a/content/app/development/configuration/messagebox/presentationfields/_index.nb.md b/content/app/development/configuration/messagebox/presentationfields/_index.nb.md
deleted file mode 100644
index d9c54d6a80d..00000000000
--- a/content/app/development/configuration/messagebox/presentationfields/_index.nb.md
+++ /dev/null
@@ -1,48 +0,0 @@
----
-title: Presentasjonsfelter
-linktitle: Presentasjonsfelter
-description: Konfigurasjon av presentasjonsfelter for app.
-weight: 200
----
-
-I noen tilfeller kan det være nyttig med presentasjonsfelter for å enklere kunne
-skille mellom flere instanser av samme applikasjon.
-
-Ved å konfigurere presentasjonsfelter på en applikasjon vil man hente ut
-verdier fra skjemadataene og legge dette på instansobjektet.
-Disse verdiene benyttes i meldingsboksen i Altinn til å berike tittelen til instansen med dataverdiene.
-
-## Konfigurasjon
-
-Konfigurasjon av presentasjonsfelter gjøres i `applicationmetadata.json` som ligger i repoet under mappen `App/config`.
-
-Legg til en ny seksjon med navn `presentationField` med følgende underfelter:
-
- Navn | Beskrivelse
-----------|------------
-id | Id på presentasjonsfeltet. Benyttes til å identifisere presentasjonsteksten når den er lagret på instansen.
-path | Datamodell path til presentasjonsfeltet. Denne verdien er den samme som bindes til en komponent i layoutfilen til appen.
-dataTypeId| Id på datamodellen som verdien skal hentes fra.
-
-Konfigurasjonen til en app med to definerte presentasjonsfelter vil se slik ut:
-
-```json
-"presentationFields": [
- {
- "id": "Ansettelse",
- "path": "OpplysningerOmArbeidstakeren-grp-8819.Arbeidsforhold-grp-8856.AnsattAar-datadef-33267.value",
- "dataTypeId": "default"
- },
- {
- "id": "Navn",
- "path": "OpplysningerOmArbeidstakeren-grp-8819.OpplysningerOmArbeidstakeren-grp-8855.AnsattNavn-datadef-1223.value",
- "dataTypeId": "default"
- }
-]
-```
-
-## Resultat
-
-Resultatet i meldingsboksen vil være tittel på applikasjonen med påfølgende presentasjonstekster i en kommaseparert liste.
-
-![Instanser med presentasjonsfelter i meldingsboks](presentationtexts-msgbox.png "Instanser med presentasjonsfelter i meldingsboks")
\ No newline at end of file
diff --git a/content/app/development/configuration/messagebox/presentationfields/presentationtexts-msgbox.png b/content/app/development/configuration/messagebox/presentationfields/presentationtexts-msgbox.png
deleted file mode 100644
index 463eb3eba77..00000000000
Binary files a/content/app/development/configuration/messagebox/presentationfields/presentationtexts-msgbox.png and /dev/null differ
diff --git a/content/app/development/configuration/partytype/_index.en.md b/content/app/development/configuration/partytype/_index.en.md
deleted file mode 100644
index 1779144376a..00000000000
--- a/content/app/development/configuration/partytype/_index.en.md
+++ /dev/null
@@ -1,29 +0,0 @@
----
-title: Party types
-description: How to ensure that only specific types of party types can use an app.
-toc: true
-weight: 150
----
-
-## Limit access using Altinn Studio designer
-
-You can limit which actors have access to an app by using the Altinn Studio Designer. Role access options are placed in the "Lage" category in the top menu, on the page "Tilgangsstyring", represented by the keyhole on the leftmost side menu.
-On this page you can mark the actor types the app should be accessible for. If none (or all) actor types are marked, everyone will have access. The option "Virksomhet" is used in cases where a report is filed on behalf of a company or other organization.
-
-The screenshot below shows the settings for full access to the application for all organization numbers (both main entity and sub entities).
-
-![GUI for controlling access between actor types](partytypeselector.png "GUI for controlling access between actor types")
-
-## Limit access by editing applicationmetadata.json
-
-If you prefer working with code, you can find the option to adjust access between actor types in `applicationmetadata.json`, which is located in the folder `App/config` in the app repository.
-The example below displays that same settings as the screenshot.
-
-```json
- "partyTypesAllowed": {
- "bankruptcyEstate": false,
- "organisation": true,
- "person": false,
- "subUnit": true
- },
-```
diff --git a/content/app/development/configuration/partytype/_index.nb.md b/content/app/development/configuration/partytype/_index.nb.md
deleted file mode 100644
index 28bcd93d052..00000000000
--- a/content/app/development/configuration/partytype/_index.nb.md
+++ /dev/null
@@ -1,29 +0,0 @@
----
-title: Aktørtyper
-description: Hvordan sørge for at kun bestemte typer aktører kan bruke en app.
-toc: true
-weight: 150
----
-
-## Avgrense tilgang i Altinn Studio designer
-
-I Altinn Studio designer finner du mulighet for å styre hvilke aktørtyper som har tilgang til en app i kategorien "Lage" i toppmenyen, på siden "Tilgangsstyring" representert ved låshull-ikonet.
-På denne siden krysser du av for de aktørtypene en app er tilgjengelig for. Hvis ingen (eller alle) aktørtyper er valgt, vil alle ha tilgang. Valget "Virksomhet" benyttes for tilfeller der det skal rapporteres på hovedenhet.
-
-Skjermdumpen under viser innstillingene for at alle organisasjonsnummer (både hovedenheter og underenheter) skal kunne bruke appen.
-
-![GUI for å styre tilgang på aktørtyper](partytypeselector.png "GUI for å styre tilgang på aktørtyper")
-
-## Justere i applicationmetadata.json
-
-Hvis du foretrekker å jobbe i kode, finner du muligheten til å justere hvilke aktørtyper som kan benytte en app i `applicationmetadata.json` som ligger i mappa `App/config` i app-repositoryet.
-Eksempelet under viser samme innstillinger som skjermdumpen.
-
-```json
- "partyTypesAllowed": {
- "bankruptcyEstate": false,
- "organisation": true,
- "person": false,
- "subUnit": true
- },
-```
diff --git a/content/app/development/configuration/partytype/partytypeselector.png b/content/app/development/configuration/partytype/partytypeselector.png
deleted file mode 100644
index d7eb8578b97..00000000000
Binary files a/content/app/development/configuration/partytype/partytypeselector.png and /dev/null differ
diff --git a/content/app/development/configuration/process/Data_Confirmation_Process.bpmn b/content/app/development/configuration/process/Data_Confirmation_Process.bpmn
deleted file mode 100644
index 336b7649a63..00000000000
--- a/content/app/development/configuration/process/Data_Confirmation_Process.bpmn
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
- SequenceFlow_1
-
-
- SequenceFlow_1
- SequenceFlow_2
-
-
- data
-
-
-
-
-
- SequenceFlow_2
- SequenceFlow_3
-
- confirmation
-
- confirm
-
-
-
-
- SequenceFlow_3
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/content/app/development/configuration/process/Data_Data_Data_Process.bpmn b/content/app/development/configuration/process/Data_Data_Data_Process.bpmn
deleted file mode 100644
index 7e7dedb61dd..00000000000
--- a/content/app/development/configuration/process/Data_Data_Data_Process.bpmn
+++ /dev/null
@@ -1,86 +0,0 @@
-
-
-
-
- SequenceFlow_1
-
-
- SequenceFlow_1
- SequenceFlow_2
-
-
- data
-
-
-
-
- SequenceFlow_2
- SequenceFlow_3
-
-
- data
-
-
-
-
- SequenceFlow_3
- SequenceFlow_4
-
-
- data
-
-
-
-
- SequenceFlow_4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/content/app/development/configuration/process/Data_Process.bpmn b/content/app/development/configuration/process/Data_Process.bpmn
deleted file mode 100644
index 630ffd20565..00000000000
--- a/content/app/development/configuration/process/Data_Process.bpmn
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
- SequenceFlow_1
-
-
- SequenceFlow_1
- SequenceFlow_2
-
-
- data
-
-
-
-
- SequenceFlow_2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/content/app/development/configuration/process/_index.en.md b/content/app/development/configuration/process/_index.en.md
deleted file mode 100644
index 998d80b0c0c..00000000000
--- a/content/app/development/configuration/process/_index.en.md
+++ /dev/null
@@ -1,38 +0,0 @@
----
-title: Define application process
-linktitle: Process
-description: How to define the process of an app.
-weight: 200
----
-
-An application has defined a process that controls the flow.
-The process is defined as [BPMN 2.0](https://en.wikipedia.org/wiki/Business_Process_Model_and_Notation).
-
-## Supported Process Task Types
-
-The current application template supports the following tasks:
-
-- Data (Corresponds to fill-in steps in Altinn II)
-- Confirmation
-- Feedback
-
-## Future process steps (tentative)
-
-- Signing
-- Payment
-- Parallel signing
-- User-controlled signing
-- External validation
-
-## Change the process
-
-To change the process, you can manually edit the BPMN file with an text, XML or BPMN editor.
-It is stored in the app repo as `App/config/process/process.bpmn`.
-
-## Example Process Files
-
-* [Data_Confirmation_Process.bpmn](Data_Confirmation_Process.bpmn)
-* [Data_Data_Data_Process.bpmn](Data_Data_Data_Process.bpmn)
-* [Data_Process.bpmn](Data_Process.bpmn)
-
-{{}}
\ No newline at end of file
diff --git a/content/app/development/configuration/process/_index.nb.md b/content/app/development/configuration/process/_index.nb.md
deleted file mode 100644
index 0e24cb77fd9..00000000000
--- a/content/app/development/configuration/process/_index.nb.md
+++ /dev/null
@@ -1,38 +0,0 @@
----
-title: Definere applikasjonsprosess
-linktitle: Prosess
-description: Hvordan definere prosessen til en app.
-weight: 200
----
-
-En applikasjon har definert en prosess som styrer flyten.
-Prosessen er definert som [BPMN 2.0](https://en.wikipedia.org/wiki/Business_Process_Model_and_Notation).
-
-## Støttede prosess-task-typer
-
-Nåværende applikasjonsmal støtter følgende tasks.
-
-- Data (Data) (Tilsvarer utfyllingssteg i Altinn II)
-- Bekreftelse (Confirmation)
-- Feedback
-
-## Fremtidige prosess-tasker (tentativ)
-
-- Signering (Signing)
-- Betaling (Payment)
-- Parallellsignering (Paralell Signing)
-- Brukerstyrt signering (User Controlled Signing)
-- Ekstern validering (External Validation)
-
-## Endre prosessen
-
-For å endre på prosessen kan du manuelt redigere BPMN-filen med en valgfri XML- eller BPMN-editor.
-Den ligger lagret i app-repoet som `App/config/process/process.bpmn`.
-
-## Eksempler på process-filer
-
-* [Data_Confirmation_Process.bpmn](Data_Confirmation_Process.bpmn)
-* [Data_Data_Data_Process.bpmn](Data_Data_Data_Process.bpmn)
-* [Data_Process.bpmn](Data_Process.bpmn)
-
-{{}}
\ No newline at end of file
diff --git a/content/app/development/configuration/process/auto-delete/_index.en.md b/content/app/development/configuration/process/auto-delete/_index.en.md
deleted file mode 100644
index 517a8c34137..00000000000
--- a/content/app/development/configuration/process/auto-delete/_index.en.md
+++ /dev/null
@@ -1,123 +0,0 @@
----
-title: Automatic deletion
-linktitle: Automatic deletion
-description: An application can be configured to delete all traces of it when the process is over.
-toc: true
----
-
-If you want to limit the end user's access to an instance or data after submitting it can be done by configuring
-automatic deletion.
-Practically the resource will be made inaccessible to the user after submission,
-while the service owner still has access according to the application's authorisation rules.
-
-If the end user attempts to access a hard deleted resource with a direct link they will receive `404 - Not found` in
-response.
-The resource will also not be visible in the message box or be listed in any API-responses.
-
-When the service owner confirms that the instance has been received on their end (complete confirmed),
-the instance is marked as ready for deletion and will be removed from the Altinn database in 7 days.
-
-The configuration for automatic deletion is done in `applicationmetadata.json` with the
-flag `"autoDeleteOnProcessEnd": true`.
-
-## Automatic deletion of instances
-Example of configuration in `applicationmetadata.json` for instances:
-
-```json {linenos=false,hl_lines=[48]}
-{
- "id": "ttd/apps-test-prod",
- "org": "ttd",
- "title": {
- "nb": "apps-test-prod"
- },
- "dataTypes": [
- {
- "id": "default",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.Skjema"
- },
- "taskId": "Task_1",
- "maxCount": 1,
- "minCount": 1
- },
- {
- "id": "ref-data-as-pdf",
- "allowedContentTypes": [
- "application/pdf"
- ],
- "maxCount": 0,
- "minCount": 0
- },
- {
- "id": "6aa7d237-f20f-4d42-9361-0c84cf1a8ed0",
- "allowedContentTypes": [],
- "taskId": "Task_1",
- "maxSize": 1,
- "maxCount": 3,
- "minCount": 1
- }
- ],
- "partyTypesAllowed": {
- "bankruptcyEstate": false,
- "organisation": false,
- "person": false,
- "subUnit": false
- },
- "created": "2020-06-04T12:11:36.9601284Z",
- "createdBy": "someone",
- "lastChanged": "2020-06-04T12:11:36.9601305Z",
- "lastChangedBy": "someone",
- "autoDeleteOnProcessEnd": true
-}
-```
-
-## Automatic deletion of data
-
-Example of configuration in `applicationmetadata.json` for data type:
-
-Here the data types _Skjema_ and _vedleggA_ are deleted, while the type _ref-data-as-pdf_ stays after the process has been ended.
-
-```json {linenos=false,hl_lines=[11, 35]}
-"dataTypes":[
- {
- "id": "Skjema",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.skjema",
- "allowAnonymousOnStateless": false,
- "autoDeleteOnProcessEnd": true
- },
- "taskId": "Task_1",
- "maxCount": 1,
- "minCount": 1,
- "enablePdfCreation": true
- },
- {
- "id": "ref-data-as-pdf",
- "allowedContentTypes": [
- "application/pdf"
- ],
- "maxCount": 0,
- "minCount": 0,
- "enablePdfCreation": true
- },
- {
- "id": "vedleggA",
- "taskId": "Task_1",
- "maxSize": 25,
- "maxCount": 1,
- "minCount": 1,
- "enablePdfCreation": true,
- "appLogic": {
- "autoDeleteOnProcessEnd": true
- }
- }
-]
-```
diff --git a/content/app/development/configuration/process/auto-delete/_index.nb.md b/content/app/development/configuration/process/auto-delete/_index.nb.md
deleted file mode 100644
index db934ae0968..00000000000
--- a/content/app/development/configuration/process/auto-delete/_index.nb.md
+++ /dev/null
@@ -1,125 +0,0 @@
----
-title: Automatisk sletting
-linktitle: Automatisk sletting
-description: En applikasjon kan konfigureres til å slette alle spor når prosessen er slutt.
-toc: true
----
-
-Dersom man ønsker å begrense sluttbrukers tilgang til en instans eller data i etterkant av innsending kan dette gjøres
-ved å konfigurere automatisk sletting.
-I praksis vil ressursen gjøres utilgjengelig for sluttbruker etter innsending,
-mens tjenesteeier enda har tilgang i tråd med applikasjonens autorisasjonsregler.
-
-
-Hvis sluttbruker forsøker å aksessere en hard deleted ressurs med en direkte lenke vil de få `404 - Not found` i respons.
-Ressursen vil heller ikke vises i meldingsboks eller listes i API-responser.
-
-
-Når tjenesteeier bekrefter at instansen er mottatt på deres side (complete confirmed),
-så markeres instansen som klar for sletting og vil saneres fra Altinns database i løpet av 7 dager.
-
-Konfigurasjonen for automatisk sletting gjøres i `applicationmetadata.json` med flagget
-`"autoDeleteOnProcessEnd": true`.
-
-
-
-## Automatisk sletting av instans
-
-Eksempel på konfigurasjon i `applicationmetadata.json` for instanser:
-
-```json {linenos=false,hl_lines=[48]}
-{
- "id": "ttd/apps-test-prod",
- "org": "ttd",
- "title": {
- "nb": "apps-test-prod"
- },
- "dataTypes": [
- {
- "id": "default",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.Skjema"
- },
- "taskId": "Task_1",
- "maxCount": 1,
- "minCount": 1
- },
- {
- "id": "ref-data-as-pdf",
- "allowedContentTypes": [
- "application/pdf"
- ],
- "maxCount": 0,
- "minCount": 0
- },
- {
- "id": "6aa7d237-f20f-4d42-9361-0c84cf1a8ed0",
- "allowedContentTypes": [],
- "taskId": "Task_1",
- "maxSize": 1,
- "maxCount": 3,
- "minCount": 1
- }
- ],
- "partyTypesAllowed": {
- "bankruptcyEstate": false,
- "organisation": false,
- "person": false,
- "subUnit": false
- },
- "created": "2020-06-04T12:11:36.9601284Z",
- "createdBy": "someone",
- "lastChanged": "2020-06-04T12:11:36.9601305Z",
- "lastChangedBy": "someone",
- "autoDeleteOnProcessEnd": true
-}
-```
-
-## Automatisk sletting av data
-
-Eksempel på konfigurasjon i `applicationmetadata.json` for data type:
-
-```json {linenos=false,hl_lines=[11, 35]}
-"dataTypes":[
- {
- "id": "Skjema",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.skjema",
- "allowAnonymousOnStateless": false,
- "autoDeleteOnProcessEnd": true
- },
- "taskId": "Task_1",
- "maxCount": 1,
- "minCount": 1,
- "enablePdfCreation": true
- },
- {
- "id": "ref-data-as-pdf",
- "allowedContentTypes": [
- "application/pdf"
- ],
- "maxCount": 0,
- "minCount": 0,
- "enablePdfCreation": true
- },
- {
- "id": "vedleggA",
- "taskId": "Task_1",
- "maxSize": 25,
- "maxCount": 1,
- "minCount": 1,
- "enablePdfCreation": true,
- "appLogic": {
- "autoDeleteOnProcessEnd": true
- }
- }
-]
-```
\ No newline at end of file
diff --git a/content/app/development/configuration/process/customize/_index.en.md b/content/app/development/configuration/process/customize/_index.en.md
deleted file mode 100644
index 74c70b71ac5..00000000000
--- a/content/app/development/configuration/process/customize/_index.en.md
+++ /dev/null
@@ -1,439 +0,0 @@
----
-title: Customize Views of Step
-linktitle: Customize Views
-description: How to customize views in different steps of a process.
-tags: []
-toc: true
----
-
-An application wil have a process which the user of the application follows.
-Depending of the type of step the user is in, different views are presented.
-This page explains the different views and how they can be customized.
-
-## Data
-
-In this process task a form which the user can fill in data.
-The form can be edited using the [UI editor](/app/getting-started) or by changing `FormLayout.json` manually.
-
-## Confirmation
-
-In this process task some standard texts are presented and the user can choose to _confirm_ to go forward.
-
-These texts can be overridden by manually adding each defined text keys in the apps text resources. More information about how this is done can be found [here](../../../ux/texts).
-In the following section we will present an overview of the different texts that can be customized.
-
-![Confirm view](confirm-step.png "Texts that can be customized in the confirm view")
-
-### Customize texts
-
-| Text # (see image above) | Text key |
-| ------------------------ | ------------------- |
-| 1 | confirm.title |
-| 2 | confirm.sender |
-| 3 | confirm.body |
-| 4 | confirm.answers |
-| 5 | confirm.attachments |
-| 6 | confirm.button_text |
-
-Example of custom texts in the file `resources.nb.json`:
-
-```json
-{
- "id": "confirm.title",
- "value": "Vennligst bekreft at du ønsker å sende inn"
-},
-{
- "id": "confirm.body",
- "value": "Du må kun trykke send inn om du er helt sikker på at du vil sende inn.
I det du trykker send inn kan du ikke gjøre endringer."
-},
-{
- "id": "confirm.attachments",
- "value": "Dokumenter med opplysninger"
-},
-{
- "id": "confirm.button_text",
- "value": "Lagre og fortsett"
-}
-```
-
-Note that in the example we have used the html-tag `
` to make a line shift.
-For links and formatting [use markdown](../../../ux/texts#formatting-of-texts).
-
-This results in the following view:
-
-![Confirm view](confirm-step-custom.png "Overridden texts in the confirm view")
-
-### Custom form layout
-
-For the confirm task the app developer has the possibility for configuring their
-own [layout set](../../../ux/pages/layout-sets/) with corresponding form layout definitions and other ui-configuration
-files which are included in the data step.
-
-This makes the confirmation page customizable, and can use the components that are supported in Altinn Studio.
-
-Since the confirm step is not meant to be used for writing data, a good practice would be to use static components (
-header, paragraph) and set other components to `readOnly`.
-
-An example setup of the `layout-sets.json` where `Task_1` is a data step, and `Task_2` a confirmation step:
-
-```json
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout-sets.schema.v1.json",
- "sets": [
- {
- "id": "simple",
- "dataType": "simple",
- "tasks": ["Task_1"]
- },
- {
- "id": "custom-confirmation",
- "dataType": "simple",
- "tasks": ["Task_2"]
- }
- ]
-}
-```
-
-Notice that the layout-set configuration for `Task_2` references the data model used in `Task_1`.
-
-Example `formLayout.json` file that presents data from the data model used in the `data`-task:
-
-```json
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- "data": {
- "layout": [
- {
- "id": "paragraph",
- "type": "Paragraph",
- "textResourceBindings": {
- "title": "paragraph"
- }
- },
- {
- "id": "name",
- "type": "Input",
- "textResourceBindings": {
- "title": "name.label"
- },
- "dataModelBindings": {
- "simpleBinding": "Felt1"
- },
- "required": true,
- "readOnly": true
- },
- {
- "id": "lastname",
- "type": "Input",
- "textResourceBindings": {
- "title": "lastName.label"
- },
- "dataModelBindings": {
- "simpleBinding": "Felt2"
- },
- "required": true,
- "readOnly": true
- }
- ]
- }
-}
-```
-
-The app structure would look look this:
-
-```txt
-├───App
-│ ├───config
-│ ├───logic
-│ ├───models
-| | ...
-│ ├───ui
-│ │ ├───custom-confirmation
-│ │ │ └───layouts
-| | | └─── ...
-│ │ └───simple
-│ │ └───layouts
-| | | └─── ...
-
-```
-
-The end result:
-
-![Custom confirm view](custom_confirm_en.png "Custom confirm view")
-
-For a complete setup of this feature see our [example app.](https://altinn.studio/repos/ttd/custom-view-confirm)
-
-## Feedback
-
-This is a process step where the application owner can validate the filled data to generate a feedback before the data is archived.
-
-In the following section we will present an overview of the different texts that can be customized.
-
-![Feedback view](feedback-default.png "Texts that can be customized in the feedback view")
-
-### Customize texts
-
-| Text # (see image above) | Text key |
-| ------------------------ | -------------- |
-| 1 | feedback.title |
-| 2 | feedback.body |
-
-Example of custom texts in the file `resources.nb.json`:
-
-```json
-{
- "id": "feedback.title",
- "value": "Vent på at tjenesteeier sjekker data"
-},
-{
- "id": "feedback.body",
- "value": "Når tjenesteier har sjekket at alle data er godkjent vil du bli automatisk sendt videre til siste steg i prosessen."
-}
-```
-
-## Receipt
-
-In this process task the process will be ended and some standard texts are shown.
-
-These texts can be overridden by manually adding each defined text key in the app's text resources. More information about how this is done can be found [here](../../../ux/texts).
-
-If the actual recipient of the form is a different organization than the organization owning the app, the receipt should reflect this in the `Receiver` field. This can be done by setting the text resource `appReceiver` to the name of the actual recipient.
-
-### Customize texts
-
-![Receipt view](receipt-step.png "Texts that can be customized in the receipt view")
-
-| Text # (see image above) | Text key |
-| ------------------------ | ----------------------- |
-| 1 | receipt.receipt |
-| 2 | receipt.title |
-| 3 | receipt.subtitle |
-| 4 | receipt.body |
-| 5 | receipt.title_submitted |
-
-Example of custom texts in the file `resources.nb.json`:
-
-```json
-{
- "id": "receipt.receipt",
- "value": "Søknad om flytting til Sogndal kommune"
-},
-{
- "id": "receipt.title",
- "value": "Takk, søknaden er sendt!"
-},
-{
- "id": "receipt.subtitle",
- "value": "Finn kopi av dine svar i Altinn Innboks"
-},
-{
- "id": "receipt.body",
- "value": "Saksbehandling av denne type søknader tar vanligvis opp til 4 uker. Du vil bli varslet når svaret er klart i din innboks."
-},
-{
- "id": "receipt.title_submitted",
- "value": "Last ned PDF med dine svar:"
-}
-```
-
-Note that if you change the value of the text key `receipt.subtitle` the url will still point to Altinn Inbox.
-
-This results in the following view:
-
-![Receipt view](receipt-step-custom.png "Overridden texts in the receipt view")
-
-### Custom form layout
-
-A custom receipt view can now be created in the same way as all other form pages. The functionality will also
-soon be available in Altinn Studio.
-
-To create a custom receipt view, you create a new layout set. This layout set works exactly like
-all other page types. Within the layout set, you can create a layouts folder and here define all the pages you want to
-include in the receipt view (Yes, the receipt view supports multiple pages!). Inside the layout set, you must also create
-a `Settings.json`, where you can define the order of the pages in the receipt view.
-
-For the app to understand that this layout set should be used as a receipt view, you must refer to the name of the layout set
-in `layout-sets.json`. Add a new layout set with `id` that refers to the name of your layout set, and add
-the key value `"CustomReceipt"` in the `tasks` array of the layout set. In addition, you can specify which data model
-should be available in the receipt view by adding the key `dataType` with the name of the data model you want to support.
-
-Here is a complete example where we have a layout set named custom-receipt that will be used as a receipt view:
-
-{{}}
-{{}}
-
-```
-|- App/
- |- ui/
- |- layout-sets.json
- |- custom-receipt/
- |- layouts/
- |- page1.json
- |- page2.json
- |- Settings.json
-```
-
-{{}}
-{{}}
-
-{{}}
-{{}}
-
-{{}}
-App/ui/layout-sets.json
-{{}}
-
-```json {hl_lines=[4,6]}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout-sets.schema.v1.json",
- "sets": [
- {
- "id": "custom-receipt",
- "dataType": "fields",
- "tasks": ["CustomReceipt"]
- }
- ]
-}
-```
-
-{{}}
-{{}}
-
-{{}}
-{{}}
-
-{{}}
-App/ui/custom-receipt/Settings.json
-{{}}
-
-```json
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layoutSettings.schema.v1.json",
- "pages": {
- "order": ["page1", "page2"]
- }
-}
-```
-
-{{}}
-{{}}
-
-Example of a custom layout for the receipt:
-
-{{}}
-{{}}
-
-{{}}
-App/ui/custom-receipt/layouts/page1.json
-{{}}
-
-```json
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- "data": {
- "layout": [
- {
- "id": "ReceiptHeader",
- "type": "Header",
- "textResourceBindings": {
- "title": "receipt.title"
- },
- "dataModelBindings": {},
- "size": "h2"
- },
- {
- "id": "fa796d12-49fc-457a-9d9a-d153998d55de",
- "type": "Image",
- "textResourceBindings": {
- "title": "Bilde"
- },
- "dataModelBindings": {},
- "image": {
- "src": {
- "nb": "https://docs.altinn.studio/app/app-dev-course/modul2/kommune-logo.png"
- },
- "width": "100%",
- "align": "flex-start"
- },
- "grid": {
- "xs": 2
- }
- },
- {
- "id": "ReceiptParagraph",
- "type": "Paragraph",
- "textResourceBindings": {
- "title": "receipt.body"
- },
- "grid": {
- "xs": 10
- }
- },
- {
- "id": "ReceiptInstanceInformation",
- "type": "InstanceInformation",
- "elements": {
- "dateSent": false
- }
- },
- {
- "id": "ReceiptHeader",
- "type": "Header",
- "textResourceBindings": {
- "title": "receipt.title_submitted"
- },
- "size": "h4"
- },
- {
- "id": "ReceiptAttachmentList",
- "type": "AttachmentList",
- "dataTypeIds": ["ref-data-as-pdf"],
- "includePDF": true
- }
- ]
- }
-}
-```
-
-{{}}
-{{}}
-
-Resulting receipt in the application:
-
-![Custom receipt](custom-receipt.png "Custom receipt")
-
-### Customizing texts in Simple Receipt
-
-Simple receipt is a concept that becomes relevant for those applications that have enabled `AutoDeleteOnProcessEnd: True` in their `applicationmetadata.json` file. For more information on what this implies [read here](/app/development/configuration/process/auto-delete/).
-
-The texts in this receipt can also be overridden by manually adding each defined text keys in the apps text resources. More information about how this is done can be found [here](../../../ux/texts).
-In the following section we will present an overview of the different texts that can be customized.
-
-![Simple receipt view](simple-receipt-step.png "Texts that can be customized in the simple receipt view")
-
-| Text # (see image above) | Text key |
-| ------------------------ | ------------------- |
-| 1 | receipt.receipt |
-| 2 | receipt.title |
-| 3 | receipt.body_simple |
-
-Example of custom texts in the file `resources.nb.json`:
-
-```json
-{
- "id": "receipt.receipt",
- "value": "Søknad om flytting til Sogndal kommune"
-},
-{
- "id": "receipt.title",
- "value": "Takk, søknaden er sendt!"
-},
-{
- "id": "receipt.body_simple",
- "value": "All data knyttet til denne innsendingen vil slettes etter tjenesteeieren har mottatt det."
-}
-```
-
-This results in the following view:
-
-![Simple receipt view](simple-receipt-step-custom.png "Overridden texts in the simple receipt view")
diff --git a/content/app/development/configuration/process/customize/_index.nb.md b/content/app/development/configuration/process/customize/_index.nb.md
deleted file mode 100644
index dfd4dd04f87..00000000000
--- a/content/app/development/configuration/process/customize/_index.nb.md
+++ /dev/null
@@ -1,436 +0,0 @@
----
-title: Tilpasse visninger av steg
-linktitle: Tilpasse visninger
-description: Hvordan tilpasse visninger i forskjellige steg av en prosess.
-toc: true
----
-
-En applikasjon vil ha en prosess som brukeren av applikasjonen vil følge.
-Avhengig av hvilken type steg brukeren er i, vil forskjellige ting vises.
-Denne siden vil forklare hvordan visningen til de forskjellige stegene kan tilpasses.
-
-## Data (tilsvarer utfyllingssteg i Altinn II)
-
-I denne prosess-task-typen vises skjema som kan fylles ut.
-Skjema kan redigeres ved bruk av [UI editoren](/nb/app/getting-started) eller ved å endre `FormLayout.json` direkte.
-
-## Bekreftelse (Confirmation)
-
-I denne prosess-task-typen vises noen standard-tekster, og bruker kan velge å _bekrefte_ for å gå videre.
-
-Tekstene kan overstyres, ved at man legger inn tekstnøkkel som hører til hver tekst i språkfilene for appen. Info
-om hvordan dette gjøres finner du [her](../../../ux/texts). Se under for oversikt over de forskjellige tekstnøklene som kan
-overstyres.
-
-![Bekreftelses-visningen](confirm-step.png "Tekster som kan endres/overstyres i bekreftelses-visningen")
-
-### Overstyre tekster
-
-| Tekst nr. (se bilde over) | Tekstnøkkel |
-| ------------------------- | ------------------- |
-| 1 | confirm.title |
-| 2 | confirm.sender |
-| 3 | confirm.body |
-| 4 | confirm.answers |
-| 5 | confirm.attachments |
-| 6 | confirm.button_text |
-
-Eksempel på overstyrte tekster i filen `resources.nb.json`:
-
-```json
-{
- "id": "confirm.title",
- "value": "Vennligst bekreft at du ønsker å sende inn"
-},
-{
- "id": "confirm.body",
- "value": "Du må kun trykke send inn om du er helt sikker på at du vil sende inn.
I det du trykker send inn kan du ikke gjøre endringer."
-},
-{
- "id": "confirm.attachments",
- "value": "Dokumenter med opplysninger"
-},
-{
- "id": "confirm.button_text",
- "value": "Lagre og fortsett"
-}
-```
-
-Merk at i eksempelet over har vi brukt html-taggen `
` for å lage linjeskift.
-For lenke og utheving, [benytt markdown](../../../ux/texts#formatering-av-tekster).
-
-Dette resulterer i følgende visning:
-
-![Bekreftelses-visningen](confirm-step-custom.png "Overstyrte tekster på bekreftelses-visningen")
-
-### Custom form layout
-
-For bekreftelsessteget har man som apputvikler muligheten til å definere et eget [layout set](../../../ux/pages/layout-sets/) med tilhørende form layout filer og andre konfigurasjonsfiler som hører til data-steget.
-
-Dette gjør det mulig å helt fritt styre innholdet på bekreftelsessiden, og man kan bruke komponentene man ellers har tilgjengelig i Altinn Studio.
-
-Siden bekreftelsessteget ikke er ment brukt når man skal skrive data, anbefaler vi å bruke statiske komponenter (header, paragraph) og sette komponenter utover dette som `readOnly`.
-
-Eksempel oppsett av `layout-sets.json` hvor `Task_1` er et datasteg, og `Task_2` et bekreftelsesteg.
-
-```json
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout-sets.schema.v1.json",
- "sets": [
- {
- "id": "simple",
- "dataType": "simple",
- "tasks": ["Task_1"]
- },
- {
- "id": "custom-confirmation",
- "dataType": "simple",
- "tasks": ["Task_2"]
- }
- ]
-}
-```
-
-Legg merke til at konfigurasjonen for settet til `Task_2` referer til data typen til `Task_1`.
-
-Eksempel `formLayout.json` som presenterer data som brukeren fylte ut i data-steget.
-
-```json
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- "data": {
- "layout": [
- {
- "id": "paragraph",
- "type": "Paragraph",
- "textResourceBindings": {
- "title": "paragraph"
- }
- },
- {
- "id": "name",
- "type": "Input",
- "textResourceBindings": {
- "title": "name.label"
- },
- "dataModelBindings": {
- "simpleBinding": "Felt1"
- },
- "required": true,
- "readOnly": true
- },
- {
- "id": "lastname",
- "type": "Input",
- "textResourceBindings": {
- "title": "lastName.label"
- },
- "dataModelBindings": {
- "simpleBinding": "Felt2"
- },
- "required": true,
- "readOnly": true
- }
- ]
- }
-}
-```
-
-Dette vil gi følgende app-struktur:
-
-```txt
-├───App
-│ ├───config
-│ ├───logic
-│ ├───models
-| | ...
-│ ├───ui
-│ │ ├───custom-confirmation
-│ │ │ └───layouts
-| | | └─── ...
-│ │ └───simple
-│ │ └───layouts
-| | | └─── ...
-
-```
-
-Sluttresultatet i appen:
-
-![Custom bekreftelsesvisning](custom_confirm_nb.png "Custom bekreftelsesvisning")
-
-For et komplett oppsett av denne muligheten kan du se vår [eksempel applikasjon.](https://altinn.studio/repos/ttd/custom-view-confirm)
-
-## Tilbakemelding (Feedback)
-
-Dette er et prosesssteg hvor applikasjonseier vil sjekke utfylte data for å generere en tilbakemelding før alle data kan arkiveres.
-
-Tekstene på siden kan overstyres ved at man legger inn tekstnøkler som hører til hver tekst i språkfilene for appen. Info om hvordan dette gjøres finner du [her](../../../ux/texts). Se under for oversikt over de forskjellige tekstnøklene som kan overstyres.
-
-![Tilbakemelding-visningen](feedback-default.png "Tekster som kan endres/overstyres i tilbakemelding-visningen")
-
-### Overstyre tekster
-
-| Tekst nr. (se bilde over) | Tekstnøkkel |
-| ------------------------- | -------------- |
-| 1 | feedback.title |
-| 2 | feedback.body |
-
-Eksempel på overstyrte tekster i filen `resources.nb.json`:
-
-```json
-{
- "id": "feedback.title",
- "value": "Vent på at tjenesteeier sjekker data"
-},
-{
- "id": "feedback.body",
- "value": "Når tjenesteier har sjekket at alle data er godkjent vil du bli automatisk sendt videre til siste steg i prosessen."
-}
-```
-
-## Kvittering (Receipt)
-
-I denne prosess-task-typen er prosessen ferdig og noen standardtekster vises.
-
-Tekstene kan overstyres, ved at man legger inn tekstnøkkel som hører til hver tekst i språkfilene for appen. Info om hvordan dette gjøres finner du [her](../../../ux/texts).
-
-Dersom den reelle mottakeren av skjemaet er en annen organisasjon enn organisasjonen som eier appen, burde kvitteringen tydeligjøre dette i `Mottaker` feltet. Dette kan gjøres ved å sette tekstresursen `appReceiver` til navnet på den reelle mottakeren.
-
-### Overstyre tekster
-
-![Kvitterings-visningen](receipt-step.png "Tekster som kan endres/overstyres i kvitterings-visningen")
-
-| Tekst nr. (se bilde over) | Tekstnøkkel |
-| ------------------------- | ----------------------- |
-| 1 | receipt.receipt |
-| 2 | receipt.title |
-| 3 | receipt.subtitle |
-| 4 | receipt.body |
-| 5 | receipt.title_submitted |
-
-Eksempel på overstyrte tekster i filen `resources.nb.json`:
-
-```json
-{
- "id": "receipt.receipt",
- "value": "Søknad om flytting til Sogndal kommune"
-},
-{
- "id": "receipt.title",
- "value": "Takk, søknaden er sendt!"
-},
-{
- "id": "receipt.subtitle",
- "value": "Finn kopi av dine svar i Altinn Innboks"
-},
-{
- "id": "receipt.body",
- "value": "Saksbehandling av denne type søknader tar vanligvis opp til 4 uker. Du vil bli varslet når svaret er klart i din innboks."
-},
-{
- "id": "receipt.title_submitted",
- "value": "Last ned PDF med dine svar:"
-}
-```
-
-Merk at dersom du endrer verdien til tekst-nøkkelen `receipt.subtitle` vil lenken uansett peke til Altinn Inboks.
-
-Dette resulterer i følgende visning:
-
-![Kvitterings-visningen](receipt-step-custom.png "Overstyrte tekster på kvitterings-visningen")
-
-### Custom form layout
-
-En egendefinert kvitteringsvisning kan nå lages på samme måte som alle andre skjemasider. Funksjonaliteten vil også
-innen kort tid bli tilgjengelig i Altinn Studio.
-
-For å lage en egendefinert kvitteringsvisning lager du en ny sidegruppe (layout set). Denne sidegruppen fungerer helt likt
-som alle andre sidetyper. Innenfor sidegruppen kan du opprette en mappe `layouts` og her definere alle sider du ønsker at
-skal inngå i kvitteringsvisningen (Ja, kvitteringsvisning støtter flere sider!). Inne i sidegruppen må du også lage
-`Settings.json`, hvor du kan definere rekkefølgen på sidene i kvitteringsvisningen.
-
-For at appen skal forstå at denne sidegruppen skal brukes som kvitteringsvisning må du referere til navnet på sidegruppen
-i `layout-sets.json`. Legg til en ny sidegruppe med `id` som referer til navnet på sidegruppen din, og legg til
-nøkkelverdien `"CustomReceipt"` i `tasks`-arrayet til sidegruppen. I tillegg kan du spesifisere hvilken datamodell som
-skal være tilgjengelig i kvitteringsvisningen ved å legge til nøkkelen `dataType` med navnet på datamodellen du vil støtte.
-
-Her er et fullt eksempel hvor vi har en sidegruppe med navnet `custom-receipt` som skal brukes som kvitteringsvisning:
-
-{{}}
-{{}}
-
-```
-|- App/
- |- ui/
- |- layout-sets.json
- |- custom-receipt/
- |- layouts/
- |- side1.json
- |- side2.json
- |- Settings.json
-```
-
-{{}}
-{{}}
-
-{{}}
-{{}}
-
-{{}}
-App/ui/layout-sets.json
-{{}}
-
-```json {hl_lines=[4,6]}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout-sets.schema.v1.json",
- "sets": [
- {
- "id": "custom-receipt",
- "dataType": "fields",
- "tasks": ["CustomReceipt"]
- }
- ]
-}
-```
-
-{{}}
-{{}}
-
-{{}}
-{{}}
-
-{{}}
-App/ui/custom-receipt/Settings.json
-{{}}
-
-```json
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layoutSettings.schema.v1.json",
- "pages": {
- "order": ["side1", "side2"]
- }
-}
-```
-
-{{}}
-{{}}
-
-Eksempel på en egendefinert layoutfil for kvittering:
-
-{{}}
-{{}}
-
-{{}}
-App/ui/custom-receipt/layouts/side1.json
-{{}}
-
-```json
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- "data": {
- "layout": [
- {
- "id": "ReceiptHeader",
- "type": "Header",
- "textResourceBindings": {
- "title": "receipt.title"
- },
- "dataModelBindings": {},
- "size": "h2"
- },
- {
- "id": "fa796d12-49fc-457a-9d9a-d153998d55de",
- "type": "Image",
- "textResourceBindings": {
- "title": "Bilde"
- },
- "dataModelBindings": {},
- "image": {
- "src": {
- "nb": "https://docs.altinn.studio/app/app-dev-course/modul2/kommune-logo.png"
- },
- "width": "100%",
- "align": "flex-start"
- },
- "grid": {
- "xs": 2
- }
- },
- {
- "id": "ReceiptParagraph",
- "type": "Paragraph",
- "textResourceBindings": {
- "title": "receipt.body"
- },
- "grid": {
- "xs": 10
- }
- },
- {
- "id": "ReceiptInstanceInformation",
- "type": "InstanceInformation",
- "elements": {
- "dateSent": false
- }
- },
- {
- "id": "ReceiptHeader",
- "type": "Header",
- "textResourceBindings": {
- "title": "receipt.title_submitted"
- },
- "size": "h4"
- },
- {
- "id": "ReceiptAttachmentList",
- "type": "AttachmentList",
- "dataTypeIds": ["ref-data-as-pdf"],
- "includePDF": true
- }
- ]
- }
-}
-```
-
-{{}}
-{{}}
-
-Sluttresultatet i appen:
-
-![Custom kvitteringsvisning](custom-receipt.png "Custom kvitteringsvisning")
-
-### Tilpasse tekster for enkel kvittering (Simple Receipt)
-
-Simple receipt er et konsept som er relevant for de applikasjonene som har aktivert `AutoDeleteOnProcessEnd: True` i `applicationmetadata.json` filen. For mer informasjon om hva dette innebærer [les her](/nb/app/development/configuration/process/auto-delete/).
-
-Tekstene i denne kvitteringen kan også overskrives ved å manuelt legge til hver definerte tekstnøkkel i appens tekstressursfil. Mer informasjon om hvordan dette gjøres finnes [her](../../../ux/texts).
-Følgende avsnitt viser en oversikt over hvilke tekster som kan tilpasses.
-
-![Enkel kvitteringsvisning](simple-receipt-step.png "Tekster som kan endres/overstyres i kvitteringsvisningen")
-
-| Tekst # (se bilde over) | Tekstnøkkel |
-| ----------------------- | ------------------- |
-| 1 | receipt.receipt |
-| 2 | receipt.title |
-| 3 | receipt.body_simple |
-
-Eksempel på overstyrte tekster i filen `resources.nb.json`:
-
-```json
-{
- "id": "receipt.receipt",
- "value": "Søknad om flytting til Sogndal kommune"
-},
-{
- "id": "receipt.title",
- "value": "Takk, søknaden er sendt!"
-},
-{
- "id": "receipt.body_simple",
- "value": "All data knyttet til denne innsendingen vil slettes etter tjenesteeieren har mottatt det."
-}
-```
-
-Dette resulterer i følgende visning:
-
-![Enkel kvitteringsvisning](simple-receipt-step-custom.png "Overstyrte tekster på enkel kvitteringsvisningen")
diff --git a/content/app/development/configuration/process/customize/confirm-step-custom.png b/content/app/development/configuration/process/customize/confirm-step-custom.png
deleted file mode 100644
index 73142b09527..00000000000
Binary files a/content/app/development/configuration/process/customize/confirm-step-custom.png and /dev/null differ
diff --git a/content/app/development/configuration/process/customize/confirm-step.png b/content/app/development/configuration/process/customize/confirm-step.png
deleted file mode 100644
index 6f1b141ab3d..00000000000
Binary files a/content/app/development/configuration/process/customize/confirm-step.png and /dev/null differ
diff --git a/content/app/development/configuration/process/customize/custom-receipt.png b/content/app/development/configuration/process/customize/custom-receipt.png
deleted file mode 100644
index 1804626156c..00000000000
Binary files a/content/app/development/configuration/process/customize/custom-receipt.png and /dev/null differ
diff --git a/content/app/development/configuration/process/customize/custom_confirm_en.png b/content/app/development/configuration/process/customize/custom_confirm_en.png
deleted file mode 100644
index eb3626491f9..00000000000
Binary files a/content/app/development/configuration/process/customize/custom_confirm_en.png and /dev/null differ
diff --git a/content/app/development/configuration/process/customize/custom_confirm_nb.png b/content/app/development/configuration/process/customize/custom_confirm_nb.png
deleted file mode 100644
index b3bdc19e604..00000000000
Binary files a/content/app/development/configuration/process/customize/custom_confirm_nb.png and /dev/null differ
diff --git a/content/app/development/configuration/process/customize/feedback-default.png b/content/app/development/configuration/process/customize/feedback-default.png
deleted file mode 100644
index 02d7bc2e328..00000000000
Binary files a/content/app/development/configuration/process/customize/feedback-default.png and /dev/null differ
diff --git a/content/app/development/configuration/process/customize/receipt-step-custom.png b/content/app/development/configuration/process/customize/receipt-step-custom.png
deleted file mode 100644
index 510f45c4136..00000000000
Binary files a/content/app/development/configuration/process/customize/receipt-step-custom.png and /dev/null differ
diff --git a/content/app/development/configuration/process/customize/receipt-step.png b/content/app/development/configuration/process/customize/receipt-step.png
deleted file mode 100644
index 4df8db89a9b..00000000000
Binary files a/content/app/development/configuration/process/customize/receipt-step.png and /dev/null differ
diff --git a/content/app/development/configuration/process/customize/simple-receipt-step-custom.png b/content/app/development/configuration/process/customize/simple-receipt-step-custom.png
deleted file mode 100644
index 173bd65ce99..00000000000
Binary files a/content/app/development/configuration/process/customize/simple-receipt-step-custom.png and /dev/null differ
diff --git a/content/app/development/configuration/process/customize/simple-receipt-step.png b/content/app/development/configuration/process/customize/simple-receipt-step.png
deleted file mode 100644
index 40508f2610c..00000000000
Binary files a/content/app/development/configuration/process/customize/simple-receipt-step.png and /dev/null differ
diff --git a/content/app/development/configuration/process/exclusive-gateways/_index.en.md b/content/app/development/configuration/process/exclusive-gateways/_index.en.md
deleted file mode 100644
index c06e584d5c2..00000000000
--- a/content/app/development/configuration/process/exclusive-gateways/_index.en.md
+++ /dev/null
@@ -1,152 +0,0 @@
----
-title: Exclusive gateways
-description: Define custom code to decide the flow out of an exclusive gateway
-toc: true
-tags: [gateways,bpmn,process]
----
-
-## Prerequisites
-
-* Your application uses version 7.1.0 or newer of the Altinn nugets.
-* Application with a process containing a exclusive gateway
-
-## Example process with exclusive gateways
-
-{{}}
-
-{{}}
-```xml
-
-
-
-
- Flow_s_t1
-
-
-
- Flow_s_t1
- Flow_t1_g1
-
-
- data
-
-
-
-
-
- Flow_t1_g1
- Flow_g1_g2
- Flow_g1_t2
-
-
-
-
- Flow_g1_t2
- Flow_t2_g2
-
-
-
- confirm
-
- confirmation
-
-
-
-
-
- Flow_g1_g2
- Flow_t2_g2
- Flow_g2_end
-
-
-
- Flow_g2_end
-
-
-
-
-```
-
-{{}}
-
-{{}}
-```xml
-
-
-
-
- Flow_s_t1
-
-
-
- Flow_s_t1
- Flow_t1_g1
-
-
-
- Flow_t1_g1
- Flow_g1_g2
- Flow_g1_t2
-
-
-
-
- Flow_g1_t2
- Flow_t2_g2
-
-
-
- Flow_g1_g2
- Flow_t2_g2
- Flow_g2_end
-
-
-
- Flow_g2_end
-
-
-
-
-```
-
-{{}}
-
-{{}}
-
-
-Visual representation of the bpmn definition
-
-![BPMN definition diagram](process-definition.svg "BPMN definition diagram")
-
-## Implementing and injecting custom gateway code
-
-To choose correct sequence flow out of the exclusive gateway based on instance data the application needs create a class
-implementing `Altinn.App.Core.Features.IProcessExclusiveGateway` and register it as a service in the dependency
-injection.
-
-The interface has one string Property `GatewayId`, and a method `FilterAsync`
-
-`GatewayId` is used to identify the Gateway in the process definition it is connected to.
-
-In our example definition a implementation for the first gateway (Gateway_1) would have this property set to `Gateway_1`
-as this is the value of the attribute `id` for the exclusive gateway in the process definition.
-
-The method FilterAsync is where you implement your custom logic to filter the available sequence flow(s) out of the
-gateway based on the instance data.
-
-For further documentation of the interface read the xml documentation for the
-interface [here](https://github.com/Altinn/app-lib-dotnet/blob/main/src/Altinn.App.Core/Features/IProcessExclusiveGateway.cs)
-
-After you have written your custom implementation register it in `Program.cs` in the `RegisterCustomAppServices` method.
-
-Example:
-
-```csharp
-void RegisterCustomAppServices(
- IServiceCollection services,
- IConfiguration config,
- IWebHostEnvironment env)
-{
- services.AddTransient();
-}
-```
\ No newline at end of file
diff --git a/content/app/development/configuration/process/exclusive-gateways/_index.nb.md b/content/app/development/configuration/process/exclusive-gateways/_index.nb.md
deleted file mode 100644
index 7836b862315..00000000000
--- a/content/app/development/configuration/process/exclusive-gateways/_index.nb.md
+++ /dev/null
@@ -1,151 +0,0 @@
----
-title: Exclusive Gateways
-description: Definer egendefinert kode som avgjør flyt ut av en exclusive gateway
-toc: true
-tags: [gateways,bpmn,process,prosess]
----
-
-{{%notice info%}}
-Funksjonaliteten beskrevet på denne siden krever minimum version 7.1.0 av Altinn nugets.
-{{%/notice%}}
-
-## Forutsetninger
-
-* Applikasjonen din benytter versjon 7.1.0 eller nyere av Altinn nugets
-* En applikasjon med exclusive gateway(s) definert i prosessen sin
-
-## Eksempel prosess med exclusive gateways
-
-{{}}
-
-{{}}
-```xml
-
-
-
-
- Flow_s_t1
-
-
-
- Flow_s_t1
- Flow_t1_g1
-
-
- data
-
-
-
-
-
- Flow_t1_g1
- Flow_g1_g2
- Flow_g1_t2
-
-
-
-
- Flow_g1_t2
- Flow_t2_g2
-
-
-
- confirm
-
- confirmation
-
-
-
-
-
- Flow_g1_g2
- Flow_t2_g2
- Flow_g2_end
-
-
-
- Flow_g2_end
-
-
-
-
-```
-
-{{}}
-
-{{}}
-```xml
-
-
-
-
- Flow_s_t1
-
-
-
- Flow_s_t1
- Flow_t1_g1
-
-
-
- Flow_t1_g1
- Flow_g1_g2
- Flow_g1_t2
-
-
-
-
- Flow_g1_t2
- Flow_t2_g2
-
-
-
- Flow_g1_g2
- Flow_t2_g2
- Flow_g2_end
-
-
-
- Flow_g2_end
-
-
-
-
-```
-
-{{}}
-
-{{}}
-
-
-Visuell representasjon av bpmn definisjonen over
-
-![BPMN definition diagram](process-definition.svg "BPMN definition diagram")
-
-## Implementer og inject egendefinert gateway kode
-
-For å velge riktig sequenceflow ut av en exclusive gateway basert på instansdataene må applikasjonen inneholde en implementasjon av `Altinn.App.Core.Features.IProcessExclusiveGateway` og registrere det med dependency injection systemet.
-
-Interfacet har en string Property `GatewayId`, og en metode `FilterAsync`
-
-`GatewayId` brukes for å identifisere gatewayen i processen som koden er koblet til.
-
-I eksempelet over vil en implementasjon ha propertien satt til `Gateway_1` siden dette er verdien på attributtet _id_ i gatewayen vi øsnker å skrive logikk for (eneste med to sequenceflows ut av seg).
-
-Metoden FilterAsync er hvor du implementerer din egendefinerte kode som skal filtrere og returnere gyldige sequenceflow(er) ut av gatewayen basert på instanses data.
-
-For mer dokumentasjon av interfacet se xml dokumentasjonen på interfacet [her](https://github.com/Altinn/app-lib-dotnet/blob/main/src/Altinn.App.Core/Features/IProcessExclusiveGateway.cs)
-
-Etter du har skrevet logikken din må den registreres i dependency injection systemet. Dette gjøres i metoden `RegisterCustomAppServices` i filen `Program.cs`
-
-Eksempel:
-
-```csharp
-void RegisterCustomAppServices(
- IServiceCollection services,
- IConfiguration config,
- IWebHostEnvironment env)
-{
- services.AddTransient();
-}
-```
\ No newline at end of file
diff --git a/content/app/development/configuration/process/exclusive-gateways/process-definition.svg b/content/app/development/configuration/process/exclusive-gateways/process-definition.svg
deleted file mode 100644
index 67bb30bbb58..00000000000
--- a/content/app/development/configuration/process/exclusive-gateways/process-definition.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/configuration/process/message/_index.en.md b/content/app/development/configuration/process/message/_index.en.md
deleted file mode 100644
index db957e71d06..00000000000
--- a/content/app/development/configuration/process/message/_index.en.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-title: Message
-description: How to set up a message in Altinn Studio.
-toc: true
----
-
-A message in Altinn 3 is really just a data step, in the same way as for example filling out a form. It is set up through a data model for the message, and a layout
-describing what the message should look like in the GUI. Because of this, message is not its own task type. This enables greater flexibility for Messages in Altinn 3 and allows them to be used as either the only task in a process, or as a part of a larger process.
-
-We have made some tools to simplify the process of getting started with setting up a message in an app.
-
-## Data model
-We have made a standard data model for messages, to make getting started easier. This data model can be found [here](https://altinncdn.no/schemas/xsd/message/message.schema.v1.xsd). It can be used as is, as a starting point, or exchanged for your own data model.
-
-## Layout
-The layout can be defined by yourself in the same way as a form. We have also created a [message widget](../../../ux/widgets), to make it easier to get started. This widget contains all the necessary components to recreate the example below. It also contains texts which are added to the resource files automatically, and contains [variables](../../../ux/texts#variables-in-texts) with references to `Title` and `Body` in a standard data model. If you should wish for different texts, or to use a different data model, just edit either the components or the texts according to your wishes after they have been added to the page.
-
-{{%notice warning%}}
-Note that if one wishes to use the _attachment list_, which is a standard message widget, one must manually add the _data types_ of the attachments to the layout file. A placeholder has been added to this component when it is added to the widget. Functionality to set it in Altinn Studio will be added at a later date. Accessible data types are located in the `applicationMetadata.json` file in the app. If the data types are missing in `applicationMetadata.json` generation of PDFs will not work.
-{{% /notice %}}
-
-![Standard message display](message-app.png "Standard message display")
diff --git a/content/app/development/configuration/process/message/_index.nb.md b/content/app/development/configuration/process/message/_index.nb.md
deleted file mode 100644
index d5ee8435323..00000000000
--- a/content/app/development/configuration/process/message/_index.nb.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-title: Melding
-description: Hvordan sette opp en melding i Altinn Studio.
-toc: true
----
-
-En melding i Altinn 3 er egentlig bare et data-steg, på samme måte som f.eks. skjemautfylling. Det settes opp med en datamodell for meldingen, og en
-layout for hva som skal vises på siden. Melding er dermed ikke en egen steg-type. Dette gjør at en melding i Altinn 3 er ekstremt fleksibel, og kan settes opp enten som eneste steg i en prosess, eller som en del av en større prosess.
-
-Vi har lagd noen verktøy som skal gjøre det enkelt å komme i gang med å sette opp en melding i en app.
-
-## Datamodell
-Vi har lagd en standard datamodell for meldinger, for å gjøre det enkelt å komme i gang. Denne datamodellen kan man finne [her](https://altinncdn.no/schemas/xsd/message/message.schema.v1.xsd). Denne kan enten brukes som den er, brukes som et utgangspunkt, eller man kan bruke en helt annen datamodell.
-
-## Layout
-Layout'en kan man definere helt selv, på samme måte som for skjema. Vi har allikevel opprettet en [meldings-widget](../../../ux/widgets), for å gjøre det enklere å komme i gang. Denne widget'en inneholder alle komponentene som trengs for å lage visningen under. Den inneholder også tekster som legges til i ressurs-filene automatisk, som har [variabler](../../../ux/texts#variabler-i-tekster) med referanser til feltene `Title` og `Body` i standard datamodell. Dersom man ønsker andre tekster eller å bruke en annen datamodell, er det bare å redigere enten komponentene eller tekstene etter ønske etter at de er lagt inn i siden.
-
-{{%notice warning%}}
-Merk at om en ønsker å bruke _vedleggslisten_, som er med i standard meldings-widget, må man i tillegg manuelt legge inn hvilke _datatyper_ vedleggene som skal vises har i layout-filen. Det er lagt inn en placeholder for dette i komponenten når den legges til med widget'en. Funksjonalitet for å sette dette i Altinn Studio vil komme senere. Tilgjengelige datatyper ligger i `applicationMetadata.json`-filen til appen. Om dette ikke gjøres vil ikke generering av PDF fungere.
-{{% /notice%}}
-
-![Standard meldings-visning](message-app.png "Standard meldings-visning")
\ No newline at end of file
diff --git a/content/app/development/configuration/process/message/message-app.png b/content/app/development/configuration/process/message/message-app.png
deleted file mode 100644
index d8a4d207edb..00000000000
Binary files a/content/app/development/configuration/process/message/message-app.png and /dev/null differ
diff --git a/content/app/development/configuration/process/pre-post-hooks/_index.en.md b/content/app/development/configuration/process/pre-post-hooks/_index.en.md
deleted file mode 100644
index d6691adb76d..00000000000
--- a/content/app/development/configuration/process/pre-post-hooks/_index.en.md
+++ /dev/null
@@ -1,39 +0,0 @@
----
-title: Define custom process hooks
-description: Define custom logic to be executed berfore or after a task is started/ended
-toc: true
----
-
-{{%notice info%}}
-The functionality described on this page requires version v7 or newer of altinn nugets.
-{{%/notice%}}
-
-It's possible to execute custom code when tasks in the process is started, ended or abandoned.
-All registered classes will be executed for each task so if you want your code to only be executed when one specific
-task starts/ends you need to take this into account when writing your code.
-
-## Execute custom code when tasks is started
-
-To execute custom code when a tasks starts, before Altinns standard logic you need to write a class implementing `Altinn.App.Core.Feature.IProcessTaskStart` and register it as a transient.
-
-It is possible to add multiple classes implementing the interface, all of them will be executed each time a task in the process starts.
-
-[View the interface here](https://github.com/Altinn/app-lib-dotnet/blob/main/src/Altinn.App.Core/Features/IProcessTaskStart.cs)
-
-## Execute custom code when tasks is ended
-
-To execute custom code when a tasks is ended, before Altinns standard logic you need to write a class implementing `Altinn.App.Core.Feature.IProcessTaskEnd` and register it as a transient.
-
-It is possible to add multiple classes implementing the interface, all of them will be executed each time a task in the process ends.
-
-[View the interface here](https://github.com/Altinn/app-lib-dotnet/blob/main/src/Altinn.App.Core/Features/IProcessTaskEnd.cs)
-
-## Execute custom code when tasks are abandoned
-
-To execute custom code when a tasks is abandoned, before Altinns standard logic you need to write a class
-implementing `Altinn.App.Core.Feature.IProcessTaskAbandon` and register it as a transient.
-
-It is possible to add multiple classes implementing the interface, all of them will be executed each time a task in the
-process is abandoned.
-
-[View the interface here](https://github.com/Altinn/app-lib-dotnet/blob/main/src/Altinn.App.Core/Features/IProcessTaskAbandon.cs)
diff --git a/content/app/development/configuration/process/pre-post-hooks/_index.nb.md b/content/app/development/configuration/process/pre-post-hooks/_index.nb.md
deleted file mode 100644
index a33d728d609..00000000000
--- a/content/app/development/configuration/process/pre-post-hooks/_index.nb.md
+++ /dev/null
@@ -1,36 +0,0 @@
----
-title: Definer egendefinerte prosess hooks
-description: Definer egendefinert kode som skal kjøres før eller etter en task er startet eller avsluttet
-toc: true
----
-
-{{%notice info%}}
-Funksjonaliteten beskrevet på denne siden krever minimum version 7 av Altinn nugets.
-{{%/notice%}}
-
-Det er mulig å skrive egendefinert kode som eksekveres når en task i prosessen starter, avsluttes eller forlates.
-Alle registrerte klasser vil bli eksekvert for hver task som starter eller avsluttes, det er derfor viktig at du tar høyde for dette hvis du kun øsnker at koden skal kjøres i forbindelse med spesifike tasker.
-
-## Kjør egendefinert kode før en task starter
-
-For å få egendefinert kode eksekvert når en task i prosessen startes må du opprette en klasse som implementerer `Altinn.App.Core.Features.IProcessTaskStart` og registrere denne som en transient.
-
-Det er mulig å legge til flere klasser som implementerer dette interfacet, alle vil ble kjørt for hver gang en task i prosessen starter.
-
-[Se interfacet her](https://github.com/Altinn/app-lib-dotnet/blob/main/src/Altinn.App.Core/Features/IProcessTaskStart.cs)
-
-## Execute custom code when tasks is ended
-
-For å få egendefinert kode eksekvert når en task i prosessen avsluttes må du opprette en klasse som implementerer `Altinn.App.Core.Features.IProcessTaskEnd` og registrere denne som en transient.
-
-Det er mulig å legge til flere klasser som implementerer dette interfacet, alle vil ble kjørt for hver gang en task i prosessen avsluttes (videre til neste steg).
-
-[Se interfacet her](https://github.com/Altinn/app-lib-dotnet/blob/main/src/Altinn.App.Core/Features/IProcessTaskEnd.cs)
-
-## Execute custom code when tasks are abandoned
-
-For å få egendefinert kode eksekvert når en task i prosessen avbrytes må du opprette en klasse som implementerer `Altinn.App.Core.Features.IProcessTaskAbandon` og registrere denne som en transient.
-
-Det er mulig å legge til flere klasser som implementerer dette interfacet, alle vil ble kjørt for hver gang en task i prosessen blir avbrutt.
-
-[Se interfacet her](https://github.com/Altinn/app-lib-dotnet/blob/main/src/Altinn.App.Core/Features/IProcessTaskAbandon.cs)
diff --git a/content/app/development/configuration/queryparameters/_index.en.md b/content/app/development/configuration/queryparameters/_index.en.md
deleted file mode 100644
index 18a2856e30b..00000000000
--- a/content/app/development/configuration/queryparameters/_index.en.md
+++ /dev/null
@@ -1,31 +0,0 @@
----
-title: Query parameters
-description: Available query parameters for an app.
-weight: 200
----
-
-## returnUrl
-
-Query parameter `returnUrl` is used by the app to redirect users to that value when they click the exit-button in the app.
-
-**Rules:**
-- `returnUrl` must have a valid URL-format
-- The host defined in `returnUrl` must be the same host as the URL has (see example below).
-- The value of `returnUrl` must be a base64-encoded string
-
-Example without base64-encoded string:
-https://foo.apps.tt02.altinn.no/foo/bar?returnUrl=https://foo.apps.tt02.altinn.no/foo/foobar
-
-Example with base64-encoded string:
-https://foo.apps.tt02.altinn.no/foo/bar?returnUrl=aHR0cHM6Ly9mb28uYXBwcy50dDAyLmFsdGlubi5uby9mb28vZm9vYmFy
-
-Here one can see that `returnUrl` has a valid URL-format and it has the same host name as the app defined in the beginning.
-
-For readability, the examples below does not use base64-encoded strings.
-
-One can not link to a different host name, this will not pass query parameter validation:
-https://foo.apps.tt02.altinn.no/foo/bar?returnUrl=https://foo.apps.altinn.no/foo/foobar
-
-It is important to have the correct order of query parameters and special characters in the URL.
-Here is an example showing a correct URL:
-https://ttd.apps.at21.altinn.cloud/ttd/level1-app?returnUrl=https%3A%2F%2Fttd.apps.at21.altinn.cloud%2Fttd%2Fapps-test%2F%23%2Finstance%2Finstanceownerid%2Finstanceguid/#/instance/instanceownerid/instanceguid
\ No newline at end of file
diff --git a/content/app/development/configuration/queryparameters/_index.nb.md b/content/app/development/configuration/queryparameters/_index.nb.md
deleted file mode 100644
index a53ed260406..00000000000
--- a/content/app/development/configuration/queryparameters/_index.nb.md
+++ /dev/null
@@ -1,31 +0,0 @@
----
-title: Query parametere
-description: Tilgjengelige query parametere for en app.
-weight: 200
----
-
-## returnUrl
-
-Query parameteret `returnUrl` brukes av appen for å videresende brukeren til den spesifiserte verdien i `returnUrl`, når
-brukeren trykker på avslutt-knappen i appen.
-
-**Regler:**
-- `returnUrl` må ha et gyldig URL-format
-- Host navnet definert i `returnUrl` må være det samme som appen man lenker til (se eksempelet nedenfor).
-- Verdien til `returnUrl` må være en base64-streng
-
-Eksempel uten base64:
-https://foo.apps.tt02.altinn.no/foo/bar?returnUrl=https://foo.apps.tt02.altinn.no/foo/foobar
-
-Eksempel med base64:
-https://foo.apps.tt02.altinn.no/foo/bar?returnUrl=aHR0cHM6Ly9mb28uYXBwcy50dDAyLmFsdGlubi5uby9mb28vZm9vYmFy
-
-Her ser man at `returnUrl` er en gyldig URL og at den peker mot samme host navn som appen.
-
-Eksemplene under inneholder ikke base64 for lesbarhet.
-
-Man kan derimot ikke lenke til annet host navn:
-https://foo.apps.tt02.altinn.no/foo/bar?returnUrl=https://foo.apps.altinn.no/foo/foobar
-
-Det er viktig med korrekt rekkefølge i URLen, og her er et eksempel som viser den korrekte rekkefølgen:
-https://ttd.apps.at21.altinn.cloud/ttd/level1-app?returnUrl=https%3A%2F%2Fttd.apps.at21.altinn.cloud%2Fttd%2Fapps-test%2F%23%2Finstance%2Finstanceownerid%2Finstanceguid/#/instance/instanceownerid/instanceguid
\ No newline at end of file
diff --git a/content/app/development/configuration/secrets/_index.en.md b/content/app/development/configuration/secrets/_index.en.md
deleted file mode 100644
index 02a8547138a..00000000000
--- a/content/app/development/configuration/secrets/_index.en.md
+++ /dev/null
@@ -1,171 +0,0 @@
----
-title: Secrets
-description: How to deal with secrets and sensitive data in an app.
-weight: 300
----
-
-## Administration of secrets in Azure
-
-As an application developer you administer the secrets which the application use in the Azure Key Vault.
-
-[Routines for ordering access to your organizations resources are described here](/nb/altinn-studio/guides/access-management/apps/).
-
-## Configure support for secrets in your app
-
-To make secrets accessible within your application the affiliated helm chart has to be updated.
-
-In your application repository you can find the file `values.yaml` in the folder _deployment_.
-
-Under the section _volumeMounts_ you add the following lines:
-
-```yaml
-- name: altinn-appsettings-secret
- mountPath: "/altinn-appsettings-secret"
-```
-
-Under the section _volumes_ you add the following lines:
-
-```yaml
-- name: altinn-appsettings-secret
- secret:
- secretName: altinn-appsettings-secret
-```
-
-{{%notice warning%}}
-Be wary of indentations while working in _values.yaml_.
-In yaml indents should be spaces and not tabs, tab will cause the file to not be interpreted as a yaml file.
-{{% /notice %}}
-
-The last part of the file should look something like this after your changes are complete.
-
-![Step 1](yaml.png)
-
-## How to make use of secrets in your application
-
-The service `ISecret` is exposed to the application and can be dependency injected into the class in which you need to collect a secret.
-
-### Local mock
-
-To run your service locally without connecting to the Azure Key vault you have to
-create the file `secrets.json` under the folder _App_.
-In the json structure you can add dummy data for the secrets you need for your service.
-If you have uploaded a secret into the key vault with the name "secretId", the content should look like the following:
-
-```json
-{
- "secretId": "local secret dummy data"
-}
-```
-
-### Types of secrets
-
-Secret - Stored as a string directly in the key vault. For ex. a base64 encoded certificate or a token.
-Key - key
-Certificate - certificate
-
-### Code example
-
-In this section you can find an example of how to use a secret to populate a form field during instantiation.
-
-The logic is implemented within `InstantiationHandler.cs`
-
-```cs
-using Altinn.App.Models;
-using Altinn.App.Services.Interface;
-using Altinn.App.Services.Models.Validation;
-using Altinn.Platform.Storage.Interface.Models;
-using System.Threading.Tasks;
-
-namespace Altinn.App.AppLogic
-{
- public class InstantiationHandler
- {
- private IProfile _profileService;
- private IRegister _registerService;
- private ISecrets _secretsService;
-
- ///
- /// Set up access to profile and register services
- ///
- ///
- ///
- public InstantiationHandler(IProfile profileService, IRegister registerService, ISecrets secretsService)
- {
- _profileService = profileService;
- _registerService = registerService;
- _secretsService = secretsService;
- }
-
- ///
- /// Run events related to instantiation
- ///
- ///
- /// For example custom prefill.
- ///
- /// Instance information
- /// The data object created
- public async Task DataCreation(Instance instance, object data)
- {
-
- if (data.GetType() == typeof(Skjema))
- {
- Skjema model = (Skjema)data;
- model.etatid = await _secretsService_.GetSecretAsync("secretId");
- }
- await Task.CompletedTask;
- }
- }
-}
-```
-
-1. The private variable for the service is included in the class
-
- ```cs
- private ISecrets _secretsService;
- ```
-
-2. The ISecrets service is dependency injected into the class, and the private variable assigned a value
-
- ```cs
- public InstantiationHandler(IProfile profileService, IRegister registerService, ISecrets secretsService)
- {
- _profileService = profileService;
- _registerService = registerService;
- _secretsService = secretsService;
- }
-
- ```
-
-3. In the method where you need the secret you call the service
- `secretId` will be the name of our secret in KeyVault, or in our local mock.
-
- ```cs
- await _secretsService_.GetSecretAsync("secretId");
- ```
-
-4. If you try to build the solution now, it will fail.
-
- ISecrets will be missing where the InstantiationHandler is instantiated. Navigate to `App.cs`
- and dependency inject the service into the constructor in App.
-
- The service must be added to the call where InstantiationHandler is instantiated as illustrated below.
-
- ```cs
- public App(
- IAppResources appResourcesService,
- ILogger logger,
- IData dataService,
- IProcess processService,
- IPDF pdfService,
- IProfile profileService,
- IRegister registerService,
- IPrefill prefillService,
- ISecrets secretsService
- ) : base(appResourcesService, logger, dataService, processService, pdfService, prefillService)
- {
- _logger = logger;
- _validationHandler = new ValidationHandler();
- _calculationHandler = new CalculationHandler();
- _instantiationHandler = new InstantiationHandler(profileService, registerService, secretsService);
- }
- ```
diff --git a/content/app/development/configuration/secrets/_index.nb.md b/content/app/development/configuration/secrets/_index.nb.md
deleted file mode 100644
index 9b0164cbe1f..00000000000
--- a/content/app/development/configuration/secrets/_index.nb.md
+++ /dev/null
@@ -1,174 +0,0 @@
----
-title: Secrets
-description: How to deal with secrets and sensitive data in an app.
-weight: 300
-tags: [translate-to-english]
----
-
-## Administrasjon av hemmeligheter i Azure
-
-Som applikasjonsutvikler administrerer man selv hemmelighetene som applikasjonen benytter i Azure Key Vault.
-
-[Rutiner for bestilling av tilgang til din organisasjons ressurser er beskrevet her](/altinn-studio/guides/access-management/apps/).
-
-## Konfigurer støtte for hemmeligheter i din app
-
-For å tilgjengeliggjøre hemmeligheter i applikasjonen må det gjøres oppdateringer i helm charten tilknyttet applikasjonen.
-
-I applikasjonsrepoet ditt finner du filen `values.yaml` i mappen _deployment_.
-
-Under seksjonen _volumeMounts_ legger du til følgende linjer:
-
-```yaml
-- name: altinn-appsettings-secret
- mountPath: "/altinn-appsettings-secret"
-```
-
-Under seksjonen _volumes_ legger du til følgende linjer:
-
-```yaml
-- name: altinn-appsettings-secret
- secret:
- secretName: altinn-appsettings-secret
-```
-
-{{%notice warning%}}
-Vær påpasselig med innrykk når du jobber i _values.yaml_.
-I yaml skal indents være mellomrom og ikke tab, benytter du tab vil ikke din yaml være gyldig.
-{{% /notice %}}
-
-Siste del av filen skal se omtrent slik ut når du har gjort ferdig alle endringer.
-
-![Steg 1](yaml.png)
-
-## Hvordan benytte hemmeligheter i applikasjonen
-
-Servicen `ISecret` er eksponert i applikasjonen og kan dependency injectes
-i den klassen der du har behov for å hente ut en hemmelighet.
-
-### Lokal mock
-
-For å kunne kjøre tjenesten din lokalt uten å koble seg til Azure Key vault
-må man opprette filen `secrets.json` under mappen _App_.
-I Json strukturen kan man legge inn dummydata for hemmelighetene man har behov for.
-Har man lastet opp en hemmelighet i Key Vault med navnet "secretId" vil innholdet i json-filen se slik ut
-
-```json
-{
- "secretId": "local cecret dummy data"
-}
-```
-
-### Type hemmeligheter
-
-Secret - lagres som en streng direkte i keyvault. F.eks et sertifikat som er base64 encoded eller et token.
-Key - Nøkkel
-Certificate - et sertifikat
-
-### Kodeeksempel
-
-I denne seksjonen finner du et eksempel på hvordan man benytter en hemmelighet
-til å populere et skjemafelt under instansiering.
-
-Logikken er implementert i `InstantiationHandler.cs`
-
-```cs
-using Altinn.App.Models;
-using Altinn.App.Services.Interface;
-using Altinn.App.Services.Models.Validation;
-using Altinn.Platform.Storage.Interface.Models;
-using System.Threading.Tasks;
-
-namespace Altinn.App.AppLogic
-{
- public class InstantiationHandler
- {
- private IProfile _profileService;
- private IRegister _registerService;
- private ISecrets _secretsService;
-
- ///
- /// Set up access to profile and register services
- ///
- ///
- ///
- public InstantiationHandler(IProfile profileService, IRegister registerService, ISecrets secretsService)
- {
- _profileService = profileService;
- _registerService = registerService;
- _secretsService = secretsService;
- }
-
- ///
- /// Run events related to instantiation
- ///
- ///
- /// For example custom prefill.
- ///
- /// Instance information
- /// The data object created
- public async Task DataCreation(Instance instance, object data)
- {
-
- if (data.GetType() == typeof(Skjema))
- {
- Skjema model = (Skjema)data;
- model.etatid = await _secretsService_.GetSecretAsync("secretId");
- }
- await Task.CompletedTask;
- }
- }
-}
-```
-
-1. Den private variabelen for servicen inkluderes i klassen
-
- ```cs
- private ISecrets _secretsService;
- ```
-
-2. ISecrets servicen dependency injectes inn i klassen. Og den private variabelen blir assignet en verdi.
-
- ```cs
- public InstantiationHandler(IProfile profileService, IRegister registerService, ISecrets secretsService)
- {
- _profileService = profileService;
- _registerService = registerService;
- _secretsService = secretsService;
- }
-
- ```
-
-3. I metoden der man har behov for hemmeligheten kaller man på servicen.
- `secretId` vil være navnet på hemmeligheten i KeyVault evt. i lokal mock.
-
- ```cs
- await _secretsService_.GetSecretAsync("secretId");
- ```
-
-4. Dersom du prøver å bygge løsningen nå vil det feile.
-
- ISecrets vil mangle der InstantiationHandler instansieres. Naviger til `App.cs`
- og dependency inject servicen inn i konstruktøren til App.
-
- Videre må tjenesten legges til i kallet der InstantiationHandler instansieres som vist nedenfor.
-
- ```cs
- public App(
- IAppResources appResourcesService,
- ILogger logger,
- IData dataService,
- IProcess processService,
- IPDF pdfService,
- IProfile profileService,
- IRegister registerService,
- IPrefill prefillService,
- ISecrets secretsService
- ) : base(appResourcesService, logger, dataService, processService, pdfService, prefillService)
- {
- _logger = logger;
- _validationHandler = new ValidationHandler();
- _calculationHandler = new CalculationHandler();
- _instantiationHandler = new InstantiationHandler(profileService, registerService, secretsService);
- }
- ```
\ No newline at end of file
diff --git a/content/app/development/configuration/secrets/yaml.png b/content/app/development/configuration/secrets/yaml.png
deleted file mode 100644
index 30ef3fd42b0..00000000000
Binary files a/content/app/development/configuration/secrets/yaml.png and /dev/null differ
diff --git a/content/app/development/configuration/settings/_index.en.md b/content/app/development/configuration/settings/_index.en.md
deleted file mode 100644
index dd8b217a099..00000000000
--- a/content/app/development/configuration/settings/_index.en.md
+++ /dev/null
@@ -1,92 +0,0 @@
----
-title: Settings and environmental variables
-linktitle: Settings
-description: How to add configuration and environmental specific values so that they are available from app code.
-toc: true
-weight: 500
----
-
-## Standard .NET configuration
-
-Altinn 3's app template is based on an ASP.Net Core application and has a multitude of possibilities for controlling
-configuration of an app. This documentation is therefore in large part quotes from or links
-to [Microsoft's own documentation](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1)
-. However, not everything is possible in an application because Altinn 3 does not give full access to the environment an
-app is run within.
-
-## appsettings.json
-
-The first and simplest source for configuration information are the `appsettings` files. Every new app which is created will come with an existing `appsettings.json` file. This file is read by an app during startup independently of what environment the app runs in. This means the file should only contain settings which are equal in all environments. The file contains some settings that are already in use and the values are in large part meant for a development environment where the application is run within [LocalTest](https://github.com/Altinn/app-localtest/blob/master/README.md)
-
-In appsettings.json the values are organized in different sections. It is not recommended to add new values to the existing sections, creating new sections is recommended. The following sections are reserved to avoid collisions: `Kestrel`, `AppSettings`, `GeneralSettings`, `PlatformSettings`, `PEPSettings`, `ApplicationInsights`, `kvSettings`.
-
-```json
-{
- "ExampleSection": {
- "ExampleValue": "Verdi lest inn i alle miljøer, men kanskje overstyrt av miljøspesifikke kilder"
- },
- "AppSettings": {
- ...
- },
- "GeneralSettings": {
- ...
- },
- "PlatformSettings": {
- "ApiStorageEndpoint": "http://localhost:5101/storage/api/v1/",
- "ApiRegisterEndpoint": "http://localhost:5101/register/api/v1/",
- ...
- },
- "ApplicationInsights": {
- "InstrumentationKey": "retrieved from environment at runtime"
- }
-}
-```
-
-In the future new apps will have a designated section which is simple to expand. In the meantime we refer to [Microsoft's own documentation](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-3.1) for how this should be done.
-
-### Environment specific appsettings
-
-A new app will contain a set of environment specific appsettings files: `appsettings.Development.json`, `appsettings.Staging.json` and `appsettings.Production.json`. These files are read in their respective environments. The TT02-environment is defined as staging and the production environment is defined as Production.
-
-Every file should contain the values which are unique or different in at least one of the environments. Examples of values that vary from environment to environment is the "timeout" values. You might want an app to wait longer for a response from an external API during development than what you want to allow during production.
-
-#### appsettings.Development.json
-```json
-{
- "ExampleSection": {
- "ExampleValue": "Verdi lest inn kun for utviklingsmiljø"
- }
-}
-```
-
-#### appsettings.Staging.json
-```json
-{
- "ExampleSection": {
- "ExampleValue": "Verdi lest inn kun for TT02"
- }
-}
-```
-
-#### appsettings.Production.json
-```json
-{
- "ExampleSection": {
- "ExampleValue": "Verdi lest inn kun for produksjon"
- }
-}
-```
-
-## Environment variables
-
-Standard behaviour for an ASP.Net application is to read Environment variables. This is also done for an app, but it isn't possible for an app developer to create or change any of these values. Altinn 3 considers the other method of controlling Environment specific variables to be covered by appsettings and KeyVault.
-
-## Command line arguments
-
-It is technically possible to override all other data sources by using command line arguments. It is however not possible to use this to change values from one environment to another.
-
-## Azure KeyVault
-
-Every application owner should have access to their own Azure KeyVault for storage of sensitive values. Sensitive values includes values which you don't want to be visible in code or configuration files. Examples include usernames and passwords for external APIs, certificates, private keys, etc.
-
-Currently values from KeyVault are not read into the configuration control of an App. Instead the secrets component is used. This is documented under [Secrets](../secrets).
diff --git a/content/app/development/configuration/settings/_index.nb.md b/content/app/development/configuration/settings/_index.nb.md
deleted file mode 100644
index e8e5a8def53..00000000000
--- a/content/app/development/configuration/settings/_index.nb.md
+++ /dev/null
@@ -1,88 +0,0 @@
----
-title: Settings og miljøvariabler
-linktitle: Settings
-description: Hvordan legge inn konfigurasjon- og miljøspesifikke verdier slik at de er tilgjengelig fra app-koden.
-toc: true
-weight: 500
----
-
-## Standard .NET konfigurasjon
-
-Altinn 3 sin App template baserer seg på en ASP.Net Core applikasjon og har med dette en rekke muligheter for å styre konfigurasjon av en App. Denne dokumentasjonen er derfor i stor grad utdrag fra eller linker til [Microsoft sin egen dokumentasjon](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1). Det er derimot ikke alt som er mulig i en App da det er litt begrenset hva Altinn 3 gir av tilganger til miljøet en App kjører i.
-
-## appsettings.json
-
-Første og enkleste kilde til konfigurasjonsinformasjon er `appsettings` filene. En hver ny app som blir laget vil komme med en eksisterende `appsettings.json` fil. Denne filen blir lest inn av en App under oppstart uavhengig av hvilke miljø Appen kjører i. Det vil si at den bør inneholde standarinnstillinger og innstillinger som er lik i alle miljøer. Filen har allerede en del innstillinger som er i bruk og verdiene er i stor grad beregnet for et utviklingsmiljø hvor man kjører [LocalTest](https://github.com/Altinn/app-localtest/blob/master/README.md).
-
-I appsettings.json filene organiseres verdier i ulike seksjoner. Det anbefales å ikke legge til nye verdier i de eksisterende seksjonene, men isteden lage nye seksjoner. Følgende seksjoner er reservert for å unngå kollisjoner: `Kestrel`, `AppSettings`, `GeneralSettings`, `PlatformSettings`, `PEPSettings`, `ApplicationInsights`, `kvSettings`.
-
-```json
-{
- "ExampleSection": {
- "ExampleValue": "Verdi lest inn i alle miljøer, men kanskje overstyrt av miljøspesifikke kilder"
- },
- "AppSettings": {
- ...
- },
- "GeneralSettings": {
- ...
- },
- "PlatformSettings": {
- "ApiStorageEndpoint": "http://localhost:5101/storage/api/v1/",
- "ApiRegisterEndpoint": "http://localhost:5101/register/api/v1/",
- ...
- },
- "ApplicationInsights": {
- "InstrumentationKey": "retrieved from environment at runtime"
- }
-}
-```
-
-I fremtiden vil en ny App få med en egen seksjon som det skal være enkelt å utvide. I mellomtiden refereres det til [Microsoft sin dokumentasjon](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-3.1) for hvordan dette kan gjøres.
-
-### Miljøspesifikke appsettings
-
-En ny app vil også inneholde et set med miljøspesifikke appsettings filer: `appsettings.Development.json`, `appsettings.Staging.json` og `appsettings.Production.json`. Disse filene blir lest inn kun i det aktuelle miljøet. TT02-miljøet er definert som Staging og produksjonsmiljøet er definert som Production.
-
-Hver fil skal altså ha verdier som er unike eller anderledes i minst ett annet miljø. Et eksempel på en type verdi som kan variere fra miljø til miljø er "timeout" verdier. Hvis man ønsker at en App skal vente lengre på respons fra et eksternt API under utvikling enn det man ønsker å tillate i produksjon.
-
-#### appsettings.Development.json
-```json
-{
- "ExampleSection": {
- "ExampleValue": "Verdi lest inn kun for utviklingsmiljø"
- }
-}
-```
-
-#### appsettings.Staging.json
-```json
-{
- "ExampleSection": {
- "ExampleValue": "Verdi lest inn kun for TT02"
- }
-}
-```
-
-#### appsettings.Production.json
-```json
-{
- "ExampleSection": {
- "ExampleValue": "Verdi lest inn kun for produksjon"
- }
-}
-```
-
-## Miljøvariabler
-
-Standard oppførsel til en ASP.Net applikasjon er å lese inn miljøvariabler. Dette gjøres også for en App, men det er ikke mulig for en Apputvikler å lage eller endre noen verdier per i dag. Altinn 3 mener at denne måten å styre miljøspesifikke verdier på dekkes av appsettings og KeyVault.
-
-## Kommandolinjeargumenter
-
-Det er teknisk mulig å overstyre alle andre data kilder ved hjelp av kommandolinjeargumenter. Det er derimot ikke mulig å bruke dette til å endre verdier fra et miljø til et annet.
-
-## Azure KeyVault
-
-Hver applikasjonseier skal få tilgang til sitt eget Azure KeyVault for lagring av sensitive verdier. Altså verdier man ikke ønsker å ha synlig i kode eller konfigurasjonsfiler. Noen naturlig eksempler på dette er ting som brukernavn og passord for eksterne APIer en App skal benytte. Et sertifikat, privat nøkkel eller lignende.
-
-Per i dag blir ikke verdier fra KeyVault lest inn i konfigurasjonsstyringen av en App. Isteden må man benytte Secrets komponenten. Dette er dokumentert under [hemmeligheter](../secrets).
diff --git a/content/app/development/configuration/shadowfields/_index.en.md b/content/app/development/configuration/shadowfields/_index.en.md
deleted file mode 100644
index d62d0cf2c51..00000000000
--- a/content/app/development/configuration/shadowfields/_index.en.md
+++ /dev/null
@@ -1,150 +0,0 @@
----
-title: Shadow fields in form data
-linktitle: Shadow fields
-description: Configuration of shadow fields for app.
-weight: 200
----
-
-In some cases, it can be useful to store additional information for a form that is not necessarily important when
-retrieving finalized data for internal systems. This may include values used in form dynamics or calculations which are
-not a relevant part of the submitted data.
-
-By utilizing shadow field functionality, you can store all such data along with the rest of the form data during the
-process and then remove unnecessary data before retrieving it for processing in internal systems.
-
-{{% notice info %}}
-To be able to use shadow fields functionality, the app must use version 7.9.0 or later of the packages
-Altinn.App.Api and Altinn.App.Core.
-{{% /notice %}}
-
-## Configuration
-
-### In the data model
-
-Shadow fields are set up in the same way as other form fields in the data model, but with a self-chosen _prefix_. This
-means that if you choose, for example, `SF_` as the prefix, a helper field in the data model could be named
-`SF_myHelperField`.
-
-This is done by changing field names in the [data modeling tool](../../data/data-modeling/). Make sure to press "Generate Models" after the changes
-to include updates in the C# model and possibly the XSD.
-
-_NOTE! If you change field names in a data model that is already used in a form, you must go into the relevant form
-component and update to the new field name, as this is not done automatically._
-
-### Removing helper field data directly from form data
-
-To ensure that the fields set up as helper fields in the data model are removed from the submitted data, you need to
-configure the corresponding data type in `App/config/applicationMetadata.json`.
-
-1. Find the data type that points to the relevant data model.
-2. In the `appLogic` object, add:
- ```json
- "shadowFields": {
- "prefix":
- }
- ```
-
-For example, with the prefix used in the example above, the data type would be:
-
-```json {linenos=false,hl_lines=[10-12]}
-"dataTypes": [
- {
- "id": "my-model",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.myModel",
- "shadowFields": {
- "prefix": "SF_"
- }
- }
- }
-]
-```
-
-All fields in the data model that start with `SF_` will then be removed from the form data upon submission so that when
-you later retrieve the data for processing, those fields will not be included.
-
-{{% notice warning %}}
-Removal of data in shadow fields is done BEFORE generating the PDF. This is because the form data is locked before PDF
-generation to ensure that the data is not altered after the PDF is generated.
-If there is data in the helper fields that is necessary for generating the PDF, refer to the section on saving a copy of
-the data without helper fields below.
-{{% /notice %}}
-
-### Saving a copy of form data without helper fields
-
-There may be cases where it is desirable to keep the form data as it was upon submission and instead create a copy that
-contains only the relevant data (i.e., without helper fields). For example, in cases where helper fields are used to
-control dynamics for displaying/hiding components, which may affect the appearance of the PDF receipt.
-
-If you want to keep the form data as submitted and save a copy with only the relevant data (i.e., without helper fields),
-you can set it up in `applicationMetadata` in the same way as above, but with an additional configuration specifying the
-data type to use for storing the copy.
-You can either create a separate data type (which may make it easier to find the correct data element to retrieve later)
-or specify the same data type that you are configuring (thus saving a copy of the same data type).
-
-1. Find the data type that points to the relevant data model.
-2. In the `appLogic` object, add:
- ```json
- "shadowFields": {
- "prefix": ,
- "saveToDataType":
- }
- ```
-
-#### Example with the same data type
-
-```json {linenos=false,hl_lines=[10-12]}
-"dataTypes": [
- {
- "id": "my-model",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.myModel",
- "shadowFields": {
- "prefix": "SF_",
- "saveToDataType": "my-model"
- }
- }
- }
-]
-```
-
-### Example with a different data type
-
-```json {linenos=false,hl_lines=[10-13,17-27]}
-"dataTypes": [
- {
- "id": "my-model",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.myModel",
- "shadowFields": {
- "prefix": "SF_",
- "saveToDataType": "my-model-copy"
- }
- },
- ...
- },
- {
- "id": "my-model-copy",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": false,
- "classRef": "Altinn.App.Models.myModel",
- },
- ...
- }
-]
-```
diff --git a/content/app/development/configuration/shadowfields/_index.nb.md b/content/app/development/configuration/shadowfields/_index.nb.md
deleted file mode 100644
index 52830e074ec..00000000000
--- a/content/app/development/configuration/shadowfields/_index.nb.md
+++ /dev/null
@@ -1,149 +0,0 @@
----
-title: Hjelpefelter i skjemadata
-linktitle: Hjelpefelter
-description: Konfigurasjon av hjelpefelter for app.
-weight: 200
----
-
-I noen tilfeller kan det være nyttig å lagre ekstra informasjon for et skjema, som ikke nødvendigvis er
-viktig å få med når man henter ut ferdige data til egne fagsystemer. Dette kan f.eks. gjelde verdier som er
-brukt i forbindelse med dynamikk eller beregninger i skjema, men som ikke er en relevant del av innsendte data.
-
-Ved å ta i bruk funksjonalitet for hjelpefelt kan man lagre all slike data sammen med øvrig skjemadata underveis, for å
-så fjerne unødvendig data før det hentes ut til f.eks. fagsystem eller lignende.
-
-{{% notice info %}}
-For å kunne ta i bruk hjelpefelter-funksjonalitet må appen bruke version 7.9.0 eller nyere av pakkene Altinn.App.Api
-og Altinn.App.Core.
-{{% /notice %}}
-
-## Konfigurasjon
-
-### I datamodellen
-
-Hjelpefelter settes opp på samme måte som øvrige skjemafelter i datamodellen, men med et _prefiks_ som man selv velger.
-Det vil si at dersom man velger f.eks. `HF_` som prefiks, så vil et hjelpefelt i datamodellen kunne hete `HF_mittHjelpefelt`.
-
-Dette gjøres ved å endre feltnavn i [datamodellerings-verktøyet](../../data/data-modeling/). Pass på å trykke "Generer modeller" etter endringene
-for å få med oppdateringer i C#-modellen og ev. XSD.
-
-_OBS! Om man endrer på feltnavn i datamodell som allerede er i bruk i skjema, må man inn i den aktuelle skjema-komponenten
-og oppdatere til nytt feltnavn, da dette ikke gjøres automatisk._
-
-### Fjerne hjelpefeltdata direkte fra skjemadata
-
-For å sikre at feltene som er satt opp som hjelpefelter i datamodellen blir fjernet fra innsendt data må man konfigurere
-den aktuelle datatypen i `App/config/applicationMetadata.json`.
-
-1. Finn frem til den datatypen som peker på den aktuelle datamodellen
-2. I `appLogic`-objektet, legg til:
- ```json
- "shadowFields": {
- "prefix":
- }
- ```
-
-F.eks., med prefiksen som ble brukt i eksempelet over, ville datatypen bli:
-
-```json {linenos=false,hl_lines=[10-12]}
-"dataTypes": [
- {
- "id": "my-model",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.myModel",
- "shadowFields": {
- "prefix": "HF_"
- }
- }
- }
-]
-```
-
-Alle felter i datamodellen som starter med `HF_` vil da bli fjernet fra skjemadata ved innsending, slik at når man senere
-skal hente ut dataene for behandling, så er de ikke med.
-
-{{% notice warning %}}
-Fjerning av data i hjelpefelter gjøres FØR generering av PDF. Dette er fordi skjemadataene låses før generering av PDF,
-for å sikre at dataene ikke endres etter at PDF er generert.
-Dersom det er data i hjelpefeltene som er nødvendig for å generere PDF, se avsnitt om å lagre en kopi av dataene uten
-hjelpefelter under.
-{{% /notice %}}
-
-### Lagre en kopi av skjemadata uten hjelpefelter
-
-Det kan være tilfeller der det er ønskelig å beholde skjemadataene sånn som de var ved innsending, og heller opprette en
-kopi som inneholder dataene uten hjelpefelter. F.eks. i tilfeller der man bruker hjelpefelter for å styre dynamikk for å
-vise/skjule komponenter og dette påvirker hvordan PDF-kvittering blir seende ut.
-
-Dersom man ønsker å beholde skjemadata som ved innsending, og heller lagre en kopi med kun relevant data
-(altså uten hjelpefelter) så kan man sette det opp i `applicationMetadata` på samme måte om over, men med en ekstra
-konfigurasjon som sier hvilken datatype man ønsker å bruke for å lagre kopien.
-Man kan da enten opprette en egen datatype (dette kan gjøre det enklere å f.eks. finne riktig dataelement å hente ut
-senere), eller oppgi den samme datatypen som man konfigurerer.
-
-1. Finn frem til den datatypen som peker på den aktuelle datamodellen
-2. I `appLogic`-objektet, legg til:
- ```json
- "shadowFields": {
- "prefix": ,
- "saveToDataType":
- }
- ```
-
-#### Eksempel med samme datatype
-
-```json {linenos=false,hl_lines=[10-12]}
-"dataTypes": [
- {
- "id": "my-model",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.myModel",
- "shadowFields": {
- "prefix": "HF_",
- "saveToDataType": "my-model"
- }
- }
- }
-]
-```
-
-#### Eksempel med en annen datatype
-
-```json {linenos=false,hl_lines=[10-13,17-27]}
-"dataTypes": [
- {
- "id": "my-model",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.myModel",
- "shadowFields": {
- "prefix": "HF_",
- "saveToDataType": "my-model-copy"
- }
- },
- ...
- },
- {
- "id": "my-model-copy",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": false,
- "classRef": "Altinn.App.Models.myModel",
- },
- ...
- }
-]
-```
diff --git a/content/app/development/configuration/startup/_index.en.md b/content/app/development/configuration/startup/_index.en.md
deleted file mode 100644
index 61b11d637e5..00000000000
--- a/content/app/development/configuration/startup/_index.en.md
+++ /dev/null
@@ -1,84 +0,0 @@
----
-title: Configure behavior during startup
-linktitle: Startup
-description: How to configure app behavior during startup of app-frontend
-toc: true
-weight: 500
----
-
-In `applicationmetadata.json` there is an option to configure the user interface when a user navigates to a direct link to the application.
-This is done in the field `onEntry.show` where you have the possibility to set the values `new-instance` (default) or `select-instance`.
-Standard behaviour if this field is not present is to create a new instance for the user.
-
-## Select from active instances
-
-{{%notice warning%}}
-
-**Notice:** in order to use this functionality the application must reference version >= 4.15.2 of the nuget packages `Altinn.App.PlatformServices`, `Altinn.App.Common` and `Altinn.App.Api`.
-
-{{%/notice%}}
-
-If the field `onEntry.show` is set to `select-instance` the user is presented with a list of active instances for the selected reportree when navigating to the application.
-
-### Example
-The following configuration is added to `applicationmetadata.json` to configure select from active instance.
-
-```json {hl_lines=[8,9,10]}
-{
- "id": "ttd/demo-app",
- "org": "ttd",
- "title": {
- "nb": "Starte fra aktiv instans"
- },
- ...
- "onEntry": {
- "show": "select-instance"
- }
-}
-```
-
-For users that do not have any active instances, a new instance will be created,
-while users that have active instances will be presented with the following user interface:
-
-![User interface for selecting active instances](select-active-instance.png "User interface for selecting active instances")
-
-## Configure instance selection page
-
-{{%notice warning%}}
-**Notice:** in order to use this functionality the application must reference version >= 7.13.0 of the nuget packages
-`Altinn.App.core` and `Altinn.App.Api`.
-{{%/notice%}}
-
-Using the field `onEntry.instanceSelection`, you can further customize the instance selection page. The following
-options are available:
-
-- `sortDirection`: Choose between `asc` or `desc` to sort the instances ascending or descending. Default is `asc`.
-- `rowsPerPageOptions`: Choose which options the user can choose between when deciding how many instances to show per
-page. Default is `[10, 25, 50]`.
-- `defaultSelectedOption`: Choose which option should be selected as default when the user opens the instance selection
-page. The value must be a number that is used as an index to select a value in `rowsPerPageOptions`. Default is `0`.
-
-### Configuration Example
-
-The following configuration is added to `applicationmetadata.json` to configure the instance selection page.
-
-```json {hl_lines=[10,11,12,13]}
-{
- "id": "ttd/demo-app",
- "org": "ttd",
- "title": {
- "nb": "Starte fra aktiv instans"
- },
- ...
- "onEntry": {
- "show": "select-instance",
- "instanceSelection": {
- "sortDirection": "asc",
- "rowsPerPageOptions": [10, 25, 50, 100],
- "defaultSelectedOption": 1
- }
- }
-}
-```
-
-![Configured user interface for selecting active instances](select-active-instance-configured.png "Configured user interface for selecting active instances")
diff --git a/content/app/development/configuration/startup/_index.nb.md b/content/app/development/configuration/startup/_index.nb.md
deleted file mode 100644
index af0b91bfd3e..00000000000
--- a/content/app/development/configuration/startup/_index.nb.md
+++ /dev/null
@@ -1,83 +0,0 @@
----
-title: Konfigurer appens oppførsel under oppstart
-linktitle: Startup
-description: Hvordan konfigurere applikasjonens oppførsel under oppstart av app-frontend
-toc: true
-weight: 500
----
-
-I `applicationmetadata.json` har man mulighet til å styre hva applikasjonen viser i det brukeren går mot en direktelenke.
-Dette gjøres under feltet `onEntry.show`, hvor man har mulighet til å sette verdiene `new-instance` (default) eller `select-instance`.
-Standard oppførsel om dette feltet ikke er satt er at det lages en ny instans for brukeren som besøker applikasjonen.
-
-## Velge fra aktive instanser
-
-{{%notice warning%}}
-
-**MERK:** for å benytte denne funksjonaliteten må man ha versjon >= 4.15.2 av nugetpakkene `Altinn.App.PlatformServices`, `Altinn.App.Common` og `Altinn.App.Api`.
-
-{{%/notice%}}
-
-Om man setter feltet til `onEntry.show` til `select-instance` vil brukeren bli presentert med en liste av aktive instanser for den valgte avgiver når man navigerer seg til en applikasjon.
-
-### Eksempel
-Følgende konfigurasjon legges til i `applicationmetadata.json` for å sette opp valg av aktive instanser.
-```json {hl_lines=[8,9,10]}
-{
- "id": "ttd/demo-app",
- "org": "ttd",
- "title": {
- "nb": "Starte fra aktiv instans"
- },
- ...
- "onEntry": {
- "show": "select-instance"
- }
-}
-```
-
-For brukere som ikke har noen aktive instanser vil det automatisk bli opprettet en instans.
-Brukere som har aktive instanser vil bli presentert med følgende brukergrensesnitt:
-
-![Brukergrensesnitt for å velge aktiv instans](select-active-instance.png "Brukergrensesnitt for å velge aktiv instans")
-
-## Konfigurer side for instansvalg
-
-{{%notice warning%}}
-**MERK:** For å bruke denne funksjonaliteten, må applikasjonen referere til versjon >= 7.13.0 av nuget-pakkene
-`Altinn.App.core` og `Altinn.App.Api`.
-{{%/notice%}}
-
-Ved hjelp av feltet `onEntry.instanceSelection` kan du tilpasse siden for instansvalg ytterligere. Følgende
-alternativer er tilgjengelige:
-
-- `sortDirection`: Velg mellom `asc` eller `desc` for å sortere instansene stigende eller synkende. Standard er `asc`.
-- `rowsPerPageOptions`: Velg hvilke alternativer brukeren kan velge mellom når han/hun bestemmer hvor mange instanser
-som skal vises per side. Standard er `[10, 25, 50]`.
-- `defaultSelectedOption`: Velg hvilket alternativ som skal være valgt som standard når brukeren åpner siden for
-instansvalg. Verdien må være et tall som brukes som index for å velge en verdi i `rowsPerPageOptions`. Standard er `0`.
-
-### Configuration Example
-
-Følgende konfigurasjon legges til i `applicationmetadata.json` for å konfigurere siden for instansvalg.
-
-```json {hl_lines=[10,11,12,13]}
-{
- "id": "ttd/demo-app",
- "org": "ttd",
- "title": {
- "nb": "Starte fra aktiv instans"
- },
- ...
- "onEntry": {
- "show": "select-instance",
- "instanceSelection": {
- "sortDirection": "asc",
- "rowsPerPageOptions": [10, 25, 50, 100],
- "defaultSelectedOption": 1,
- }
- }
-}
-```
-
-![Konfigurert brukergrensesnitt for valg av aktive instanser](select-active-instance-configured.png "Konfigurert brukergrensesnitt for valg av aktive instanser")
diff --git a/content/app/development/configuration/startup/select-active-instance-configured.png b/content/app/development/configuration/startup/select-active-instance-configured.png
deleted file mode 100644
index 8a2e451313b..00000000000
Binary files a/content/app/development/configuration/startup/select-active-instance-configured.png and /dev/null differ
diff --git a/content/app/development/configuration/startup/select-active-instance.png b/content/app/development/configuration/startup/select-active-instance.png
deleted file mode 100644
index 31f9445451b..00000000000
Binary files a/content/app/development/configuration/startup/select-active-instance.png and /dev/null differ
diff --git a/content/app/development/configuration/stateless/_index.en.md b/content/app/development/configuration/stateless/_index.en.md
deleted file mode 100644
index 5a00fa42986..00000000000
--- a/content/app/development/configuration/stateless/_index.en.md
+++ /dev/null
@@ -1,563 +0,0 @@
----
-title: Stateless application (lookup-service)
-linktitle: Stateless
-description: How to configure behavior at the application startup.
-toc: true
-weight: 500
----
-
-## Introduction to stateless applications
-
-
-A stateless application distinguishes itself from standard applications by not storing any data, neither form data nor metadata about instances of the application.
- The application will also not end up in the user's inbox.
- A stateless application corresponds to an access service in Altinn 2.
-
-Stateless applications work well as access services where an end-user or a system queries a resource or presents data
- from a third party based on who the user is. It is also possible to configure a stateless application to allow anonymous users, that is, users who are not logged in.
-
-## Configuration
-
-{{% notice info %}}
-
-This is brand new functionality. Setup has to be completed manually until further notice.
-
-**Notice:** To make use of this functionality, version >= 4.5.2 of the [nuget-packages](../../../maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` and `Altinn.App.Api` is required.
-
-{{% /notice %}}
-
-You can manage the application's behavior during startup and set it up as a stateless application if needed by configuring its application metadata, which is stored in `applicationmetadata.json`.
-
-Example of configuration:
-
-{{< code-title >}}
-App/config/applicationmetadata.json
-{{< /code-title >}}
-
-```json{hl_lines=[31]}
-{
- "id": "ttd/stateless-app-demo",
- "org": "ttd",
- "title": {
- "nb": "Stateless App Demo"
- },
- "dataTypes": [
- {
- "id": "ref-data-as-pdf",
- "allowedContentTypes": [
- "application/pdf"
- ],
- "maxCount": 0,
- "minCount": 0
- },
- {
- "id": "Stateless-model",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.StatelessV1"
- },
- "taskId": "Task_1",
- "maxCount": 1,
- "minCount": 1
- }
- ],
- ...
- "onEntry": { "show": "stateless" } // add this line
-}
-```
-
-In the `onEntry.show` field, you have the opportunity to specify a layout set that you want to display during application startup.
-
-The layout set itself is defined in the configuration file `App/ui/layout-sets.json`. If the file does not exist, you can create it.
-You can find more information about layout sets [here](/app/development/ux/pages/layout-sets/).
-
-Example of layout set:
-
-{{< code-title >}}
-App/ui/layout-sets.json
-{{< /code-title >}}
-
-```json
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout-sets.schema.v1.json",
- "sets": [
- {
- "id": "stateless",
- "dataType": "Stateless-model"
- }
- ]
-}
-```
-
-In the example above, the layout-set `stateless` is referring to the datamodel `Stateless-model`.
-
- Example of an app structure for an application which is set up in this way:
-
-```text
-├───App
- ├───config
- ├───logic
- ├───models
- │ Stateless-model.cs
- │ Stateless-model.metadata.json
- │ Stateless-model.schema.json
- │ Stateless-model.xsd
- ├───ui
- │ layout-sets.json
- │
- └───stateless
- | RuleConfiguration.json
- │ RuleHandler.js
- │ Settings.json
- │
- └───layouts
- {page}.json
-```
-
-`{page}.json` can be configured the same way as any normal application page, and will support all components with the exception of:
-- File upload
-- Button
-
-The App frontend will read the configuration from `applicationmetadata.json` and recognize that it should not create an instance.
- Instead, it will retrieve the layout files and associated data models and present them to the end user.
-
-### Configuring access without login
-
-{{% notice warning %}}
-Note! Form components that affect process (Button for submission or instantiation) are not supported for anonymous users!
-
-**Note:** To make use of this functionality you must use version >= 5.1.0 of the [nuget-packages](../../../maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` and `Altinn.App.Api`.
-
-{{% /notice %}}
-
-To permit use of an app by a user that is not logged in, you must follow the steps that are described above. You _also_
-have to define the data type which is used by the stateless app to allow anonymous use. This is done by modifying
-the `dataType`-element in `applicationMetadata.json`.
-The data type's `appLogic`-object needs a new setting, `"allowAnonymousOnStateless": true`. See example below:
-
-{{< code-title >}}
-App/config/applicationmetadata.json
-{{< /code-title >}}
-
-```json{hl_lines=[24]}
-{
- "id": "ttd/stateless-app-demo",
- "org": "ttd",
- "title": {
- "nb": "Stateless App Demo"
- },
- "dataTypes": [
- {
- "id": "ref-data-as-pdf",
- "allowedContentTypes": [
- "application/pdf"
- ],
- "maxCount": 0,
- "minCount": 0
- },
- {
- "id": "Stateless-model",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.StatelessV1",
- "allowAnonymousOnStateless": true,
- },
- "taskId": "Task_1",
- "maxCount": 1,
- "minCount": 1
- }
- ],
- ...
- "onEntry": { "show": "stateless" }
-}
-```
-
-## Populating data
-
-When using a stateless data type you will be able to populate the data model in when the app front-end requests the form data.
-
-Data will be populated in two steps during the initial call from the front-end (GET):
-1. [Prefill](../../data/prefill/)
-2. [Data processing](../../logic/dataprocessing/)
-
-The following updates to the same form data (POST) will then run prefill one more time, but the calculation is triggered. This allows manipulating the data based on the user's input even in stateless application.
-
-Example of a calculation which populates the data model mentioned in the example above:
-
-
-```c#
-public async Task ProcessDataRead(Instance instance, Guid? dataId, object data)
-{
- if (data.GetType() == typeof(StatelessV1))
- {
- StatelessV1 form = (StatelessV1) data;
- // Here you can do what you want, for ex. an API-call
- // if your service is supposed to act as an information transparency service
- form.Fornavn = "Test";
- form.Etternavn = "Testesten";
- return true
- }
- return false;
-}
-```
-
-## Authorization with third party solutions
-
-Controlling access for stateless applications can be done with [standard app-authorization](../authorization)
-Where by using Altinn roles you define who has access to the service.
-If you require further securing of your service you can implement logic for authorization of users with third party solutions.
-This can be an API which is exposed in your organization or an open API from a different provider.
-
-In the example below, an API from the Financial Supervisory Authority of Norway is used to determine if a company that is
-represented by a user in Altinn has the necessary licenses to use a service.
-
-![GUI for authorized user](extra-credentials-example-allowed.png "GUI for authorized user")
-
-![GUI for non-authorized user](extra-credentials-example-denied.png "GUI for non-authorized user")
-
-
-The source code for the example application can be found [here](https://altinn.studio/repos/ttd/extra-credentials-demo) (requires account in Altinn Studio).
-
-Further down this page we will use the designation *user* synonymously with an organization represented by a person in Altinn.
-
-1. **Expand the data model with fields for authorization**
-
- In addition to a field for user input and a field to display the result,
- in this example we have a field for holding information about if the user is authenticated
- and a field for holding a dynamic error message.
-
- ```xml
-
-
-
-
-
-
- ```
-
- *Skip to step 4 if the application will only be used via an API.*
-
-2. **Add a field to display error messages in the user interface**
-
- There are three components to the user interface of an application.
- A search field for user input, a text field dedicated to showing a search result and a paragraph which is reserved for error messages.
-
- ![GUI in Altinn Studio](extra-credentials-example-layout.png "GUI in Altinn Studio")
-
- The components are connected to a data model and text resource in the following way in `{page}.json`:
-
- {{< code-title >}}
- App/ui/layouts/{page}.json
- {{< /code-title >}}
-
- ```json
- "layout": [
- {
- "id": "sokeBoks",
- "type": "Input",
- "textResourceBindings": {
- "title": "SearchString"
- },
- "dataModelBindings": {
- "simpleBinding": "searchString"
- },
- "required": false,
- "readOnly": false
- },
- {
- "id": "resultatBoks",
- "type": "TextArea",
- "textResourceBindings": {
- "title": "Result"
- },
- "dataModelBindings": {
- "simpleBinding": "result"
- },
- "required": false,
- "readOnly": true
- },
- {
- "id": "errorBoks",
- "type": "Paragraph",
- "textResourceBindings": {
- "title": "ErrorMessage"
- },
- "required": false,
- "readOnly": true
- }
- ]
- ```
-
-3. **Add dynamic rules to show/hide fields**
-
- We use dynamic rules to show/hide fields depending on the users level of authorization
-
- There has been added a dynamic rule in `RuleHandler.js` which checks if a field in the datamodel has the value `false`.
- Configuration of rules is described more closely [here](../../logic/dynamic/#add-or-edit-functions-for-dynamics).
-
- In `RuleConfiguration.json` you can see how the rule is utilized.
- If the input value from the data model `userAuthorized` is false, the errorBox-component will be made visible,
- while the opposite happens to the search and result fields as those are hidden.
-
- Default behaviour will be the opposite, that search and results are visibile while the error field is hidden.
-
- ```json
- {
- "data": {
- "ruleConnection": {},
- "conditionalRendering": {
- "e2dd8ff0-f8f1-11eb-b2bc-5b40a942c260": {
- "selectedFunction": "isFalse",
- "inputParams": {
- "value": "userAuthorized"
- },
- "selectedAction": "Show",
- "selectedFields": {
- "e2dd68e0-f8f1-11eb-b2bc-5b40a942c260": "errorBoks"
- }
- },
- "e2dd8ff0-f8f1-11eb-b2bc-5b40a942c261": {
- "selectedFunction": "isFalse",
- "inputParams": {
- "value": "userAuthorized"
- },
- "selectedAction": "Hide",
- "selectedFields": {
- "e2dd68e0-f8f1-11eb-b2bc-5b40a942c261": "sokeBoks",
- "e2dd68e0-f8f1-11eb-b2bc-5b40a942c262": "resultatBoks"
- }
- }
- }
- }
- }
- ```
-
-4. **Add text resources**
-
- In addition to the name of the service, three text resources have been added.
-
- The text resource for error messages contains a placeholder for the name of the user.
- The variable `errorMessage` will be populated in the data model when it is registered
- that the user lacks the authorization to access the service.
-
- ```json
- {
- "id": "ErrorMessage",
- "value": "{0} mangler rettigheter til å bruke denne tjenesten.",
- "variables": [
- {
- "key": "errorMessage",
- "dataSource": "dataModel.lookup"
- }
- ]
- },
- {
- "id": "Result",
- "value": "Resultat"
- },
- {
- "id": "SearchString",
- "value": "Legg inn søkeord her:"
- },
- ```
-5. **Implement authorization logic**
-
- All data processing for stateless applications is located in the file `App\logic\DataProcessing\DataProcessingHandler.cs`,
- and it is also where the authorization logic should be placed.
-
- Logic for looking up data and authorizing the user is handled in the method `ProcessDataRead`.
- It is called every time a user opens the application or inputs any data.
-
- ```cs
- public async Task ProcessDataRead(Instance instance, Guid? dataId, object data)
- {
- lookup lookup = (lookup)data;
-
- // Check if user is authorized to use service
- Party party = await _register.GetParty(int.Parse(instance.InstanceOwner.PartyId));
-
- if (string.IsNullOrEmpty(party.OrgNumber) || !await _finanstilsynet.HasReqiuiredLicence(_settings.LicenseCode, party.OrgNumber))
- {
- lookup.userAuthorized = false;
- lookup.errorMessage = $"{party.Name}";
- return true;
- }
-
- // logic for looking up data
- if (!string.IsNullOrEmpty(lookup.searchString))
- {
- lookup.result = $"You typed \"{lookup.searchString}\". This is the result.";
- return true;
- }
-
- return false;
- }
- ```
-
- The method starts with logic for collecting form data for future use in the method.
-
- ```cs
- lookup lookup = (lookup)data
- ```
-
- Then comes the logic for checking if the user is authorized.
-
- ```cs
- // Check if user is authorized to use service
- Party party = await _register.GetParty(int.Parse(instance.InstanceOwner.PartyId))
-
- if (string.IsNullOrEmpty(party.OrgNumber) || !await _finanstilsynet.HasReqiuiredLicence(_settings.LicenseCode, party.OrgNumber))
- {
- lookup.userAuthorized = false;
- lookup.errorMessage = $"{party.Name}";
- return true;
- }
- ```
-
- To know the identity of the user, the identifier `instance.InstanceOwner.PartyId` is used, this is used as an input
- for the method.
- We use Altinns register to collect the party-object which represents the user. It can contain either an organization
- or a person.
-
- ```cs
- Party party = await _register.GetParty(int.Parse(instance.InstanceOwner.PartyId))
- ```
-
- Two checks are done to decide the authorization of a user.
- First it is verified that the party object has a defined organization number,
- if this is not the case and the user is not representing an organization they are not authorized.
-
-The other check calls `_finanstilsynet.HasReqiuiredLicence()`, a method which looks up the Financial Supervisory Authority of Norway's API to decide if an organization has been given a license.
- The implementation of that service is available [here][her](https://altinn.studio/repos/ttd/extra-credentials-demo/src/branch/master/App/services/FinanstilsynetService.cs).
-
- If none of the checks are successful two fields in the data model are populated;
- - an indicator that the user is not authorized
- - an error message, with only the name of the user
-
- And `true` is returned to indicate that the data values have been updated.
-
-
- ```cs
- lookup.userAuthorized = false;
- lookup.errorMessage = $"{party.Name}";
- return true;
- ```
-
- Finally the logic to display the results based on the query string.
-
- ```cs
- // logic for looking up data
- if (!string.IsNullOrEmpty(lookup.searchString))
- {
- lookup.result = $"You typed \"{lookup.searchString}\". This is the result.";
- return true;
- }
-
- return false;
- ```
-
- `lookup.result` is populated with the value from the lookup, in this case we just write the query string back to the user.
- Again, `true` is returned to indicate that a data value has been changed, and `false` if this is not the case.
-## Starting an instance from a stateless form
-
-{{%notice warning%}}
-
-This is brand new functionality. Setup must be completed manually until further notice and will not be supported in Altinn Studio.
-
-**Note:** To make use of this functionality you must use version >= 4.17.2 of the [nuget-packages](../../../maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` og `Altinn.App.Api`.
-
-{{%/notice%}}
-
-In a stateless application you have the opportunity to use the `InstantiationButton` component to start an instance.
-Currently we only support starting an instance from within the same application the stateless form is displayed in. Starting an instance in another application is functionality we will add in the future.
-
-There is an example stateless application where the end user can choose to start an instance in the actual application. It can be used as inspiration for further development. The application with source code can be found [here](https://altinn.studio/repos/ttd/start-from-stateless)
-
-### Instantiation with prefill
-
-An example use case for starting an instance from a stateless application could be an app where the user is presented some given data at first. From this information the user can choose to act on the listed data, and then continue using the service as a normal form.
-
-To achieve this type of flow you are dependent on setting up your application as a stateless application, described under [configuration](#configuration).
-When this has been done, you can expand the stateless view to include `InstantiationButton` which can start a new instance when the user clicks the button.
-Standard behaviour for this button is to submit the entire data model that the user has used as a part of the instantiation under the field `prefill`.
-If one wishes to pick parts of the data model which are connected in the stateless step it will also be possible to add `mapping`to the `InstantiationButton` component. For example:
-
-```json
- {
- "id": "instantiation-button",
- "type": "InstantiationButton",
- "textResourceBindings": {
- "title": "Start instans"
- },
- "mapping": {
- "some.source.field": "name",
- "some.other.field": "id"
- }
- }
-```
-
-When the user then chooses to start an instance the app frontend will gather the fields `some.source.field` and `some.other.field` from the data model in the stateless step and map these fields to `name` and `id` which are sent with the instantiation call for the application.
-Example request which will be sent to the backend which can be mapped to the data model used in the submit part of the application:
-
-```json
-{
- "prefill": {
- "name": "Ola Nordmann",
- "id": "12345"
- },
- ...
-}
-
-```
-
-This prefill value can then be used in the method `DataCreation` in `InstantiationHandler.cs` to map against the fields
-that are needed as a part of the submitting part of the application during instantiation. Example:
-
-```c#
-public async Task DataCreation(Instance instance, object data, Dictionary prefill)
- {
- if (data.GetType() == typeof(MessageV1))
- {
- string name = "";
- string id = "";
- if (prefill.ContainsKey("name")) {
- name = prefill["name"];
- }
- if (prefill.ContainsKey("id")) {
- id = prefill["id"];
- }
- MessageV1 skjema = (MessageV1)data;
- skjema.Sender = name;
- skjema.Reference = id;
- }
- await Task.CompletedTask;
- }
-```
-
-#### Instantiating from a repeating group
-
-If in the stateless step wanted the user to, for example, pick an element from a repeating group to continue on the chosen element, you can set up the `InstantiationButton` component as a part of the repeating group.
-Here you can then configure the instantiation button to map fields from the given index the user chose to start an instance from. This requires setting up mapping fields with an index on the actual group.
-Example:
-
-```json
- {
- "id": "instantiation-button",
- "type": "InstantiationButton",
- "textResourceBindings": {
- "title": "Start ny instans"
- },
- "mapping": {
- "people[{0}].name": "name",
- "people[{0}].age": "age"
- }
- }
-```
-
-In the repeating group `{0}` will be replaced with the actual index of the group the user wishes to start from.
diff --git a/content/app/development/configuration/stateless/_index.nb.md b/content/app/development/configuration/stateless/_index.nb.md
deleted file mode 100644
index 6aa16fe0fad..00000000000
--- a/content/app/development/configuration/stateless/_index.nb.md
+++ /dev/null
@@ -1,563 +0,0 @@
----
-title: Stateless applikasjon (innsynstjeneste)
-linktitle: Stateless
-description: Hvordan konfigurere oppførsel ved applikasjonens oppstart
-toc: true
-weight: 500
----
-
-## Introduksjon til stateless applikasjoner
-
-En stateless, eller tilstandsløs, applikasjon skiller ser fra standard applikasjoner ved at den ikke lagrer noe data,
-hverken skjemadata eller metadata om instanser av applikasjonen. Applikasjonen vil heller ikke havne i meldingsboksen til sluttbruker.
- En tilstandsløs applikasjon tilsvarer en innsynstjeneste i Altinn 2.
-
- Stateless-applikasjoner passer godt som innsynstjenester der en sluttbruker eller et system gjør et oppslag mot en ressurs eller presenterer data fra en tredjepart basert på identiteten til brukeren.
- Det er også mulig å konfigurere en stateless-applikasjon for å tillate anonyme brukere, det vil si brukere som ikke er pålogget.
-
-## Konfigurasjon
-
-{{% notice info %}}
-
-Dette er helt ny funksjonalitet. Oppsett må gjøres manuelt inntil videre.
-
-**MERK:** for å benytte denne funksjonaliteten må man versjon >= 4.5.2 av [nuget-pakkene](../../../maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` og `Altinn.App.Api`.
-
-{{% /notice %}}
-
-Du kan styre applikasjonens oppførsel under oppstart og konfigurere den som en tilstandsløs applikasjon etter behov ved å konfigurere applikasjonsmetadataen, som er lagret i applicationmetadata.json.
-
-Eksempel på konfigurasjon:
-
-{{< code-title >}}
-App/config/applicationmetadata.json
-{{< /code-title >}}
-
-```json{hl_lines=[31]}
-{
- "id": "ttd/stateless-app-demo",
- "org": "ttd",
- "title": {
- "nb": "Stateless App Demo"
- },
- "dataTypes": [
- {
- "id": "ref-data-as-pdf",
- "allowedContentTypes": [
- "application/pdf"
- ],
- "maxCount": 0,
- "minCount": 0
- },
- {
- "id": "Stateless-model",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.StatelessV1"
- },
- "taskId": "Task_1",
- "maxCount": 1,
- "minCount": 1
- }
- ],
- ...
- "onEntry": { "show": "stateless" } // legg til denne linjen
-}
-```
-
-I feltet `onEntry.show` har du muligheten til å spesifisere et layout-sett som du ønsker å vise under oppstart av applikasjonen.
-
-Selve layout-settet er definert i konfigurasjonsfilen `App/ui/layout-sets.json`.
- Hvis filen ikke eksisterer, kan du opprette den.
- Du kan finne mer informasjon om layout-sett [her](/nb/app/development/ux/pages/layout-sets/).
-
-Eksempel på layout-sett:
-
-{{< code-title >}}
-App/ui/layout-sets.json
-{{< /code-title >}}
-
-```json
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout-sets.schema.v1.json",
- "sets": [
- {
- "id": "stateless",
- "dataType": "Stateless-model"
- }
- ]
-}
-```
-
-I eksempelet over referer layout-settet `stateless` til datamodellen `Stateless-model`.
-
-Eksempel app-struktur for en applikasjon som er satt opp på denne måten:
-
-```text
-├───App
- ├───config
- ├───logic
- ├───models
- │ Stateless-model.cs
- │ Stateless-model.metadata.json
- │ Stateless-model.schema.json
- │ Stateless-model.xsd
- ├───ui
- │ layout-sets.json
- │
- └───stateless
- | RuleConfiguration.json
- │ RuleHandler.js
- │ Settings.json
- │
- └───layouts
- {page}.json
-```
-
-`{page}.json` vil kunne settes opp på samme måte som en vanlig applikasjonsside og vil støtte samtlige komponenter med unntak av:
-- Filopplaster
-- Knapp
-
-Appens frontend vil lese konfigurasjonen fra `applicationmetadata.json` og forstå at den ikke skal opprette en instans.
- I stedet vil den hente layout-filene og tilhørende datamodeller og presentere dem for sluttbrukeren.
-
-### Konfigurere tilgang uten innlogging
-
-{{%notice warning%}}
-OBS! Skjemakomponenter som påvirker prosess (knapp for innsending eller instansiering) er ikke støttet for anonyme brukere!
-
-**MERK:** for å benytte denne funksjonaliteten må man bruke versjon >= 5.1.0 av [nuget-pakkene](../../../maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` og `Altinn.App.Api`.
-
-{{%/notice%}}
-
-For å tillate bruk av appen for bruker som ikke er innlogget, må man følge stegene som beskrevet over. _I tillegg_ må man definere at den datatypen som er satt opp
-til å brukes for stateless visningen tillater anonym (ikke innlogget) bruk. Dette gjøres ved å modifisere det aktuelle `dataType`-elementet i `applicationMetadata.json`.
-Datatypen sitt `appLogic`-objekt må få en ny innstilling, `"allowAnonymousOnStateless": true`. Se eksempel under:
-
-
-{{< code-title >}}
-App/config/applicationmetadata.json
-{{< /code-title >}}
-
-```json{hl_lines=[24]}
-{
- "id": "ttd/stateless-app-demo",
- "org": "ttd",
- "title": {
- "nb": "Stateless App Demo"
- },
- "dataTypes": [
- {
- "id": "ref-data-as-pdf",
- "allowedContentTypes": [
- "application/pdf"
- ],
- "maxCount": 0,
- "minCount": 0
- },
- {
- "id": "Stateless-model",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.StatelessV1",
- "allowAnonymousOnStateless": true,
- },
- "taskId": "Task_1",
- "maxCount": 1,
- "minCount": 1
- }
- ],
- ...
- "onEntry": { "show": "stateless" }
-}
-```
-
-## Datapopulering
-
-Når man benytter en stateless datatype så vil man kunne populere datamodellen i det app-frontend spør om skjemadataen.
-
-Datapopuleringen skjer i to steg på det initielle kallet fra frontend (GET):
-1. [Prefill](../../data/prefill/)
-2. [Dataprossesering](../../logic/dataprocessing/)
-
-På påfølgende oppdateringer på samme skjemadata (POST) så vil man ikke kjøre prefill en gang til, men kalkuleringen trigges. Dette muliggjør manipulering av dataen basert på brukerens input selv i en stateless tilstand.
-
-Eksempel på en kalkulering som populerer datamodellen nevnt i eksempelet over:
-
-```c#
-public async Task ProcessDataRead(Instance instance, Guid? dataId, object data)
-{
- if (data.GetType() == typeof(StatelessV1))
- {
- StatelessV1 form = (StatelessV1) data;
- // Her kan du gjøre det du ønsker, f.eks et API-kall
- // om tjenesten skal oppføre seg som en innsynstjeneste.
- form.Fornavn = "Test";
- form.Etternavn = "Testesten";
- return true
- }
- return false;
-}
-```
-
-## Autorisasjon med tredjepartsløsninger
-
-Tilgangsstyring for stateless applikasjoner kan løses med [standard app-autorisasjon](../authorization)
-der man hved hjelp av Altinn-roller definerer hvem som har tilgang til å benytte tjenesten.
-Dersom man har behov for ytteligere sikring av tjenesten kan man implementere logikk for autorisasjon av brukere med tredjepartløsninger.
-Dette kan være API-er som er eksponert innenfor egen virksomhet eller åpne API fra andre tilbydere.
-
-I eksempelet nedenfor benyttes Finanstilsynets API til å fastslå om virksomheten som repesenteres av en bruker i Altinn
-har tilstrekkelige lisenser til å benytte tjenesten.
-
-![GUI for autorisert bruker](extra-credentials-example-allowed.png "GUI for autorisert bruker")
-
-![GUI for ikke-autorisert bruker](extra-credentials-example-denied.png "GUI for ikke-autorisert bruker")
-
-
-Kildekoden til applikasjonen som eksempelet er basert på finnes [her](https://altinn.studio/repos/ttd/extra-credentials-demo) (krever bruker i Altinn Studio).
-
-Videre i eksempelet vil betegnelsen *bruker* være synonymt med en virksomhet representert av en person i Altinn.
-
-1. **Utvid datamodellen med felter for autorisasjon**
-
- I tillegg til et felt for å ta input fra bruker og et felt for å vise fram resultatet,
- har vi i dette eksempelet et felt for å holde på infomasjon om hvorvidt brukeren er autentisert
- og et felt for å holde på en dynamisk feilmelding.
-
- ```xml
-
-
-
-
-
-
- ```
-
- *Hopp til steg 4 dersom applikasjonen kun skal benyttes via API.*
-
-2. **Legg til felt for å vise feilmelding i brukergrensesnittet**
-
- I brukergrensesnittet til applikasjonen er det tre komponenter.
- Et søkefelt for brukerinput, et tekstfelt dedikert til å vise fram søkeresultatet og en paragraf som er reservert for feilmeldinger.
-
- ![GUI i Altinn Studio](extra-credentials-example-layout.png "GUI i Altinn Studio")
-
- Komponentene er koblet til datamodell og tekstressurs på følgende måte i `{page}.json`:
-
-
- {{< code-title >}}
- App/ui/layouts/{page}.json
- {{< /code-title >}}
-
- ```json
- "layout": [
- {
- "id": "sokeBoks",
- "type": "Input",
- "textResourceBindings": {
- "title": "SearchString"
- },
- "dataModelBindings": {
- "simpleBinding": "searchString"
- },
- "required": false,
- "readOnly": false
- },
- {
- "id": "resultatBoks",
- "type": "TextArea",
- "textResourceBindings": {
- "title": "Result"
- },
- "dataModelBindings": {
- "simpleBinding": "result"
- },
- "required": false,
- "readOnly": true
- },
- {
- "id": "errorBoks",
- "type": "Paragraph",
- "textResourceBindings": {
- "title": "ErrorMessage"
- },
- "required": false,
- "readOnly": true
- }
- ]
- ```
-
-3. **Legg inn dynamikkregler for å vise/skjule felter**
-
- Vi bruker dynamikkregler til å vise/skjule felter avhengig av om en bruker en autorisert eller ikke.
-
- Det er lagt inn en dynamikkregel i `RuleHandler.js` som sjekker om et felt i datamodellen har verdien `false`.
- Konfigurasjon av regler er beskrevet nærmere [her](../../logic/dynamic/#legg-tilrediger-funksjoner-for-beregninger-eller-visskjul).
-
- I `RuleConfiguration.json` ser man hvordan regelen benyttes.
- Dersom inputverdien fra datamodellen `userAuthorized` er false, så vises errorBoks-komponenten,
- mens det motsatte skjer med søke- og resultatfeltene, disse skjules.
-
- Default oppførsel vil være det motsatte, altså at søk og resultat er synlig, mens error feltet er skjult.
-
- ```json
- {
- "data": {
- "ruleConnection": {},
- "conditionalRendering": {
- "e2dd8ff0-f8f1-11eb-b2bc-5b40a942c260": {
- "selectedFunction": "isFalse",
- "inputParams": {
- "value": "userAuthorized"
- },
- "selectedAction": "Show",
- "selectedFields": {
- "e2dd68e0-f8f1-11eb-b2bc-5b40a942c260": "errorBoks"
- }
- },
- "e2dd8ff0-f8f1-11eb-b2bc-5b40a942c261": {
- "selectedFunction": "isFalse",
- "inputParams": {
- "value": "userAuthorized"
- },
- "selectedAction": "Hide",
- "selectedFields": {
- "e2dd68e0-f8f1-11eb-b2bc-5b40a942c261": "sokeBoks",
- "e2dd68e0-f8f1-11eb-b2bc-5b40a942c262": "resultatBoks"
- }
- }
- }
- }
- }
- ```
-
-4. **Legg til tekstressurser**
-
- I tillegg til navnet på tjenesten er det lagt inn tre tekstressurser.
-
- Tekstressursen for feilmelding inneholder en placeholder for navnet på brukeren.
- Variabelen `errorMessage` vil populeres i datamodellen når det registreres at en bruker ikke er autorisert til å bruke tjenesten.
-
- ```json
- {
- "id": "ErrorMessage",
- "value": "{0} mangler rettigheter til å bruke denne tjenesten.",
- "variables": [
- {
- "key": "errorMessage",
- "dataSource": "dataModel.lookup"
- }
- ]
- },
- {
- "id": "Result",
- "value": "Resultat"
- },
- {
- "id": "SearchString",
- "value": "Legg inn søkeord her:"
- },
- ```
-5. **Implementér autorisasjonslogikk**
-
- Alt av dataprosessering for stateless applikasjoner ligger i filen `App\logic\DataProcessing\DataProcessingHandler.cs`,
- og det er her autorisasjonslogikken skal plasseres.
-
- Logikk for å slå opp data og autorisere brukeren ligger i metoden `ProcessDataRead`.
- Denne kalles hver gang en bruker åpner applikasjonen eller sendes inn noe input data.
-
- ```cs
- public async Task ProcessDataRead(Instance instance, Guid? dataId, object data)
- {
- lookup lookup = (lookup)data;
-
- // Check if user is authorized to use service
- Party party = await _register.GetParty(int.Parse(instance.InstanceOwner.PartyId));
-
- if (string.IsNullOrEmpty(party.OrgNumber) || !await _finanstilsynet.HasReqiuiredLicence(_settings.LicenseCode, party.OrgNumber))
- {
- lookup.userAuthorized = false;
- lookup.errorMessage = $"{party.Name}";
- return true;
- }
-
- // logic for looking up data
- if (!string.IsNullOrEmpty(lookup.searchString))
- {
- lookup.result = $"You typed \"{lookup.searchString}\". This is the result.";
- return true;
- }
-
- return false;
- }
- ```
-
- Metoden starter med logikk for å hente ut skjemadataen slik at denne kan benyttes
- videre i metoden.
-
- ```cs
- lookup lookup = (lookup)data
- ```
-
- Videre kommer logikken for å sjekke om brukeren er autorisert.
-
- ```cs
- // Check if user is authorized to use service
- Party party = await _register.GetParty(int.Parse(instance.InstanceOwner.PartyId))
-
- if (string.IsNullOrEmpty(party.OrgNumber) || !await _finanstilsynet.HasReqiuiredLicence(_settings.LicenseCode, party.OrgNumber))
- {
- lookup.userAuthorized = false;
- lookup.errorMessage = $"{party.Name}";
- return true;
- }
- ```
-
- For å vite hvem brukeren er, benyttes identifikatoren `instance.InstanceOwner.PartyId`, denne får vi som input til metoden.
- Vi slår opp i Altinn sitt register for å hente ut party-objektet som representerer brukeren. Dette kan inneholde en organisasjon eller en person.
-
- ```cs
- Party party = await _register.GetParty(int.Parse(instance.InstanceOwner.PartyId))
- ```
-
- Det gjøres to sjekker for å avgjøre om en bruker er autorisert eller ikke.
- Først verifiseres det at party-objektet har definert et organisasjonsnummer,
- dersom dette ikke er tilfellet er brukeren en person, og dermed ikke autorisert.
-
- Den andre sjekken kaller `_finanstilsynet.HasReqiuiredLicence()`, en metode som slår opp i finanstilsynets API for å avgjøre om en organisasjonen har en gitt lisens.
- Implementasjonen av servicen er tilgjengelig [her](https://altinn.studio/repos/ttd/extra-credentials-demo/src/branch/master/App/services/FinanstilsynetService.cs).
-
- Dersom ingen av sjekkene er vellykkede populeres to felter i datamodellen;
- - en indikator på at brukeren ikke er autorisert
- - en feilmelding, her kun navnet til brukeren
-
- og `true` returneres for å indikere at dataverdier har blitt oppdatert.
-
-
- ```cs
- lookup.userAuthorized = false;
- lookup.errorMessage = $"{party.Name}";
- return true;
- ```
-
- Helt til slutt kommer logikken for å vise fram et resultat basert på søkestrengen.
-
- ```cs
- // logic for looking up data
- if (!string.IsNullOrEmpty(lookup.searchString))
- {
- lookup.result = $"You typed \"{lookup.searchString}\". This is the result.";
- return true;
- }
-
- return false;
- ```
-
- `lookup.result` populeres med verdien av oppslaget, i dette tilfellet skriver vi bare søkestrenger tilbake til bruker.
- Igjen returneres `true` for å indikere at en dataverdi er blitt endret, og `false` dersom dette ikke er tilfellet.
-
-## Starte instans fra et stateless skjema
-
-{{%notice warning%}}
-
-Dette er helt ny funksjonalitet. Oppsett må gjøres manuelt inntil videre og vil ikke være støttet i Altinn Studio.
-
-**MERK:** for å benytte denne funksjonaliteten må man versjon >= 4.17.2 av [nuget-pakkene](../../../maintainance/dependencies#nuget) `Altinn.App.PlatformServices`, `Altinn.App.Common` og `Altinn.App.Api`.
-
-{{%/notice%}}
-
-Fra en tilstandsløs applikasjon har man mulighet til å benytte `InstantiationButton`-komponenten til å starte en instans.
-Enn så lenge støtter vi kun å starte en instans innad i samme applikasjonen som stateless skjema vises i. Det å starte en instans i en annen applikasjon er funksjonalitet som kommer.
-
-Det er laget en eksempel-applikasjon som er satt opp som en innsynstjeneste hvor sluttbruker kan velge å starte en instans på den aktuelle applikasjonen.
- Denne kan brukes til inspirasjon for videre utvikling.
- Applikasjonen med kildekode finnes [her](https://altinn.studio/repos/ttd/start-from-stateless).
-
-### Instansiere med prefill
-
-Et bruksområde for det å starte en instans fra et stateless view kan være at man først ønsker at appen skal oppføre seg som en innsynstjeneste hvor brukeren blir presentert for gitte data som er aktuell. Fra denne informasjonen kan brukeren velge å agere videre på dataen som listes opp, og da er man over på en vanlig innsendingstjeneste.
-
-For å få til en slik flyt er man først avhengig av å sette opp applikasjonen som en stateless appliksjon som står beskrevet under [konfigurasjon.](#konfigurasjon)
-Når dette er gjort kan man utvide stateless viewet til å inkludere `InstantiationButton` som kan vil starte en ny instans i det brukeren klikker på knappen.
-Standard oppførsel for denne knappen er å sende inn hele datamodellen som brukeren har benyttet inn som en del av instansieringn under feltet `prefill`.
-Om man ønsker å velge ut deler av datamodellen som er benyttet i det tilstandsløse steget vil det også være mulig ved å legge til `mapping` på `InstantiationButton`-komponenten. F.eks
-
-```json
- {
- "id": "instantiation-button",
- "type": "InstantiationButton",
- "textResourceBindings": {
- "title": "Start instans"
- },
- "mapping": {
- "some.source.field": "name",
- "some.other.field": "id"
- }
- }
-```
-
-Når brukeren da velger å starte en instans så vil app-frontend hente ut feltene `some.source.field` og `some.other.field` fra datamodellen i det tilstandsløse steget og mappe disse mot feltene `name` og `id` som sendes med i instansieringskallet for applikasjonen.
-Eksempel request som vil gå mot backend som man kan mappe over datamodellen man benytter i datamodellen man benytter i innsendingsdelen av applikasjonen:
-
-```json
-{
- "prefill": {
- "name": "Ola Nordmann",
- "id": "12345"
- },
- ...
-}
-
-```
-
-Denne prefill verdien kan man så benytte seg av i metoden `DataCreation` i `InstantiationHandler.cs` for å mappe mot de feltene man trenger som en del av innsendsingsdelen av applikasjonen under instansieringen. Eksempel:
-
-```c#
-public async Task DataCreation(Instance instance, object data, Dictionary prefill)
- {
- if (data.GetType() == typeof(MessageV1))
- {
- string name = "";
- string id = "";
- if (prefill.ContainsKey("name")) {
- name = prefill["name"];
- }
- if (prefill.ContainsKey("id")) {
- id = prefill["id"];
- }
- MessageV1 skjema = (MessageV1)data;
- skjema.Sender = name;
- skjema.Reference = id;
- }
- await Task.CompletedTask;
- }
-```
-
-#### Instansiere fra en repeterende gruppe
-
-Om man i det tilstandsløse steget ønsker at brukeren f.eks velger et element fra en repeterende gruppe å jobber videre på et gitt element kan man sette opp `InstantiationButton`-komponenten som en del av den repeterende gruppen.
-Her kan man så konfigurere instansierings-knappen til å mappe felter fra den gitte indeksen brukeren velger å starte en instans fra. Dette krever at man setter opp mapping-feltene med en indeks på den aktuelle gruppen.
-Eksempel:
-
-```json
- {
- "id": "instantiation-button",
- "type": "InstantiationButton",
- "textResourceBindings": {
- "title": "Start ny instans"
- },
- "mapping": {
- "people[{0}].name": "name",
- "people[{0}].age": "age"
- }
- }
-```
-
-I den repeterende gruppen vil så `{0}` bli erstattet med den aktuelle indeksen på gruppen brukeren ønsker å starte fra.
diff --git a/content/app/development/configuration/stateless/extra-credentials-example-allowed.png b/content/app/development/configuration/stateless/extra-credentials-example-allowed.png
deleted file mode 100644
index 489a30fb040..00000000000
Binary files a/content/app/development/configuration/stateless/extra-credentials-example-allowed.png and /dev/null differ
diff --git a/content/app/development/configuration/stateless/extra-credentials-example-denied.png b/content/app/development/configuration/stateless/extra-credentials-example-denied.png
deleted file mode 100644
index 460cda5f1ed..00000000000
Binary files a/content/app/development/configuration/stateless/extra-credentials-example-denied.png and /dev/null differ
diff --git a/content/app/development/configuration/stateless/extra-credentials-example-layout.png b/content/app/development/configuration/stateless/extra-credentials-example-layout.png
deleted file mode 100644
index 9af83e060c1..00000000000
Binary files a/content/app/development/configuration/stateless/extra-credentials-example-layout.png and /dev/null differ
diff --git a/content/app/development/data/_index.en.md b/content/app/development/data/_index.en.md
deleted file mode 100644
index 59eceb73bdf..00000000000
--- a/content/app/development/data/_index.en.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: Data
-linktitle: Data
-description: Data model configuration, pre-filling and other items related to data in an app.
-weight: 10
----
-
-{{}}
diff --git a/content/app/development/data/_index.nb.md b/content/app/development/data/_index.nb.md
deleted file mode 100644
index 47d591ad16c..00000000000
--- a/content/app/development/data/_index.nb.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: Data
-linktitle: Data
-description: Konfigurering av datamodell, preutfylling og andre ting relatert til data i en app.
-weight: 10
----
-
-{{}}
diff --git a/content/app/development/data/attachments/_index.en.md b/content/app/development/data/attachments/_index.en.md
deleted file mode 100644
index 344722fbf6b..00000000000
--- a/content/app/development/data/attachments/_index.en.md
+++ /dev/null
@@ -1,144 +0,0 @@
----
-title: Attachments
-description: In an application one can facilitate uploading file attachments both via GUI and API.
-toc: true
-weight: 400
----
-
-## Methods for uploading file attachments
-
-In an Altinn application there are two options for uploading file attachments:
-
-- File upload component in a form
-- API-call to app backend
-
-The former will be a good alternative for all data where it is expected that the user will upload files through the user interface in the app.
-The latter is recommended for use if it is only expected that systems will upload the attachment.
-There is no limit to how many attachments that can be included in one application
-and both upload methods can be used within the same application.
-
-Below is a simple description of how you can accommodate your application to be able to receive attachments.
-
-## Submitting file attachments with file upload component in a form
-
-When building your form in Altinn Studio, a file upload component is available.
-It is possible to upload multiple file attachments on one single component, and how many file upload components
-you use in your application will be determined by the characteristics of the documents you expect to be uploaded
-and any restrictions you need to impose.
-(see [configuration of file attachments](#submission-of-attachments-with-api-call) for more information on this).
-
-Note: It will also be possible to upload file attachments of the type defined in the attachment component through API.
-
-![The file upload component](vedleggskom.png "The file upload component")
-
-The image above shows the file upload component in Altinn Studio.
-Part of the configuration for the uploaded attachments can be set up here.
-
-1. Custom file types can be specified if you want to limit the file types that can be submitted.
-In this case, a user will be prevented from uploading if the file type is not in the approved list.
-2. The minimum/maximum amount of file attachments can be specified if you want a specific amount of attachments uploaded
- through the component.
- By setting the value of _minst antall filvedlegg_ to '0' it will not be required to upload a file.
-3. The maximum file size is specified in _MB_.
-
-Additional configurations that can be set for attachments include: allowed contributors and description.
-This is configured in _applicationMetadata.json_ which is placed under App/config in the application repo.
-
-### File upload component with tagging
-
-There is also a separate component where the user tags the file using a dropdown list.
-This is configured pretty similarily to the normal file upload component, with the addition of a code list ID and the
-name
-you want the tag to have.
-
-![The file upload component with tagging](vedleggsmerkekom.png "The file upload component with tagging")
-
-
-Below you can see it in use
-
-![The file upload component with tagging example](vedleggsmerkekomeks.png "The file upload with tagging example")
-
-### File upload component with delete warning
-Determines whether a warning panel will open when the user presses the “Delete” button. The default behaviour if the parameter is not set, is for the warning panel not to be displayed.
-
-```json
-{
- "id": "attest",
- "type": "FileUpload",
- ...
- "alertOnDelete": true
-}
-```
-
-## Submission of attachments with API-call
-
-To accommodate being able to submit attachments without this being supported in GUI,
-you will need to add a [datatype object](/technology/solutions/altinn-platform/storage/#datatype)
-in the _applicationMetadata.json_ (the file is under App/config in the application repo).
-It will then only be possible to submit attachments of this type through API-calls.
-For a more detailed description of the available fields, see
-[configuration of attachments](#configuration-of-attachments)
-
-## Configuration of attachments
-
-In _applicationMetadata.json_ (placed in App/config in the application repo) you will find a property called 'dataTypes'.
-Configuration of all data types supported in the application can be found here,
-both form data (app model data) and file attachments. The field _appLogic_, that can also be found among some of the objects
-in the list, should only be used for form data.
-
-Below there are two examples of `dataTypes`-instances from a deployed application.
-
-```json
- "dataTypes": [
- {
- "id": "53a50f0d-2345-448d-9fba-f18e6bbe71f8",
- "taskId": "Task_1",
- "maxSize": 25,
- "maxCount": 1,
- "minCount": 1,
- "allowedContentTypes":["application/pdf"]
- },
- {
- "id": "attest",
- "taskId": "Task_1",
- "maxSize": 25,
- "maxCount": 1,
- "minCount": 0,
- "allowedContributers": ["org:nav", "orgNo:XXXXXXXXXX"],
- "grouping": "Attester",
- }
- ]
-```
-
-- **Id** on the attachment type
-This will be set as a GUID if you use an attachment component from Altinn Studio like the one you can find in the first element in the dataTypes list.
-If you want to change the value to a more sensible name then you should note that this change
-must be done two places: _applicationMetadata.json_ and _FormLayout.json_. (Only relevant if you added a file upload component to the GUI)
-
-- **taskID** denotes which step in the process it is expected that this attachment is uploaded to.
-This value must be identical to one of the tasks in _process.bpmn_.
-
-- **maxSize** denotes the maximum allowed size of the attachment.
-
-- **maxCount** denotes the upper limit for how many attachments of this type that are to be uploaded per instance.
-
-- **minCount** denotes the lower limit for how many attachments of this type that are to be uploaded per instance.
- If the value is 0 then it is not required to upload a file attachment of this type.
-
-- **allowedContributors** specifies who is allowed to create and/or modify file attachments of this type.
-This is specified on the format `{key}:{value}`.
-Allowed keys include: 'org'; three letter abbreviation for organization and *orgNo'; organization number.
-It is as of today not possible to specify an organization that is not registered as a service owner.
-
-- **allowedContentTypes** specifies which file attachment types that are allowed.
- The most frequently used include: application/pdf, text/xml, image/jpeg. If you do not want to set a limit to the type
- of attachments, you will not need to define this parameter.
- Read more on mime
- types [here](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types).
-
-- **grouping** denotes the group that the file attachments should be grouped according to.
- This is an optional attribute, where file attachments with the same grouping will be sorted into the same list.
- Grouping can be both a string (e.g. "Certificates") or a text key if you wish to configure multiple languages (e.g. "
- form.attachmentgrouping"). Here is an example where the grouping "Demogruppe" is set on an file attachment type:
-
-![Screenshot of grouping example](attachment-grouping-demo.png "Grouping example")
\ No newline at end of file
diff --git a/content/app/development/data/attachments/_index.nb.md b/content/app/development/data/attachments/_index.nb.md
deleted file mode 100644
index 176fa68aeff..00000000000
--- a/content/app/development/data/attachments/_index.nb.md
+++ /dev/null
@@ -1,138 +0,0 @@
----
-title: Vedlegg
-description: I en applikasjon kan man legge til rette for opplasting av filvedlegg både via GUI og API.
-toc: true
-weight: 400
----
-
-## Metoder for opplasting av vedlegg
-
-I en Altinn app har man to alternativer for opplasting av vedlegg:
-
-- vedleggskomponent i skjema
-- API-kall mot app backend
-
-Førstnevnte vil være et godt alternativ for all data der det er forventet at en sluttbruker vil laste opp via brukergrensesnitt i skjema.
-Sistnevnte anbefales brukt dersom det kun er forventet at systemer skal laste opp vedlegget.
-Det er ingen begrensning på hvor mange vedlegg som kan inkluderes i en applikasjon
-og begge opplastingsmetoder kan brukes innad i samme applikasjon.
-
-Nedenfor følger en enkel beskrivelse av hvordan du kan legge til rette for at applikasjonen din kan ta imot vedlegg.
-
-## Innsending av vedlegg med vedleggskomponent i skjema
-
-Når man setter sammen skjemaet sitt i Altinn Studio har man en vedleggskomponent tilgjengelig.
-Det er mulig å laste opp flere vedlegg på en enkelt komponent, og hvor mange vedleggskomponenter
-du benytter i din applikasjon vil avgjøres av egenskapene til dokumentene du forventer at skal lastes opp
-og eventuelle begrensninger du selv ønsker å sette
-(se [konfigurasjon av vedlegg](#innsending-av-vedlegg-med-api-kall) for mer informasjon om dette).
-
-NB! Det vil også være mulig å laste opp vedlegg av typen definert i vedleggkomponenten via API.
-
-![Vedleggskomponenten](vedleggskom.png "Vedleggskomponenten")
-
-Bildet over viser vedleggskomponenten i Altinn Studio.
-Det er mulig å sette en del av konfigurasjonenen for vedleggene som lastes opp alledere her.
-
-1. Egendefinerte filtyper kan spesifiseres dersom man vil begrense filtypene som kan sendes inn.
-En bruker vil i så fall hindres under opplastning dersom filtypen ikke er blant den godkjente listen.
-2. Minst/maks antall filvedlegg kan spesifiseres dersom man ønsker et bestemt antall vedlegg lastet opp via komponenten.
-Ved å sette '0' på _minst antall filvedlegg_ vil det ikke være påkrevd å laste opp en fil.
-3. Maks filstørrelse spesifiseres i _MB_.
-
-Ytterligere konfigurasjoner som kan settes for vedlegg inkluderer: tillatte bidragsytere og beskrivelse.
-Dette gjøres i _applicationMetadata.json_ som ligger under App/config i applikasjonsrepoet.
-
-### Vedleggskomponent med merking
-Det finnes også en egen komponent der man får brukeren til å merke filen med hjelp av en nedtrekksliste.
-Dette settes opp ganske likt som med den vanlige filopplastingskomponenten, med tillegget av en kodeliste-ID og navnet
-man vil gi merkingen.
-
-![Vedleggskomponenten med merking](vedleggsmerkekom.png "Vedleggskomponenten med merking")
-
-
-Her under kan du se den i bruk
-
-![Vedleggskomponenten med merking eksempelvisning](vedleggsmerkekomeks.png "Vedleggskomponenten med merking eksempel")
-
-
-### Vedleggskomponent med varsel ved sletting
-Bestemmer om en varslingspanel skal åpnes når brukeren trykker på "Slett"-knappen. Standard oppførsel hvis parameteren ikke er satt, er at varslingspanelet ikke vises.
-
-```json
-{
- "id": "attest",
- "type": "FileUpload",
- ...
- "alertOnDelete": true
-}
-```
-
-## Innsending av vedlegg med API-kall
-
-For å legge til rette for å kunne sende inn vedlegg uten å ha støtte for dette i GUI
-må man legge inn et [datatype-objekt](/technology/solutions/altinn-platform/storage/#datatype)
-i _applicationMetadata.json_ (filen ligger under App/config i applikasjonsrepoet).
-Det vil da kun være mulig å sende inn vedlegg av denne typen via API-kall.
-For en nærmere beskrivelse av de tilgjengelige feltene se
-[konfigurasjon av vedlegg](#innsending-av-vedlegg-med-api-kall).
-
-## Konfigurasjon for vedlegg
-
-I _applicationMetadata.json_ (ligger under App/config i applikasjonsrepoet) vil man finne en property som heter `dataTypes`.
-Her er ligger konfigurasjonen for alle datatyper knyttet til applikasjonen,
-både skjemadata (app model data) og vedlegg. Feltet _appLogic_ som man også vil se blant noen av objektene
-i listen skal kun brukes for skjemadata.
-
-Nedenfor er det to eksempler på `dataTypes`-instanser i en applikasjon fra en deployet applikasjon.
-
-```json
- "dataTypes": [
- {
- "id": "53a50f0d-2345-448d-9fba-f18e6bbe71f8",
- "taskId": "Task_1",
- "maxSize": 25,
- "maxCount": 1,
- "minCount": 1,
- "allowedContentTypes":["application/pdf"]
- },
- {
- "id": "attest",
- "taskId": "Task_1",
- "maxSize": 25,
- "maxCount": 1,
- "minCount": 0,
- "allowedContributers": ["org:nav", "orgNo:XXXXXXXXXX"],
- "grouping": "Attester",
- }
- ]
-```
-
-- **Id** på vedleggstypen.
-Denne vil settes som en GUID dersom man bruker vedleggskomponent fra Altinn Studio slik man ser i det første elementet i dataTypes-listen.
-Skulle det være ønskelig å endre verdien til et mer fornuftig navn må man også være obs på at denne endringen
-må gjøres to steder: _applicationMetadata.json_ og _FormLayout.json_. (Kun relevant dersom man bruker filopplaster i GUI)
-
-- **taskId** betegner hvilket steg i prosessen det er forventet at dette vedlegget skal lastes opp på.
-Denne verdien må tilsvare en id på en av taskene i _process.bpmn_.
-
-- **maxSize** betegner maks tillat størrelse på vedlegget.
-
-- **maxCount** betegner en øvre grensen for hvor mange vedlegg av denne typen som skal lastet opp i tilknytning til en instans.
-
-- **minCount** betegner en nedre grensen for hvor mange vedlegg av denne typen som skal lastet opp i tilknytning til en instans.
- Dersom verdien er 0 er det ikke påkrevt å laste opp vedlegg av denne typen.
-
-- **allowedContributers** spesifiserer hvem som får lov til å lage og/eller endre vedlegg av denne typen.
-Dette spesifiseres på formatet `{nøkkelord}:{verdi}`.
-Tillatte nøkkelord inkluderer: 'org'; trebokstavsforkortelse på organisasjon og 'orgNo'; organisasjonsnummer.
-Det er per nå ikke mulig å spesifisere en organisasjon som ikke er registrert som tjenesteeier.
-
-- **allowedContentTypes** spefisiserer hvilke vedleggstyper man tillater.
-De hyppigst brukte inkluderer: application/pdf, text/xml, image/jpeg. Dersom man ikke ønsker å sette begrensning på typen vedlegg trenger man ikke definere denne parameteren.
-Les mer om mime types [her](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types).
-
-- **grouping** betegner gruppen som vedleggene i av denne typen skal grupperes etter.
-Dette er en valgfri egenskap, hvor vedlegg med samme grouping vil havne i samme liste. Grouping kan både være en streng (f.eks "Attester") eller en tekstnøkkel om man ønsker å støtte flere språk (f.eks "skjema.vedleggsgruppering). Her er et eksempel hvor grouping "Demogruppe" satt på en vedleggstype:
-
-![Skjermdump av grupperingseksempel](attachment-grouping-demo.png "Grupperingseksempel")
\ No newline at end of file
diff --git a/content/app/development/data/attachments/attachment-grouping-demo.png b/content/app/development/data/attachments/attachment-grouping-demo.png
deleted file mode 100644
index cbc92b32cac..00000000000
Binary files a/content/app/development/data/attachments/attachment-grouping-demo.png and /dev/null differ
diff --git a/content/app/development/data/attachments/vedleggskom.png b/content/app/development/data/attachments/vedleggskom.png
deleted file mode 100644
index cdff505413d..00000000000
Binary files a/content/app/development/data/attachments/vedleggskom.png and /dev/null differ
diff --git a/content/app/development/data/attachments/vedleggsmerkekom.png b/content/app/development/data/attachments/vedleggsmerkekom.png
deleted file mode 100644
index 19b5e7c5cdf..00000000000
Binary files a/content/app/development/data/attachments/vedleggsmerkekom.png and /dev/null differ
diff --git a/content/app/development/data/attachments/vedleggsmerkekomeks.png b/content/app/development/data/attachments/vedleggsmerkekomeks.png
deleted file mode 100644
index 9ae471aedb5..00000000000
Binary files a/content/app/development/data/attachments/vedleggsmerkekomeks.png and /dev/null differ
diff --git a/content/app/development/data/data-modeling/_index.en.md b/content/app/development/data/data-modeling/_index.en.md
deleted file mode 100644
index c32c636a6a7..00000000000
--- a/content/app/development/data/data-modeling/_index.en.md
+++ /dev/null
@@ -1,259 +0,0 @@
----
-title: Altinn Studio Data Modeling
-linktitle: Data Modeling
-description: Data model and Altinn Studio Data Modeling tool
-weight: 1
-toc: true
-aliases:
-- /app/development/data/data-models-tool/
-- /app/development/data/data-model/
-- /app/development/data/data-models-tool/app-datamodels
-- /app/development/data/data-models-tool/org-datamodels
-- /app/development/data/data-models-tool/known-issues
----
-
-## Data models
-
-### Data Model Files for Applications
-
-Data models for applications are located in the same folder structure as the rest of the application files. These are stored in the [Altinn Studio repository](https://altinn.studio/repos) under `App/models` in the application's file structure.
-An application has 4 model files:
-
-* **C# data model** (`.cs`): Data model used by the application's backend/APIs to process and validate data.
-* **JSON schema** (`.schema.json`): Data model in JSON schema format used by the application on the client-side (frontend) to validate data in real-time.
-This is also the file that is worked on in the data modeling tool.
-* **XSD data model** (`.XSD`): Data model in XML format that defines the elements that can be used in a document.
-This is not directly used by the application but can be uploaded to generate the other model files in Altinn Studio or downloaded as needed.
-* **JSON metadata** (`.metadata.json`): Used by Altinn Studio to generate the `.cs` file.
-_In the future, this file will not be stored in the application and will only be generated if needed_.
-
-### Data models for organizations
-
-Data models for organizations are located in Altinn Studio's [repos][1].
- To access these, log in with an Altinn Studio user.
- If this is your first time using Altinn Studio, you need to [create a user][2].
-
-The data models are located in the `-datamodels` repository, where `` is the organization you belong to.
-For example, the data models for the organization 'Test Department (ttd)' are located under
-https://altinn.studio/repos/ttd/ttd-datamodels.
-
-You can find the link to this repository in the [Altinn Studio Dashboard](/app/getting-started/navigation/dashboard): https://altinn.studio/dashboard.
- Select _Edit_ (blue pen icon) to access the Altinn Studio [Data Modeling](#altinn-studio-data-modeling) tool.
- Select _Gitea_ (green cup icon) to view the files directly in the repository.
-
- ![Overview of data model repo](./datamodels-dashboard.png "Overview of data model repo")
-
-#### Access to Data Models
-
-By default, anyone can view an organization's data models.
- To gain access to edit the data models, the user needs to be part of the _Data models_ team in the organization.
- Refer to the [access management][3] for more information.
-
-#### Uploading XSD to Repository
-XSD files can be directly uploaded to the tool [Altinn Studio Datamodellering](#altinn-studio-data-modeling) and are described under [Upload and Display Data Model](#upload-and-display-data-model).
-
-If you only need to upload XSD files for storage and do not intend to use the tool to edit the model, you can upload XSD files directly to the `-datamodels` repo.
- To do this, navigate to the desired folder and select "Add file" -> "Upload file." In the text field that appears at the top, you can enter the folder name you wish to use (optional).
- Upload the desired file, scroll down, optionally provide a message indicating the file type, and click "commit changes" to confirm.
-
-![Upload XSD directly to `-datamodels` repo](./file-upload.gif "Upload XSD directly to `-datamodels` repo")
-
-[1]: https://altinn.studio/repos
-[2]: /app/getting-started/create-user/
-[3]: /altinn-studio/guides/access-management/studio/
-
-## Altinn Studio Data Modeling
-
-{{% notice info %}}
-The Data Modeling tool in Altinn Studio is under development and will have limited functionality until it is completed.
-{{% /notice %}}
-
-Altinn Studio Data Modeling is a tool for developing [data models](#data-models).
- It is based on a data model in JSONSchema format from which it can generate XSD and C# models (see [Data Model Files for Applications](#data-model-files-for-applications)).
-
-{{% expandlarge id="links" header="Useful links" %}}
-* [Known issues and shortcomings for Altinn Studio Datamodellering](https://github.com/orgs/Altinn/projects/1/views/10)
-* [Planned new functionality for Altinn Studio Datamodellering](https://github.com/orgs/Altinn/projects/1/views/6)
-* [Development of data model for Altinn 2](/app/guides/altinn-2-datamodel/)
-* [Migrating from Seres to Altinn Studio Datamodellering](/app/guides/seres-migration/)
-{{% /expandlarge %}}
-
-### Navigating to Altinn Studio Data Modeling
-
-1. Log in to Altinn Studio. If you are not in the [Altinn Studio Dashboard](/app/getting-started/navigation/dashboard/), navigate there by clicking on the logo in the top left corner or [here](https://altinn.studio/dashboard).
-2. Select _Edit_ (blue pen icon) either for:
- a. An app under "Mine applikasjoner" (My Applications) or
- b. Data Modeling repository for your organization.
-3. Select the **Datamodell** (Data model) tab in the top menu.
-
-## Upload and Display Data Model
-
-The data model defines the data that can be submitted through an app and the allowed format of the data.
-Currently, we only support uploading XSD data models.
-When uploading an XSD model `.xsd`, the tool will generate the following files: `.cs`, `.schema.json`, and `.metadata.json` (see [Data Model Files](#data-model-files-for-applications)).
-
-{{% notice warning %}}
-Depending on the XSD schema, the Studio generator will output `decimal` properties for the C# classes.
-_decimal_ is a 128bit floating point number that is not fully representable in the JavaScript (JS) frontend of an Altinn app.
-If you use calculations to fill _decimal_ property values you may end up using enough precision that some decimal digits
-are lost when deserialized in JS. In this case you will not be able to update the property from the frontend.
-If you calculate values with _decimal_ precision, you should make sure the end result fits into `double`/64bit precision. Example:
-```csharp
-dataModel.Result = (decimal)(double)(3.33m / 3.333m);
-```
-In the future we will improve data model generation to mitigate this.
-{{% /notice %}}
-
-1. Click _Last opp datamodell_ (_Upload Data Model_) from the homepage if there are no existing data models or _Last opp_ (_Upload_) from the
- toolbar at the top of the tool.
-2. Select an XSD data model file in the file picker and click _Last opp_.
-
-![Upload Data Model](upload-datamodel.png "Upload Data Model")
-
-After the data model is processed, you can find the generated files under `App/models/` in the app repository.
-
-The types defined in the data model are displayed in the left-side panel.
-A tree view of the data model can be opened to see a visual representation of the data model and the available fields.
-
-![View Data Model](view-model.png "View Data Model")
-
-## Selecting a Model from the Dropdown List
-
-All models uploaded in the tool for an app or the organization's repository (`-datamodels`) are available from the drop-down list in the toolbar.
-XSDs that exist in a repository but do not have any associated model files (JSONSchema) will also appear in the list. See the next
-section for more information.
-
-### Specific to Organization-Level Data Modeling
-
-When working with a data model repository at the organization level (instead of directly with an app), there are two groups of
-data models displayed in the dropdown list.
-
-- The first one is _JSONSchema_. These are models generated after the processing of uploaded XSD models.
-- The second one is _XSD_. These are the XSDs that exist in the `-datamodels` repository but have not been imported and
- processed in the tool. When selecting a model from the XSD list, it will automatically be imported into the tool, and
- a JSONSchema model file will be generated. This can then be further worked on in Altinn Studio Designer.
-
-## Create a New Data Model
-
-To create a new data model from scratch:
-
- 1. Click _Lag ny_ (_Create new_) on the left-side of the toolbar.
- 2. Enter the name of the data model in the field.
- 3. Click _Opprett modell_ (_Create model_).
-
-![Create new data model](create-new-model.png "Create a new data model")
-
-The data model will be created with some example fields that you can work with or delete:
-
- - `property1` (text, required)
- - `property2` (text, required)
- - `property3` (text)
-
-![New data model](new-data-model.png "New data model")
-
-## Editing a Data Model
-
-{{% notice warning %}}
-Functionality for editing the data model with the Altinn Studio Data Model tool is under development and will be somewhat limited until it is completed.
-{{% /notice %}}
-
-Select a model from the dropdown list on the toolbar and click _Rediger_ (_edit_)
- in the top right corner of the model tool. A panel for editing the model will appear on the right side.
-
-![Edit data model](edit-model.png "Edit data model")
-
-{{% notice info %}}
-The JSON schema model is automatically saved as you work on it. To generate other model files such as XSD (and C# file for apps), you need to
-click _Generer modeller_ (_Generate Models_) on the toolbar (see [Generating Model Files](#generating-model-files-xsd-and-c)).
-{{% /notice %}}
-
-### Add New Field
-
-To add a field at the top-level (root node), click "Legg til" (**1** in below image).
-
-You can add sub-fields to fields of the Object type via the context menu of the field (three dots to the right of the field name) or by clicking the field and select the tab _Felter_ (_Fields_) in the right-side panel.
-
-### Adding a New Type
-
-Click on the **+** sign in the "Typer" panel on the left side (**2** in below image).
-
-### Converting Field to Type
-
-A field can be converted to a type by clicking the three dots to the right of the field and selecting "Konverter til type" (**3** in below image).
-
-![Add field and type](add-field-type-convert.png "Add field and type and convert field to type")
-
-### Editing a Type
-
-1. Select the type from the panel on the left side. A tree view for the type will appear in the center.
-2. Properties for the type can be edited in the right-side panel.
-3. Add new fields by clicking the _Legg til_ (add) button at the top.
-4. Select individual fields to edit their properties in the right-side panel.
-5. Exit the type editing mode by clicking the **x** at the top of the model panel (next to `Du redigerer nå på `).
-
-### Deleting a Type
-
-1. Select the desired type from the panel on the left side.
-2. Click the context menu (three dots) on the top field (root node) of the type and select "Delete".
-
-Note that it is not possible to delete types that are in use.
-
-### Type References
-
-A type reference is a field that follows the structure of a custom type.
- For instance, if you have the type 'Address' with fields 'StreetName', 'PostalCode', and 'Location', adding a reference to that type will automatically add these fields.
- The type is displayed next to the field name in the tree view.
-
- ![Type reference](type-references.png "Type references")
-
-### Adding a Type Reference
-
- 1. Click _Legg til_ (add) at the top of the tree view and choose _Legg til referanse_ (add reference).
- ![Add top-level reference](add-reference-top-level.png "Add top-level reference")
- 2. In the right-hand panel, select the type you wish to reference from the drop-down list "Refererer til" (refers to).
- ![Select type](select-reference.png "Select type")
-
-You can also add a type reference as a sub field: Click the three dots next to a field and select _Legg til referanse_.
-
-{{% notice info %}}
-**NOTE**
-To add a reference as a sub field, the parent field must be of type _Object_.
-{{% /notice %}}
-
- ![Add reference as sub field](add-reference-node.png "Add reference as sub field")
-
-### Deleting a Field
-
-Click on the three dots to the right of the node/field and select _Slett_ (delete) from the menu.
-
-### Editing Properties of a Field
-
-1. Click on the node/field you want to edit to display the properties in the right-side panel.
-2. Edit the properties of the node/field as desired. The available properties for the field will vary based on the base type
- of the field.
-
-### Editing/Adding XSD attributes, namespaces, etc., including `dataFormatId` and `dataFormatVersion`.
-
-This is currently not directly supported in the tool and must be done manually. Descriptions
-on how to do this can be found in the links below:
-
-- [dataFormatId og dataFormatVersion][1]
-- [XSD attributter generelt][2]
-- [XSD namespaces][3]
-
-## Generating Model Files (XSD and C#)
-
-Once the model is ready, you can generate model files by clicking on the **Generate Models** button above the right panel.
-For the `-datamodels` repository, a XSD file will be generated. For the app repository, both a XSD and C# model files will be generated.
-Remember to click **Last opp dine endringer** (Upload your changes) on the right side of the main menu in Altinn Studio to save your changes.
-
-## Downloading XSD
-
-A generated XSD file can be downloaded by accessing the repository: click on the person icon in the top right corner of the page and select
-"Open repository." Navigate to the desired file in `App/models/` and click on the download icon.
-
-![Download XSD repo](./download-xsd.png "Download XSD from repo")
-
-[1]: /app/guides/altinn-2-datamodel/#dataformatid-og-dataformatversion
-[2]: /app/guides/altinn-2-datamodel/#xsd-attributter
-[3]: /app/guides/altinn-2-datamodel/#xsd-namespaces
diff --git a/content/app/development/data/data-modeling/_index.nb.md b/content/app/development/data/data-modeling/_index.nb.md
deleted file mode 100644
index dc456d16cbb..00000000000
--- a/content/app/development/data/data-modeling/_index.nb.md
+++ /dev/null
@@ -1,259 +0,0 @@
----
-title: Altinn Studio Datamodellering
-linktitle: Datamodellering
-description: Datamodell og Datamodellering i Altinn Studio
-weight: 1
-toc: true
-aliases:
-- /nb/app/development/data/data-model/
-- /nb/app/development/data/data-models-tool/
-- /nb/app/development/data/data-models-tool/app-datamodels
-- /nb/app/development/data/data-models-tool/org-datamodels
-- /nb/app/development/data/data-models-tool/known-issues
----
-
-## Datamodeller
-
-### Datamodeller for applikasjoner
-
-Datamodeller for applikasjoner ligger i samme mappestruktur som resten av applikasjonsfilene. Disse ligger lagret i
-[Altinn Studio repository](https://altinn.studio/repos) under `App/models` i filstrukturen til appen.
-En applikasjon har 4 modellfiler:
-
-* **C# datamodell** (`.cs`) : Datamodell som benyttes av applikasjonens backend/API'er for å behandle og validere data.
-* **JSON schema** (`.schema.json`) : Datamodell i JSONschema-format som brukes av applikasjonen på klientsiden (frontend) for å validere data fortløpende.
-Det er også denne filen man jobber med i datamodelleringsverktøyet.
-* **XSD datamodell** (`.XSD`) : Datamodell i _XML_-format som definerer hvilke elementer som kan brukes i et dokument.
-Denne brukes ikke direkte av applikasjonen, men kan lastes opp for å generere de andre modellfilene i Altinn Studioe eller lastes ned ved behov til f.eks. mottakssystemer.
-* **JSON metadata** (`.metadata.json`) : Brukes av Altinn Studio for å genererere `.cs`-filen.
- _På sikt vil vi slutte å lagre denne filen i appen og kun generere den ved behov_.
-
-### Datamodeller for organisasjoner
-
-Datamodeller for organisasjoner ligger i Altinn Studio sin [repos][1]-løsning.
-For å få tilgang til disse må man logge inn med Altinn Studio bruker. Om det er første gang du bruker Altinn Studio
-må du [lage en bruker][2].
-
-Datamodellene ligger i `-datamodels`-repo, hvor `` er den organisasjonen du tilhører.
-F.eks. ligger datamodellene til organisasjonen `Testdepartementet (ttd)` under
-https://altinn.studio/repos/ttd/ttd-datamodels.
-
-Lenke til dette repoet finner man i [Altinn Studio Dashboard](/nb/app/getting-started/navigation/dashboard) (https://altinn.studio/dashboard). Velg _Rediger_ (blått penn-ikon) for å komme til
-Altinn Studio [Datamodellering](#altinn-studio-datamodellering) verktøet. Velg _Gitea_ (grønt kopp-ikon) for å se filene direkte i repo.
-
-![Oversikt over datamodell-repo](./datamodels-dashboard.png "Oversikt over datamodell-repo")
-
-#### Tilgang til datamodellene
-
-Alle kan se på datamodellene til en organisasjon som standard. For å få tilgang til å redigere datamodellene må brukeren
-være del av _Datamodels_-teamet i organisasjonen. Se [tilgangsstyring][3] for mer informasjon.
-
-#### Laste opp XSD til repo
-XSD kan lastes opp direkte i verktøyet [Altinn Studio Datamodellering](#altinn-studio-datamodellering) og er beskrevet under [Laste Opp og Vise Datamodell](#laste-opp-og-vise-datamodell).
-
-Om man kun har behov for å laste opp XSD for lagring, og ikke skal bruke verktøyet for å redigere modellen, kan man også
-laste opp XSD-filer direkte til `-datamodels` repo. Naviger da til ønsket mappe og velg
-"Add file" -> "Upload file". I tekstfeltet som dukker opp øverst kan man skrive inn mappenavn man ønsker å benytte (valgfritt).
-Last opp ønsket fil, scroll ned, skriv evt. en melding om hva slags fil det er, og trykk på "commit changes"
-for å bekrefte.
-
-![Last opp XSD direkte til `-datamodels` repo](./file-upload.gif "Last opp XSD direkte til -datamodels repo")
-
-[1]: https://altinn.studio/repos
-[2]: /nb/app/getting-started/create-user/
-[3]: /nb/altinn-studio/guides/access-management/studio/
-
-## Altinn Studio Datamodellering
-
-{{% notice info %}}
-Verktøyet Datamodellering i Altinn Studio er under utvikling og vil ha noe begrenset funksjonalitet før det er ferdigstilt.
-{{% /notice %}}
-
-Altinn Studio Datamodellering er et verktøy for å utvikle [datamodeller](#datamodeller). Den baserer seg på en datamodell i JSONSchema
-format og kan ut fra dette generere XSD- og C#-modeller (se [Datamodeller for Applikasjoner](#datamodeller-for-applikasjoner)).
-
-{{% expandlarge id="links" header="Nyttige lenker" %}}
-* [Registrerte feil og mangler for Altinn Studio Datamodellering](https://github.com/orgs/Altinn/projects/1/views/10)
-* [Planlagt ny funksjonalitet for Altinn Studio Datamodellering](https://github.com/orgs/Altinn/projects/1/views/6)
-* [Utvikling av datamodell for Altinn 2](/nb/app/guides/altinn-2-datamodel/)
-* [Overgang fra Seres til Altinn Studio Datamodellering](/nb/app/guides/seres-migration/)
-{{% /expandlarge %}}
-
-### Navigere til Altinn Studio Datamodellering
-
-1. Logg inn i Altinn Studio. Hvis du ikke befinner deg i [Altinn Studio Dashboard](/nb/app/getting-started/navigation/dashboard/), naviger dit ved å klikke på logoen øverst i venstre hjørne eller [her](https://altinn.studio/dashboard).
-2. Velg _rediger_ (blått penn-ikon) ved enten:
- a. En app under "Mine applikasjoner", eller
- b. Datamodellerings repo for din organisasjon.
-3. Velg fanen **Datamodell** i topp-menyen.
-
-## Laste opp og vise datamodell
-
-Datamodellen definerer hvilke data som kan sendes inn via en app, og hvilket format det skal sendes på.
-Vi støtter pr. nå kun opplasting av XSD datamodell.
- Ved opplasting av XSD-modell `.xsd` vil verktøyet generere følgende filer: `.cs`, `.schema.json` og `.metadata.json` (se [datamodell-filer](#datamodeller-for-applikasjoner)).
-
-{{% notice warning %}}
-For noen XSD skjema vil generatoren i Studio opprette properties av type `decimal` i C# klassene.
-_decimal_ representerer et 128bit desimaltall som ikke er representerbart/kompatibelt med tall-typen i JavaScript (JS) frontend for Altinn apper.
-Hvis du bruker _decimal_ for å kalkulere verdien til en _decimal_ property så kan du ende opp med å bruke nok presisjon til at noen
-desimaler forsvinner innen tallet er deserialisert i JS. Isåfall vil ikke verdien kunne oppdateres fra frontenden.
-Hvis du kalkulerer verdier med _decimal_ presisjon bør du sørge for at sluttresultatet passer inn i `double`/64bit presisjon. Eksempel:
-```csharp
-dataModel.Result = (decimal)(double)(3.33m / 3.333m);
-```
-I fremtiden vil vi forbedre datamodell-generatoren for å unngå dette.
-{{% /notice %}}
-
-1. Klikk på _Last opp datamodell_ fra startsiden om det ikke er noen eksisterende datamodeller eller _Last opp_ fra
- verktøylinjen øverst i verktøyet.
-2. Velg en XSD datamodell-fil i filvelgeren og klikk _Last opp_.
-
-![Last opp datamodell](upload-datamodel.png "Last opp datamodell")
-
-Etter at datamodellen er prosessert kan du finne de genererte filene under `App/models/` i app-repositoryet.
-
-Typer som er definert i datamodellen vises i panelet på venstre side.
-Tre-visning av datamodellen kan åpnes for å se en visuell representasjon av datamodellen og feltene som er tilgjengelige.
-
-![Vis datamodell](view-model.png "Vis datamodell")
-
-## Velge modell fra nedtrekkslisten
-
-Alle modeller som er lastet opp i verktøyet for en app eller organisasjonens repo (`-datamodels`) er tilgjengelig i listen.
-XSD'er som ligger i repo som ikke har noen tilknyttede modell-filer (JSONSchema) vil også vises i listen. Se neste
-avsnitt for mer info.
-
-### Spesielt for datamodellering på organisasjonsnivå
-
-Når man jobber mot et [datamodell-repo på organisasjonsnivå](#datamodeller-for-organisasjoner) (i stedet for direkte mot en app), er det to grupper med
-datamodeller som vises i nedtrekkslisten.
-
-- Den første er _JSONSchema_. Dette er modeller som er generert etter prosessering av opplastede XSD-modeller.
-- Den andre er _XSD_. Dette er de XSD'ene som ligger i `-datamodels` repo som ikke har blitt hentet inn og
- prosessert i verktøyet. Når man velger en modell fra XSD-listen, vil denne automatisk lastes inn i verktøyet og
- JSONSchema modell-fil genereres. Denne kan så jobbes videre med i Altinn Studio Designer.
-
-## Lage ny datamodell
-
-For å opprette en ny datamodell fra bunnen av:
-
-1. Klikk på _Lag ny_ til venstre på verktøylinjen.
-2. Skriv inn navnet på datamodellen i feltet.
-3. Klikk på _Opprett modell_.
-
-![Lag ny datamodell](create-new-model.png "Lag ny datamodell")
-
-Datamodellen opprettes med noen eksempel-felter som man kan jobbe videre med eller slette:
-
-- `property1` (tekst, påkrevd)
-- `property2` (tekst, påkrevd)
-- `property3` (tekst)
-
-![Ny modell](new-data-model.png "Ny modell")
-
-## Redigere datamodell
-
-{{% notice warning %}}
-Funksjonalitet for å redigere datamodell er under utvikling og vil være noe begrenset frem til den er ferdig.
-{{% /notice %}}
-
-Velg modell i nedtrekkslisten på verktøylinjen og klikk _Rediger_
-øverst til høyre i modellverktøyet. Et panel for å redigere modellen vises på høyre side av
-verktøyet.
-
-![Rediger datamodell](edit-model.png "Rediger datamodell")
-
-{{% notice info %}}
-JSONschema-modellen lagres automatisk mens man jobber med den. For å generere andre modell-filer som XSD (og C#-fil for apper) må man
-trykke på knappen _Generer modeller_ øverst til høyre (se [Generere Modellfiler](#generere-og-laste-ned-modellfiler-xsd-og-c)).
-{{% /notice %}}
-
-### Legge til nytt felt
-
-For å legge til felt på øverste nivå (rot-node), klikk "Legg til" (**1** i bildet under).
-
-Du kan legge til underfelt på felter av type Objekt via kontekstmenyen til feltet (tre prikker til høyre for feltnavnet) eller ved å klike på feltet og velge fanen _Felter_ i panelet til høyre.
-
-### Legge til en ny type
-
-Klikk på **+**-tegnet i "Typer"-panelet på venstre side (**2** i bildet under).
-
-### Konvertere felt til type
-
-Et felt kan konverteres til en type ved å klikke de tre prikkene til høyre for feltet og velge "Konverter til type" (**3** i bildet under).
-
-![Legg til felt og type](add-field-type-convert.png "Legg til felt og type og konverter felt til type")
-
-### Redigere en type
-
-1. Klikk på typen du ønsker å redigere. En tre-visning for typen vises i midten.
-2. Egenskaper for typen kan redigeres i panelet til høyre.
-3. Klikk "Legg til" øverst for å legge til felter på typen.
-4. Ved å velge felter fra typen kan man redigere egenskaper for disse i høyre-panelet.
-5. Lukk redigering av typer ved å trykke på **x** øverst i modell-panelet (ved siden av `Du redigerer nå på `).
-
-### Slette en type
-
-1. Velg ønsket type fra panelet på venstre side.
-2. Klikk kontekst-menyen (tre prikker) til det øverste feltet (rot-noden) på typen og velg "Slett".
-
-Merk at det ikke er mulig å slette typer som er i bruk.
-
-### Typereferanser
-
-En typereferanse er et felt som følger strukturen til en egendefinert type.
-For eksempel, hvis du har typen 'Adresse' med feltene 'Gateadresse', 'Postnummer' og 'Sted', vil en referanse til denne typen automatisk legge til disse feltene.
-Typen vises ved siden av feltnavnet i trevisningen.
-
-![Typereferanse](type-references.png "Typereferanser")
-
-### Legge til en typereferanse
-
-1. Klikk _Legg til_ øverst i trevisningen og velg _Legg til referanse_.
-![Legg til referanse på toppnivå](add-reference-top-level.png "Legg til referanse på toppnivå")
-1. Klikk på referansen du opprettet og velg typen du ønsker å referere til fra nedtrekkslisten under "Refererer til" i det høyre panelet.
-![Velg referanse](select-reference.png "Velg typen feltet refererer til")
-
-Du kan også legge til en referanse som en underordnet felt: Klikk de tre prikkene ved siden av et feltet og velg _Legg til referanse_.
-
-{{% notice info %}}
-**MERK**
-For å legge til elementer under et felt (node) må feltet være av typen _Objekt_.
-{{% /notice %}}
-
-![Legg til referanse på objekt](add-reference-node.png "Legg til referanse på objekt")
-
-### Slette et felt
-
-Klikk på de tre prikkene til høyre for noden/feltet og velg _Slett_ fra menyen.
-
-### Redigere egenskaper til et felt
-
-1. Klikk på noden/feltet du ønsker å redigere for å få opp egenskaper i høyre-panelet
-2. Rediger egenskapene for noden/feltet som ønsket. Tilgjengelige egenskaper for feltet vil variere basert på base-typen
- for feltet.
-
-### Redigere/legge til XSD-attributter, namespaces, osv, inkl `dataFormatId og `dataFormatVersion`.
-
-Dette er foreløpig ikke noe som støttes direkte i verktøyet og må gjøres manuelt. Beskrivelser
-for hvordan dette gjores finnes i lenkene under:
-
-- [dataFormatId og dataFormatVersion][1]
-- [XSD attributter generelt][2]
-- [XSD namespaces][3]
-
-## Generere og laste ned modellfiler (XSD og C#)
-
-Når modellen er klar kan man generere modell-filer ved å klikke på knappen **Generer modeller** over det høyre panelet.
-For `-datamodels`-repo vil det kun genereres XSD, mens for app-repo vil det også genereres C# modell-fil.
-Husk å trykke på **Last opp dine endringer** til høyre i hovedmenyen til Altinn Studio for å lagre endringene dine.
-
-En generert XSD fil kan lastes ned ved å gå til repoet: klikk på person-ikonet øverst til høyre på siden og velg
-"Åpne repository". Naviger til ønsket fil i `App/models/` og klikk på nedlastingsikonet.
-
-![Last ned XSD fra repo](./download-xsd.png "Last ned XSD fra repo")
-
-[1]: /nb/app/guides/altinn-2-datamodel/#dataformatid-og-dataformatversion
-[2]: /nb/app/guides/altinn-2-datamodel/altinn-2-datamodel/#xsd-attributter
-[3]: /nb/app/guides/altinn-2-datamodel/#xsd-namespaces
diff --git a/content/app/development/data/data-modeling/add-datamodel.png b/content/app/development/data/data-modeling/add-datamodel.png
deleted file mode 100644
index b1c01246edf..00000000000
Binary files a/content/app/development/data/data-modeling/add-datamodel.png and /dev/null differ
diff --git a/content/app/development/data/data-modeling/add-field-type-convert.png b/content/app/development/data/data-modeling/add-field-type-convert.png
deleted file mode 100644
index f669fcc63ee..00000000000
Binary files a/content/app/development/data/data-modeling/add-field-type-convert.png and /dev/null differ
diff --git a/content/app/development/data/data-modeling/add-reference-node.png b/content/app/development/data/data-modeling/add-reference-node.png
deleted file mode 100644
index 34e0dc56c17..00000000000
Binary files a/content/app/development/data/data-modeling/add-reference-node.png and /dev/null differ
diff --git a/content/app/development/data/data-modeling/add-reference-top-level.png b/content/app/development/data/data-modeling/add-reference-top-level.png
deleted file mode 100644
index efc27acf60e..00000000000
Binary files a/content/app/development/data/data-modeling/add-reference-top-level.png and /dev/null differ
diff --git a/content/app/development/data/data-modeling/create-edit-model.gif b/content/app/development/data/data-modeling/create-edit-model.gif
deleted file mode 100644
index 78cf671053f..00000000000
Binary files a/content/app/development/data/data-modeling/create-edit-model.gif and /dev/null differ
diff --git a/content/app/development/data/data-modeling/create-new-model.png b/content/app/development/data/data-modeling/create-new-model.png
deleted file mode 100644
index d478492d024..00000000000
Binary files a/content/app/development/data/data-modeling/create-new-model.png and /dev/null differ
diff --git a/content/app/development/data/data-modeling/create-new.png b/content/app/development/data/data-modeling/create-new.png
deleted file mode 100644
index 7fc47266983..00000000000
Binary files a/content/app/development/data/data-modeling/create-new.png and /dev/null differ
diff --git a/content/app/development/data/data-modeling/datamodels-dashboard.png b/content/app/development/data/data-modeling/datamodels-dashboard.png
deleted file mode 100644
index ccefba01cfc..00000000000
Binary files a/content/app/development/data/data-modeling/datamodels-dashboard.png and /dev/null differ
diff --git a/content/app/development/data/data-modeling/download-xsd.png b/content/app/development/data/data-modeling/download-xsd.png
deleted file mode 100644
index 2a5007a9e5a..00000000000
Binary files a/content/app/development/data/data-modeling/download-xsd.png and /dev/null differ
diff --git a/content/app/development/data/data-modeling/edit-model.png b/content/app/development/data/data-modeling/edit-model.png
deleted file mode 100644
index 4adb64e4d1e..00000000000
Binary files a/content/app/development/data/data-modeling/edit-model.png and /dev/null differ
diff --git a/content/app/development/data/data-modeling/file-upload.gif b/content/app/development/data/data-modeling/file-upload.gif
deleted file mode 100644
index 00738827665..00000000000
Binary files a/content/app/development/data/data-modeling/file-upload.gif and /dev/null differ
diff --git a/content/app/development/data/data-modeling/info-dialog.png b/content/app/development/data/data-modeling/info-dialog.png
deleted file mode 100644
index e644e0ac31e..00000000000
Binary files a/content/app/development/data/data-modeling/info-dialog.png and /dev/null differ
diff --git a/content/app/development/data/data-modeling/new-data-model.png b/content/app/development/data/data-modeling/new-data-model.png
deleted file mode 100644
index 19bd3916495..00000000000
Binary files a/content/app/development/data/data-modeling/new-data-model.png and /dev/null differ
diff --git a/content/app/development/data/data-modeling/select-reference.png b/content/app/development/data/data-modeling/select-reference.png
deleted file mode 100644
index 743ea664acc..00000000000
Binary files a/content/app/development/data/data-modeling/select-reference.png and /dev/null differ
diff --git a/content/app/development/data/data-modeling/type-references.png b/content/app/development/data/data-modeling/type-references.png
deleted file mode 100644
index e163c08aee3..00000000000
Binary files a/content/app/development/data/data-modeling/type-references.png and /dev/null differ
diff --git a/content/app/development/data/data-modeling/upload-datamodel.png b/content/app/development/data/data-modeling/upload-datamodel.png
deleted file mode 100644
index 06d18b30311..00000000000
Binary files a/content/app/development/data/data-modeling/upload-datamodel.png and /dev/null differ
diff --git a/content/app/development/data/data-modeling/view-model.png b/content/app/development/data/data-modeling/view-model.png
deleted file mode 100644
index 1e083fb9349..00000000000
Binary files a/content/app/development/data/data-modeling/view-model.png and /dev/null differ
diff --git a/content/app/development/data/data-modeling/view-new-model.png b/content/app/development/data/data-modeling/view-new-model.png
deleted file mode 100644
index 015e0d71a7b..00000000000
Binary files a/content/app/development/data/data-modeling/view-new-model.png and /dev/null differ
diff --git a/content/app/development/data/options/_index.en.md b/content/app/development/data/options/_index.en.md
deleted file mode 100644
index 6c55237c118..00000000000
--- a/content/app/development/data/options/_index.en.md
+++ /dev/null
@@ -1,242 +0,0 @@
----
-title: Code lists (options)
-linktitle: Code lists
-description: How to configure Options / Code lists for an app?
-toc: true
-weight: 300
----
-
-Altinn offers two different ways an application can use code lists - static and dynamic. Both is primarily exposed
-through the options api from application, and are available at `{org}/{app}/api/options/{optionsId}`.
-Checkbox, Dropdown, and RadioButton components will automatically be able to fetch such lists if you connect the
-component to the option id in question. Not all dynamic code list have to be fetched from the options api - we can also
-have code lists based on the values from a repeating structure in the datamodel.
-
-## Connect the component to options (code list)
-
-This is done by adding the optionId you would like to refer to either through the component UI in Designer or directly
-in `FormLayout.json` as shown below:
-
-```json
-{
- "id": "some-dropdown-component",
- "type": "Dropdown",
- "textResourceBindings": {},
- "dataModelBindings": {},
- "optionsId": "countries"
-}
-```
-
-## Pass query parameters when fetching options
-
-Options supports query parameters when making the api call, the parameter `language` is added automatically.
-
-### Pass static query parameters
-
-You can add static query parameters by setting the `queryParameters` property on the component:
-
-```json
-{
- "id": "some-dropdown-component",
- "type": "Dropdown",
- "textResourceBindings": {
- "title": "NyGarantiLoyvetype"
- },
- "dataModelBindings": {
- "simpleBinding": "soknad.nyGaranti.loyvetype"
- },
- "required": true,
- "optionsId": "loyvetyper",
- "queryParameters": {
- "loyvetype": "garanti"
- }
-},
-```
-
-In the example above the parameter `?loyvetype=garanti` will be added to the request.
-
-### Pass dynamic query parameters based on the data model
-
-You can add dynamic parameters by setting the `mapping` property on the component:
-
-```json
-{
- "id": "some-dropdown-component",
- "type": "Dropdown",
- "textResourceBindings": {
- "title": "NyGarantiLoyvetype"
- },
- "dataModelBindings": {
- "simpleBinding": "soknad.nyGaranti.loyvetype"
- },
- "required": true,
- "optionsId": "loyvetyper",
- "mapping": {
- "soknad.transportorOrgnummer": "orgnummer"
- }
-},
-```
-
-In the example above, the query parameter `orgnummer={nr}`, where `{nr}` is the value of `soknad.transportorOrgnummer`
-will be set.
-If an option is setup with mapping and the given data field changes app-frontend will refetch the option. This can be
-used to dynamically decide which choices are available based on information given by the end user.
-
-Passing query parameters from repeating groups is also supported by adding an index indicator for the relevant indexes.
-Example for a group:
-
-```json
-{
- "id": "dropdown-group",
- "type": "Dropdown",
- "textResourceBindings": {
- "title": "Select city"
- },
- "dataModelBindings": {
- "simpleBinding": "Group.City"
- },
- "required": true,
- "optionsId": "cities",
- "mapping": {
- "Group[{0}].Country": "country"
- }
-},
-```
-
-For nested groups follows the same pattern but with an additional index indicator for the nested group:
-
-```json
-{
- "id": "dropdown-nested-group",
- "type": "Dropdown",
- "textResourceBindings": {
- "title": "Select city"
- },
- "dataModelBindings": {
- "simpleBinding": "Group.SubGroup.City"
- },
- "required": true,
- "optionsId": "cities",
- "mapping": {
- "Group[{0}].SubGroup[{1}].Country": "country"
- }
-},
-```
-
-For a complete example of how this is setup see our [demo app.](https://altinn.studio/repos/ttd/dynamic-options-rep)
-
-{{%notice warning%}}
-
-**Applies to applications using version 7.4.0 or older of the nuget packages** - https://github.com/Altinn/app-lib-dotnet/release
-
-
-
-During PDF-generation the app will try to call the same option endpoint as app-frontend does.
-We currently have a weakness where mapping parameters not are included in this request, see issue [#7903.](https://github.com/Altinn/altinn-studio/issues/7903)
-
-A possible workaround here is to return an empty array when the PDF-generator asks for options with empty query params, example:
-
-```c#
-string someArg = keyValuePairs.GetValueOrDefault("someArg");
-string someOtherArg = keyValuePairs.GetValueOrDefault("someOtherArg");
-
-if (string.IsNullOrEmpty(someArg) || string.IsNullOrEmpty(someOtherArg)) {
- return await Task.FromResult(new List());
-}
-```
-
-Notice that this wil result in the option value and not the label being present as the end users answer.
-{{% /notice%}}
-
-### Store metadata for the parameters used to retrieve options in tha datamodel
-
-You can store metadata for the parameters used to retrieve options in the datamodel by setting the `metadata` property
-on the components `dataModelBinding` property:
-
-```json
-{
- "id": "some-dropdown-component",
- "type": "Dropdown",
- "textResourceBindings": {
- "title": "NyGarantiLoyvetype"
- },
- "dataModelBindings": {
- "simpleBinding": "soknad.nyGaranti.loyvetype",
- "metadata": "soknad.transportorOrgnummer"
- },
- "required": true,
- "optionsId": "loyvetyper",
- "mapping": {
- "soknad.transportorOrgnummer": "orgnummer"
- }
-},
-```
-
-This configuration will store the metadata of the retrieved options as a comma separated string in the
-field `soknad.transportorOrgnummer` in the datamodel.
-
-## Description and HelpText
-
-`description` and `helpText` is supported by options in apps that use version v7.8.0 or higher. `description` and
-`helpText` can be displayed by the components `RadioButtons` and `Checkboxes` by providing the option list with the
-mentioned properties.
-
-Descriptions and HelpTexts can be provided to `options` in the same way that a `label` is provided, in either static or
-dynamic code lists. One can also use them in options based on repeating groups in the `source` attribute.
-
-```json
-[
- {
- "value": "norway",
- "label": "Norge",
- "description": "This is a description",
- "helpText": "This is a help text"
- },
- {
- "value": "denmark",
- "label": "Danmark"
- }
-]
-```
-
-```cs
-var options = new AppOptions
-{
- Options = new List
- {
- new AppOption
- {
- Label = "Ole",
- Value = "1",
- Description = "This is a description",
- HelpText = "This is a help text"
- },
- new AppOption
- {
- Label = "Dole",
- Value = "2"
- }
- }
-};
-```
-
-Descriptions and help texts used in options based on repeating groups can be set up with dynamic text-resources in the
-same way as labels, described in
-[options based on repeating groups](repeating-group-codelists).
-
-```json
-{
- "id": "checkboxes-component-id",
- "type": "Checkboxes",
- ...
- "source": {
- "group": "some.group",
- "label": "checkboxes.label",
- "description": "checkboxes.descripiton",
- "helpText": "checkboxes.helpText",
- "value": "some.group[{0}].someField"
- }
-},
-```
-
-{{}}
diff --git a/content/app/development/data/options/_index.nb.md b/content/app/development/data/options/_index.nb.md
deleted file mode 100644
index 736ae68dfe9..00000000000
--- a/content/app/development/data/options/_index.nb.md
+++ /dev/null
@@ -1,232 +0,0 @@
----
-title: Kodelister (options)
-linktitle: Kodelister
-description: Hvordan konfigurere options/kodelister for en app?
-toc: true
-weight: 300
----
-
-Altinn tilbyr to ulike måter en app kan eksponere kodelister - statisk og dynamisk. Disse eksponeres primært fra options endepunktet i appen, og er tilgjengelig på `{org}/{app}/api/options/{optionsId}`.
-Checkbox, Dropdown og RadioButton komponenter vil automatisk kunne hente ut en slik liste om man kobler denne komponenten til en slik options-id. Men ikke alle dynamiske kodelister må gå via api'et - vi har også dynamiske kodelister som baserer seg på verdiene fra en repeterende struktur i datamodellen.
-
-## Koble en komponent til kodeliste
-
-Dette gjøres ved å legge til feltet optionsId som referer til hvilken option (kodeliste) man ønsker refere til. Eksempel:
-
-```json
-{
- "id": "dropdown-komponent",
- "type": "Dropdown",
- "optionsId": "biler"
-}
-```
-
-## Sende med query parametere ved henting av options
-
-Options støtter query parametre når det gjøres api kall; parameteren `language` sendes med automatisk.
-
-### Sende med statiske query parametre
-
-Man kan legge til statiske query parametre ved å sette opp `queryParameters` på den aktuelle komponenten:
-
-```json
-{
- "id": "dropdown-komponent",
- "type": "Dropdown",
- "textResourceBindings": {
- "title": "NyGarantiLoyvetype"
- },
- "dataModelBindings": {
- "simpleBinding": "soknad.nyGaranti.loyvetype"
- },
- "required": true,
- "optionsId": "loyvetyper",
- "queryParameters": {
- "loyvetype": "garanti"
- }
-},
-```
-
-I eksempelet over vil parameteren `?loyvetype=garanti` bli sendt med i api kallet.
-
-### Sende med dynamiske query parametre basert på datamodellen
-
-Man kan legge til dynamiske query parametre ved å sette opp `mapping` på den aktuelle komponenten:
-
-```json
-{
- "id": "dropdown-komponent",
- "type": "Dropdown",
- "textResourceBindings": {
- "title": "NyGarantiLoyvetype"
- },
- "dataModelBindings": {
- "simpleBinding": "soknad.nyGaranti.loyvetype"
- },
- "required": true,
- "optionsId": "loyvetyper",
- "mapping": {
- "soknad.transportorOrgnummer": "orgnummer"
- }
-},
-```
-
-I eksempelet over vil det bli satt på et query parameter `orgnummer={nr}`, hvor `{nr}` er verdien på feltet `soknad.transportorOrgnummer`.
-Om man setter opp en kobling til et datafelt og dette feltet endrer seg så vil app-frontend hente options på nytt. På denne måten kan man dynamisk styre hvilke valg som vises basert på informasjon gitt av sluttbruker.
-
-Å sende med query parametere fra repeterende grupper er også støttet ved å legge ved en indeks-indikator for de relevante gruppene. Eksempel:
-
-```json
-{
- "id": "dropdown-group",
- "type": "Dropdown",
- "textResourceBindings": {
- "title": "Select city"
- },
- "dataModelBindings": {
- "simpleBinding": "Group.City"
- },
- "required": true,
- "optionsId": "cities",
- "mapping": {
- "Group[{0}].Country": "country"
- }
-},
-```
-
-For nøsta repeterende grupper vil man følge det samme mønsteret, men med en ekstra indikator for den nøsta gruppa:
-
-```json
-{
- "id": "dropdown-nested-group",
- "type": "Dropdown",
- "textResourceBindings": {
- "title": "Select city"
- },
- "dataModelBindings": {
- "simpleBinding": "Group.SubGroup.City"
- },
- "required": true,
- "optionsId": "cities",
- "mapping": {
- "Group[{0}].SubGroup[{1}].Country": "country"
- }
-},
-```
-
-For et komplett eksempel kan du se vår [demo app.](https://altinn.studio/repos/ttd/dynamic-options-rep)
-
-{{%notice warning%}}
-**Gjelder applikasjoner som benytter versjon 7.4.0 eller eldre av nuget pakkene** - se https://github.com/Altinn/app-lib-dotnet/release
-
-
-
-Under PDF-generering vil appen prøve å kalle det samme options-endepunktet som app-frontend gjør.
-Vi har foreløpig en svakhet ved at eventuelle mapping-parametere ikke blir inkludert i denne forespørselen, se issue [#7903.](https://github.com/Altinn/altinn-studio/issues/7903)
-
-En mulig workaround her er å returnere en tom array i det PDF-generatoren spør om options med tomme query-parametere, eksempel:
-
-```c#
-string someArg = keyValuePairs.GetValueOrDefault("someArg");
-string someOtherArg = keyValuePairs.GetValueOrDefault("someOtherArg");
-
-if (string.IsNullOrEmpty(someArg) || string.IsNullOrEmpty(someOtherArg)) {
- return await Task.FromResult(new List());
-}
-```
-
-Merk at dette vil resultere i at PDF vil vise verdien valgt og ikke label som sluttbrukers svar.
-{{% /notice%}}
-
-### Lagre metadata for parametrene som ble brukt til å hente options
-
-Du kan lagre metadata for parameterene som ble brukt til å hente options i datamodellen ved å sette `metadata` property
-på komponentens `dataModelBinding` property:
-
-```json
-{
- "id": "some-dropdown-component",
- "type": "Dropdown",
- "textResourceBindings": {
- "title": "NyGarantiLoyvetype"
- },
- "dataModelBindings": {
- "simpleBinding": "soknad.nyGaranti.loyvetype",
- "metadata": "soknad.transportorOrgnummer"
- },
- "required": true,
- "optionsId": "loyvetyper",
- "mapping": {
- "soknad.transportorOrgnummer": "orgnummer"
- }
-},
-```
-
-Denne konfigurasjonen vil lagre metadata for parameterene som ble brukt til å hente options som en kommaseparert
-streng i feltet `soknad.transportorOrgnummer` i datamodellen.
-
-## Beskrivelse og Hjelpetekst
-
-`description` og `helpText` støttes av options i apper som bruker versjon v7.8.0 eller høyere. Beskrivlese og
-hjelpetekst kan vises av komponentene `RadioButtons` og `Checkboxes` ved å sette attributtene i en `option` som
-brukes av komponenten.
-
-Beskrivelser og hjelpetekster kan gis til `options` på samme måte som en `label` er gitt, enten i statiske eller
-dynamiske kodelister. Man kan også bruke dem i options basert på repeterende grupper i `source` attributten.
-
-```json
-[
- {
- "value": "norway",
- "label": "Norge",
- "description": "This is a description",
- "helpText": "This is a help text"
- },
- {
- "value": "denmark",
- "label": "Danmark"
- }
-]
-```
-
-```cs
-var options = new AppOptions
-{
- Options = new List
- {
- new AppOption
- {
- Label = "Ole",
- Value = "1",
- Description = "This is a description",
- HelpText = "This is a help text"
- },
- new AppOption
- {
- Label = "Dole",
- Value = "2"
- }
- }
-};
-```
-
-Beskrivelser og hjelpetekster som brukes i options basert på repeterende grupper kan settes opp med dynamiske
-text-ressurser på samme måte som `label`, som er beskrevet i
-[options basert på repeterende grupper](repeating-group-codelists).
-
-```json
-{
- "id": "checkboxes-component-id",
- "type": "Checkboxes",
- ...
- "source": {
- "group": "some.group",
- "label": "checkboxes.label",
- "description": "checkboxes.descripiton",
- "helpText": "checkboxes.helpText",
- "value": "some.group[{0}].someField"
- }
-},
-```
-
-{{}}
diff --git a/content/app/development/data/options/altinn2-codelists/_index.en.md b/content/app/development/data/options/altinn2-codelists/_index.en.md
deleted file mode 100644
index 59966480786..00000000000
--- a/content/app/development/data/options/altinn2-codelists/_index.en.md
+++ /dev/null
@@ -1,53 +0,0 @@
----
-title: Re-use code lists from Altinn 2
-linktitle: Code lists from Altinn 2
-description: How to configure code lists that exists in Altinn 2 in an Altinn 3 app?
-toc: false
-weight: 300
----
-{{}}
-**Deprecated feature**
-Altinn 2 provided a shared set of code lists for use in forms. Until May 2023 there really wasn't an alternative for common used code lists across Altinn 3 applications. By exposing the Altinn 2 code lists api in Altinn 3 applications you would get access to the same set of code lists.
-
-
-This however is not a long term solution, and with the release of the [Altinn Common Code lists](https://github.com/Altinn/codelists-lib-dotnet) package, you now have access to many of the same code lists as in Altinn 2.
-
-
-You still might find a missing code list or two in Altinn 3 compared with Altinn 2 - in that case please consider the following:
-1. Can you create a pull request in [Altinn Common Code lists repo](https://github.com/Altinn/codelists-lib-dotnet) and contribute allowing others to re-use your implementation?
-2. If you don't have the knowledge or time to create a pull request then just let us know, by creating a [new issue](https://github.com/Altinn/codelists-lib-dotnet/issues/new/choose) and describe what code list you need and we will either create it or help you do it.
-3. If you decide to use the Altinn 2 variant, please know that this api won't be available after June 2025.
-{{}}
-
-
-## Configure an Altinn 2 code list
-For an overview over available code lists in Altinn 2 please use the [api](https://altinn.github.io/docs/api/rest/metadata/#hente-oversikt-over-kodelister)
-You register the lists you want to use in your applications `Program.cs` and you can keep updating the code list trough TUL.
-
-```C#
-using Altinn.App.Core.Features.Options;
-...
-services.AddAltinn2CodeList(
- id: "ASF_Land",
- transform: (code) => new (){ Value = code.Code, Label = code.Value1 },
- // filter: (code) => int.Parse(code.Value3) > 100,
- codeListVersion: 3994, // Optional (use latest version if missing)
- metadataApiId: "ASF_Land" // Code list name in Altinn 2 (use id if missing)
-);
-```
-
-The `id` parameter is required and should be the name of the code list in altinn 2, `transform` sorts out what columns
-should be assigned to `Value` and `Label`. Translation is automatic. After version `v7.2.0`, `nb` will be used as a fallback
-for missing languages. If you want two different transformations of the same list (for different components), `id` is the
-name that is used in Altinn 3 and `metadataApiId` is used towards altinn 2.
-
-Usage is as all code lists where `id` is written in the `optionsId` field of the component.
-
-```json
-{
- "id": "country",
- "type": "Dropdown",
- ...
- "optionsId": "ASF_Land"
-},
-```
diff --git a/content/app/development/data/options/altinn2-codelists/_index.nb.md b/content/app/development/data/options/altinn2-codelists/_index.nb.md
deleted file mode 100644
index dbd4557d6c6..00000000000
--- a/content/app/development/data/options/altinn2-codelists/_index.nb.md
+++ /dev/null
@@ -1,51 +0,0 @@
----
-title: Gjenbruk av kodelister fra Altinn 2
-linktitle: Kodelister fra Altinn 2
-description: Hvordan konfigurere kodelister fra Altinn 2 i en Altinn 3 applikasjon?
-toc: false
-weight: 300
----
-{{}}
-**Utgående funksjonalitet**
-Altinn 2 tilbød en felles samling av kodelister som kunne brukes i skjemaer. Inntil mai 2023 fantes det egentlig ingen alternativ for vanlig brukte kodelister på tvers av Altinn 3-applikasjoner. Ved å eksponere Altinn 2 kodeliste-API-en i Altinn 3-applikasjoner, får du tilgang til den samme samlingen av kodelister.
-
-
-Dette er imidlertid ikke en langsiktig løsning, og med utgivelsen av [Altinn felles kodelister](https://github.com/Altinn/codelists-lib-dotnet)-pakken, har du nå tilgang til mange av de samme kodelistene som i Altinn 2.
-
-
-Du kan fortsatt oppleve at det mangler en eller to kodelister i Altinn 3 sammenlignet med Altinn 2. I så fall kan du vurdere følgende:
-1. Kan du opprette en "pull request" i [Altinn felles kodelister-repositoriet](https://github.com/Altinn/codelists-lib-dotnet) og bidra til felleskapet slik at andre kan gjenbruke implementasjonen din?
-2. Hvis du ikke har kunnskapen eller tiden til å opprette en "pull request", gi oss beskjed ved å opprette en [ny sak](https://github.com/Altinn/codelists-lib-dotnet/issues/new/choose) og beskriv hvilken kodeliste du trenger, så vil vi enten opprette den eller hjelpe deg med å gjøre det.
-3. Hvis du bestemmer deg for å bruke Altinn 2-versjonen, vær oppmerksom på at dette API-et ikke vil være tilgjengelig etter juni 2025.
-{{}}
-
-## Konfigurer en Altinn 2 kodeliste
-For en oversikt over tilgjengelige kodelister i Altinn 2, kan du bruke [apiet](https://altinn.github.io/docs/api/rest/metadata/#hente-oversikt-over-kodelister)
-Du registrerer listene du ønsker å bruke i applikasjonens `Program.cs`, og du kan oppdatere kodelisten gjennom TUL.
-
-```C#
-using Altinn.App.Core.Features.Options;
-...
-services.AddAltinn2CodeList(
- id: "ASF_Land",
- transform: (code) => new (){ Value = code.Code, Label = code.Value1 },
- // filter: (code) => int.Parse(code.Value3) > 100,
- codeListVersion: 3994, // Optional (use latest version if missing)
- metadataApiId: "ASF_Land" // Code list name in Altinn 2 (use id if missing)
-);
-```
-Det eneste som er påkrevd er `id` for hva kodelisten heter i Altinn 2, og `transform` for å fortelle hvilke kolonner du
-ønsker å bruke som `Value` og `Label`. Oversetting fungerer automatisk. Etter versjon `v7.2.0` vil `nb` bli brukt om
-listen mangler språket brukeren har valgt. Om du ønsker to ulike transformasjoner av samme liste, blir `id` navnet
-som brukes i Altinn 3 og `metadataApiId` brukes i oppslaget mot Altinn 2
-
-Bruken er som alle andre kodelister der `id` kommer igjen som `optionsId` i komponenten.
-
-```json
-{
- "id": "landvelger",
- "type": "Dropdown",
- ...
- "optionsId": "ASF_Land"
-},
-```
diff --git a/content/app/development/data/options/common-codelists/_index.en.md b/content/app/development/data/options/common-codelists/_index.en.md
deleted file mode 100644
index 215199b1dcd..00000000000
--- a/content/app/development/data/options/common-codelists/_index.en.md
+++ /dev/null
@@ -1,98 +0,0 @@
----
-title: Common shared code lists
-linktitle: Common shared code list
-description: How to re-use common code lists shared across applications?
-toc: false
-weight: 200
----
-
-{{%notice info%}}
-This functionality requires that the application uses at least [version 7.8.0](https://github.com/Altinn/app-lib-dotnet/releases/tag/v7.8.0) of the Altinn.App.Core NuGet package.
-{{% /notice%}}
-
-## What are common standard code lists?
-Common standard code lists are lists such as countries, counties, municipalities, genders, marital statuses, etc. that can be used in an application without the need to maintain these code lists yourself. See the [complete list](https://github.com/Altinn/codelists-lib-dotnet#available-codelists) of available code lists.
-
-These code lists are created as a separate [NuGet package](https://www.nuget.org/packages/Altinn.Codelists) that can be imported into your application. This is done to keep the core of an Altinn 3 application as small as possible and to be able to release and use new code lists without depending on having to upgrade the application (beyond v7.8.0).
-
-## How to add common standard code lists to the application?
-### 1. Add a reference to the [Altinn.Codelists NuGet package](https://www.nuget.org/packages/Altinn.Codelists)
- Open the command line to your application's repository and navigate to the App folder where the App.csproj file is located, and run the following command:
-
- ```shell
- dotnet add package Altinn.Codelists
- ```
- This will add the latest stable version of the package to your solution.
-
- Alternatively, you can directly edit your application's App.csproj file by adding the reference below to the `` where you have package references.
- ```xml
-
- ```
- Note that you then need to explicitly specify the version you would like. See the link in step one for available versions.
-
-### 2. Register the code lists in your app's DI container
- Add the following to your Program.cs file:
- ```csharp
- services.AddAltinnCodelists();
- ```
- By calling this method, you will register all codelists across all sources. You can also register code lists one by one if you want to have control over which code lists are used or configure and customize the setup of the code list.
-
-### 3. Connect your application to the code list you want to use
- See the [documentation](https://github.com/Altinn/codelists-lib-dotnet#available-codelists) below for available code lists.
-
- You can do this either using [Altinn Studio](https://altinn.studio) and configure the *code list ID* of your component in the user interface.
-
- Or you can configure the component by editing the `optionsId` property in FormLayout.json according to the [documentation](/app/development/data/options/#connect-the-component-to-options-code-list).
-
-## Custom Configuration
-While the configuration mentioned above, where you use the method `services.AddAltinnCodelists();`, will register all available code lists with default values, there may be cases where you want to customize the configuration of a code list. The examples below will vary slightly depending on the source of the code list, as different sources offer different options.
-
-### Add a code list with a custom code list ID
-If you don't want to use the default code list ID, or if you only want to register code lists that are relevant to your app, you can register each code list individually.
-
-The example uses a code list from SSB and overrides the code list ID:
-```csharp
-services.AddSSBClassificationCodelistProvider("næring", Classification.IndustryGrouping);
-```
-
-### Add a code list with default parameters
-Some of the code lists accept parameters that control what is returned.
-
-The example uses a code list from SSB and specifies a filter to only retrieve values from the first level (this specific code list is hierarchical).
-
-```csharp
-services.AddSSBClassificationCodelistProvider("næring", Classification.IndustryGrouping, new Dictionary() { { "level", "1" } });
-```
-The default parameters are a collection of name/value pairs that allow you to pass in any parameter that can be picked up by the implementation of the code list provider.
-
-### Add a code list that supports description and/or help text values
-While a regular code list is just a key/value pair, you can extend it by adding description and help texts, which provide a more descriptive user interface.
-
-The following example makes the notes field from the SSB classification fill out the description text.
-
-```csharp
-services.AddSSBClassificationCodelistProvider("næring", Classification.IndustryGrouping,
- new ClassificationOptions() { MapNotesToDescription = true },
- new Dictionary() { { "level", "1" } });
-```
-The example activates a predefined way to add a description text. If you want to customize the description text even further, you can pass in a function. The example below passes in a function that will be evaluated when the code list is populated and will return a combination of the classification code and the notes field, separated by a colon.
-
-```csharp
-services.AddSSBClassificationCodelistProvider(
- "næring",
- Classification.IndustryGrouping,
- new ClassificationOptions()
- {
- MapDescriptionFunc = (classificationCode) => $"{classificationCode.Code}: {classificationCode.Notes}"
- },
- new Dictionary() { { "level", "1" } });
-```
-
-### Add a code list from SSB that is not available in the `Classification` enum.
-Currently, only a small subset of the available code lists from SSB is included in the `Classification` enum. The enum is essentially just a more readable version of the underlying ID used by SSB. But in our case, it also serves as a way to indicate which code lists we have explicitly tested against. If you find a code list you would like to use, you can specify its ID directly instead of using the enum.
-
-```csharp
- services.AddSSBClassificationCodelistProvider("næring", 6);
-```
-
-[Overview of available code lists from SSB](https://www.ssb.no/klass/) or [here for the JSON variant](https://data.ssb.no/api/klass/v1/classifications).
\ No newline at end of file
diff --git a/content/app/development/data/options/common-codelists/_index.nb.md b/content/app/development/data/options/common-codelists/_index.nb.md
deleted file mode 100644
index 86f0c36db5a..00000000000
--- a/content/app/development/data/options/common-codelists/_index.nb.md
+++ /dev/null
@@ -1,99 +0,0 @@
----
-title: Felles standard kodelister
-linktitle: Felles standard kodelister
-description: Hvordan bruke felles standard kodelister på tvers av applikasjoner i Altinn 3?
-toc: false
-weight: 200
----
-
-{{%notice info%}}
-Denne funksjonaliteten krever at applikasjonen benytter minimum [versjon 7.8.0](https://github.com/Altinn/app-lib-dotnet/releases/tag/v7.8.0) av Altinn.App.Core nuget pakken.
-{{% /notice%}}
-
-## Hva er felles standard kodelister?
- Felles standard kodelister er lister som land, fylker, kommuner, kjønn, sivilstatus etc som man kan benytte i sin applikasjon uten at man selv trenger å vedlikeholde disse kodelistene selv. Se [komplett liste](https://github.com/Altinn/codelists-lib-dotnet#available-codelists) over tilgjengelige kodelister.
-
-
- Kodelistene er laget som en egen [nuget pakke](https://www.nuget.org/packages/Altinn.Codelists) man kan importere inn i sin applikasjon. Dette er gjort for å holde kjernen i en Altinn 3 applikasjon så liten som mulig og for å kunne nye release og ta i bruke nye kodelister uten å være avhengig av å måtte oppgraddere applikasjonen (utover v7.8.0).
-
-## Hvordan legge til felles standard kodelister i applikasjonen?
-### 1. Legg til referanse til [Altinn.Codelists NuGet-pakken](https://www.nuget.org/packages/Altinn.Codelists)
- Åpne kommandolinjen til repoet for applikasjonen din og naviger til App-mappen der App.csproj-filen ligger, og kjør følgende kommando:
-
- ```shell
- dotnet add package Altinn.Codelists
- ```
- Dette vil legge til den nyeste stabile versjonen av pakken i løsningen din.
-
- Som et alternativ kan du redigere applikasjonens App.csproj-fil direkte ved å legge til referansen nedenfor i `` der du har pakke-referanser.
- ```xml
-
- ```
- Merk at du da må angi versjonen du ønsker eksplisitt. Se lenken i trinn én for tilgjengelige versjoner.
-
-### 2. Registrer kodelistene i appens DI-kontainer
- Legg til følgende i Program.cs-filen din:
- ```csharp
- services.AddAltinnCodelists();
- ```
- Ved å kalle denne metoden vil du registrere alle kodelistene på tvers av alle kilder. Du kan også registrere kodelistene én og én hvis du vil ha kontroll på hvilke kodelister som er tatt i bruk eller konfigurere og tilpasse oppsettet av kodelisten.
-
-### 3. Koble applikasjonen din til kodeverket du ønsker å bruke
- Se (dokuemntasjon)[https://github.com/Altinn/codelists-lib-dotnet#available-codelists] nedenfor for tilgjengelige kodelister.
-
- Du kan gjøre dette enten ved hjelp av [Altinn Studio](https://altinn.studio) og konfigurere *Kodeliste-ID* for komponenten din i brukergrensesnittet.
-
- Eller du kan konfigurere komponenten ved å redigere egenskapen `optionsId` i FormLayout.json i henhold til [dokumentasjonen](/app/development/data/options/#connect-the-component-to-options-code-list).
-
-## Tilpasset konfigurasjon
-Mens konfigurasjonen nevnt ovenfor der du kaller `services.AddAltinnCodelists();` vil legge til alle tilgjengelige kodelister med standardverdier, kan det være tilfeller der du ønsker å tilpasse konfigurasjonen av en kodeliste. Eksemplene under vil variere noe avhengig av kilden til kodelisten siden de ulike kildene tilbyr ulike muligheter.
-
-### Legg til en kodeliste med egendefinert kodeliste-ID
-Hvis du ikke ønsker å bruke standard kodeliste-ID, eller bare ønsker å registrere kodelister som er relevante for appen din, kan du registrere hver kodeliste individuelt.
-
-Eksemplet benytter en kodeliste fra SSB og overstyrer kodeliste id'en:
-```csharp
-services.AddSSBClassificationCodelistProvider("næring", Classification.IndustryGrouping);
-```
-
-### Legg til en kodeliste med standardparametere
-Noen av kodelistene godtar parametere som styrer hva som blir returnert.
-
-Eksemplet benytter en kodeliste fra SSB og spesifiserer et filter for å bare hente verdier fra første nivå (denne spesifikke kodelisten er hierarkisk).
-
-```csharp
-services.AddSSBClassificationCodelistProvider("næring", Classification.IndustryGrouping, new Dictionary() { { "level", "1" } });
-```
-Standardparameterne er en samling av navn/verdi-par som gjør det mulig å sende inn hvilken som helst parameter som kan plukkes opp av implementasjonen av kodelistetilbyderen.
-
-### Legg til en kodeliste som har støtte for beskrivelses- og/eller hjelpetekstverdier
-Mens en vanlig kodeliste bare er nøkkel/verdi-par, kan du utvide dette ved å legge til beskrivelses- og hjelpetekster som gir et mer beskrivende brukergrensesnitt.
-
-Følgende eksempel gjør at notatfeltet fra SSB-klassifiseringen fyller ut beskrivelsesteksten.
-
-```csharp
-services.AddSSBClassificationCodelistProvider("næring", Classification.IndustryGrouping,
- new ClassificationOptions() { MapNotesToDescription = true },
- new Dictionary() { { "level", "1" } });
-```
-Eksemplet aktiverer en forhåndsdefinert måte å legge til en beskrivelsestekst på. Hvis du vil tilpasse beskrivelsesteksten enda mer, kan du sende inn en funksjon. Eksemplet under sender inn en funksjon som vil bli evaluert når kodelisten fylles ut, og vil returnere en kombinasjon av klassifiseringskoden og notatfeltene, separert med kolon.
-
-```csharp
-services.AddSSBClassificationCodelistProvider(
- "næring",
- Classification.IndustryGrouping,
- new ClassificationOptions()
- {
- MapDescriptionFunc = (classificationCode) => $"{classificationCode.Code}: {classificationCode.Notes}"
- },
- new Dictionary() { { "level", "1" } });
-```
-
-### Legg til en kodeliste fra SSB som ikke er tilgjengelig i `Classification`-enumen.
-For øyeblikket er bare et lite utvalg av de tilgjengelige kodelistene fra SSB inkludert i `Classification`-enumen. Enumen er egentlig bare en mer lesbar versjon av den underliggende id'en som SSB benytter. Men i vårt tilfelle fungerer den også som en måte å fortelle hvilke kodelister vi har testet eksplisitt mot. Hvis du finner en kodeliste du vil bruke, kan du spesifisere id'en direkte i stedet for enumen.
-
-```csharp
- services.AddSSBClassificationCodelistProvider("næring", 6);
-```
-
-[Oversikt over tilgjengelige kodelister fra SSB](https://www.ssb.no/klass/) eller [her for JSON varianten](https://data.ssb.no/api/klass/v1/classifications).
\ No newline at end of file
diff --git a/content/app/development/data/options/dynamic-codelists/_index.en.md b/content/app/development/data/options/dynamic-codelists/_index.en.md
deleted file mode 100644
index d206730f076..00000000000
--- a/content/app/development/data/options/dynamic-codelists/_index.en.md
+++ /dev/null
@@ -1,168 +0,0 @@
----
-title: Dynamic code lists generated runtime
-linktitle: Dynamic code lists
-description: How to create dynamic code lists created during runtime execution of the application?
-toc: false
-weight: 100
----
-
-As an alternative to the static files you can have code that determines what the lists should be during runtime. This makes it possible to expose dynamic values that for instance are filtered or looked up in external sources. Dynamic code lists can either be open and accessible to all or secured and limited to those with read access to the instance.
-
-In versions prior to 4.24.0 this was done by overriding the `GetOptions` method in `App.cs`. This method is now deprecated and is replaced by putting the option code in separate classes implementing an interface and registering the implementation in the application dependency injection container. This allows for better separation, inject dependencies into the constructor, pass in language and other query parameters and generally handle all aspects of the implementation as you see fit.
-
-For code lists that are open you implement the `IAppOptionsProvider` interface and for code lists that should be secured you implement the `IInstanceAppOptionsProvider` interface. The pattern is the same for both, and the models returned is the same, but the implementation is kept separate to avoid exposing data that should be secured.
-
-### Open dynamic code lists
-
-Below you find an example of how to implement a open custom options provider. The url will will still be exposed from the same endpoint as before `{org}/{app}/api/options/countires`.
-
-```C#
-using Altinn.App.Common.Models;
-using Altinn.App.PlatformServices.Options;
-using System.Collections.Generic;
-using System.Threading.Tasks;
-
-namespace Altinn.App.Core
-{
- public class CountryAppOptionsProvider : IAppOptionsProvider
- {
- public string Id { get; set; } = "countries";
-
- public Task GetAppOptionsAsync(string language, Dictionary keyValuePairs)
- {
- var options = new AppOptions
- {
- Options = new List
- {
- new AppOption
- {
- Label = "Norway",
- Value = "47"
- },
- new AppOption
- {
- Label = "Sweden",
- Value = "46"
- }
- }
- };
-
- return Task.FromResult(options);
- }
- }
-}
-
-```
-
-For your implementation to be picked up you need to add the following line in your `Startup.cs` (or `Program.cs` in .NET 6):
-
-```csharp
-services.AddTransient();
-```
-
-Note that you can have multiple registrations of this interface. The correct implementation is resolved by finding the one with the correct id.
-
-The interface has a property `Id`, which should be set to the optionId, and a method `GetAppOptionsAsync` for resolving the options. This method accepts a language code and a dictionary of key/value pairs. Both parameters will typically be query parameters picked up from the controller and passed in. Although language could be put in the dictionary as well it's decided to be explicit on this particular parameter.
-
-> Language codes should be based on ISO 639-1 or the W3C IANA Language Subtag Registry. The latter is built upon the ISO 639-1 standard but is guaranties uniques of the codes, where as ISO 639-1 have conflicting usage for some codes.
->
-
-### Secured dynamic options
-
-{{%notice warning%}}
-
-**NOTICE:** to use this functionality the app must use version >= 4.27.0 of the nuget packages `Altinn.App.PlatformServices`, `Altinn.App.Common` and `Altinn.App.Api`.
-
-{{%/notice%}}
-
-If you want to expose options that are sensitive you can use `IInstanceAppOptionsProvider`, which will validate that the user has read rights defined in the authorization policy defined in the app's `policy.xml`-file.
-Below you find an example of how to implement a secured custom options provider. The `IInstanceAppOptionsProvider` interface must be implemented, and a `secure`-prop must be added to the component.
-The following option will be exposed at `/{org}/{app}/instances/{instanceOwnerId}/{instanceGUID}/options/children`.
-
-```C#
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using Altinn.App.Common.Models;
-using Altinn.App.PlatformServices.Models;
-
-namespace Altinn.App.Core
-{
- public class ChildrenAppOptionsProvider : IInstanceAppOptionsProvider
- {
- public string Id { get; set; } = "children";
-
- public Task GetInstanceAppOptionsAsync(InstanceIdentifier instanceIdentifier, string language, Dictionary keyValuePairs)
- {
- // ...
- // Some custom code to get the list of children from the instance owner
- // ...
-
- var options = new AppOptions
- {
- Options = new List
- {
- new AppOption
- {
- Label = "Ole",
- Value = "1"
- },
- new AppOption
- {
- Label = "Dole",
- Value = "2"
- },
- new AppOption
- {
- Label = "Doffen",
- Value = "3"
- }
- }
- };
-
- return Task.FromResult(options);
- }
- }
-}
-
-```
-
-For your implementation to be picked up you need to add the following line in your `Startup.cs` (or `Program.cs` in .NET 6):
-
-```csharp
-services.AddTransient();
-```
-
-Note that you can have multiple registrations of this interface. The correct implementation is resolved by finding the one with the correct id.
-
-The interface has a property `Id`, which should be set to the optionId, and a method `GetInstanceAppOptionsAsync` for resolving the options. This method accepts a language code and a dictionary of key/value pairs. Both parameters will typically be query parameters picked up from the controller and passed in. Although language could be put in the dictionary as well it's decided to be explicit on this particular parameter. These parameters are the same as for the open variant of options, in addition the instance id (which identifies both the instance owner and the instance itself) will be passed in.
-
-The final configuration needed is the `secure`-boolean on the component. Example:
-
-```json {hl_lines=[13]}
- {
- "id": "dropdown-component",
- "type": "Dropdown",
- "textResourceBindings": {
- "title": "Some title",
- "description": "Some description"
- },
- "dataModelBindings": {
- "simpleBinding": "some.field"
- },
- "required": true,
- "optionsId": "children",
- "secure": true
- }
-```
-
-### Combining code lists
-Sometimes you might want to make a code list that combines multiple code lists. A typical example might be a code list from a library, that needs an extra empty value. (Eg. a list of norwegian counties that does not allow selection of abroad).
-
-From version 8.0.1, you can use the `AddJoinedAppOptions` to do this without writing custom code.
-
-```C#
-services.AddSSBClassificationCodelistProvider("fylker", Classification.Counties);
-services.AddJoinedAppOptions("fylker-med-utland", "fylker", "utland");
-```
-
-The list `"utland"` must be another registrered list. Either an `IAppOptionsProvider` or a `.json` file in `App/options/`.
\ No newline at end of file
diff --git a/content/app/development/data/options/dynamic-codelists/_index.nb.md b/content/app/development/data/options/dynamic-codelists/_index.nb.md
deleted file mode 100644
index 32431aaf876..00000000000
--- a/content/app/development/data/options/dynamic-codelists/_index.nb.md
+++ /dev/null
@@ -1,169 +0,0 @@
----
-title: Dynamiske kodelister generert under kjøring av applikasjonen
-linktitle: Dynamiske kodelister
-description: Hvordan lage dynamiske kodelister som bygges opp når applikasjonen kjører?
-toc: false
-weight: 100
----
-
-I app-templaten har man også mulighet til å ha dynamisk kodelister som bestemmes under kjøringen av appen. Dette muligjør det å eksponere dynamiske verdier som kan filtreres eller hentes fra andre kilder. Dynamiske kodelister kan enten være åpne, dvs. alle brukere når de, eller de kan være sikret gjennom at du må ha tilgang til instansen for å se de.
-
-I versjoner eldre enn 4.24.0 ble dette gjort ved å legge til kode i metoden `GetOptions` i `App.cs`. Denne metoden er nå erstattet ved at man legger til egne klasser for hver kodeliste som implementerer et interface og at man registrerer denne i applikasjonen sin 'dependency injection cointainer'. Dette gir bedre skille mellom de ulike kodelistene, muliggjør å sende avhengigheter inn i konstruktøren til klassen, sende inn språk og andre parametere og generelt håndtere alle aspekter av implementeringen slik du selv ønsker det.
-
-For kodelister som er åpne implementerer man `IAppOptionsProvider` interfacet, mens for kodelister som skal være sikret implementerer man `IInstanceAppOptionsProvider`. Fremgangsmåten er den samme for begge to og modellen som returneres er lik. Men implementeringen holdes adskilt for ikke å eksponere verdier som skulle vært sikret.
-
-### Åpne dynamiske kodelister
-
-Under finner du et eksempel på hvordan dette kan settes opp for en åpen kodeliste. Her vil man få ut den oppsatte kodelisten i det appen får et kall mot `{org}/{app}/api/options/countries`.
-
-```C#
-using Altinn.App.Common.Models;
-using Altinn.App.PlatformServices.Options;
-using System.Collections.Generic;
-using System.Threading.Tasks;
-
-namespace Altinn.App.Core
-{
- public class CountryAppOptionsProvider : IAppOptionsProvider
- {
- public string Id { get; set; } = "countries";
-
- public Task GetAppOptionsAsync(string language, Dictionary keyValuePairs)
- {
- var options = new AppOptions
- {
- Options = new List
- {
- new AppOption
- {
- Label = "Norway",
- Value = "47"
- },
- new AppOption
- {
- Label = "Sweden",
- Value = "46"
- }
- }
- };
-
- return Task.FromResult(options);
- }
- }
-}
-
-```
-
-For at denne implementasjonen skal plukkes opp av applikasjonen må den registreres i `Startup.cs` (eller `Program.cs` i .NET 6):
-
-```csharp
-services.AddTransient();
-```
-
-Legg merke til at du kan ha mange implementasjoner av dette interfacet. Den rette implementasjonen finnes gjennom å se på hvilken kodeliste id det spørres etter.
-
-Interfacene har en egenskap `Id`, som skal settes til til den id'en man skal spørre etter, og en metode `GetAppOptionsAsync` som returnerer selve kodelisten. Denne metoden tar i mot språk og en liste med key/value par som typisk er query parametre som plukkes opp av kontrolleren og sendes inn. Selv om språk kunne vært et key/value par og sånn sett hvert i listen, så er denne lagt utenfor for å være eksplisitt på språk.
-
-> Språkkoder bør baseres på ISO 639-1 standarden eller W3C IANA Language Subtag Registry standarden. Sistnevnte bygger på ISO 639-1 standarden men garanterer at alle kodene er unike, noe ISO 639-1 ikke gjør.
->
-
-### Sikrede dynamiske kodelister
-
-{{%notice warning%}}
-
-**MERK:** for å benytte denne funksjonaliteten må man versjon >= 4.27.0 av nugetpakkene `Altinn.App.PlatformServices`, `Altinn.App.Common` og `Altinn.App.Api`.
-
-{{%/notice%}}
-
-Om du ønsker å eksponere kodelister som inneholder sensitive data som man ikke ønsker skal være tilgjengelige i et åpent API kan man benytte `IInstanceAppOptionsProvider`. Disse kodelistene validerer at brukeren har lesetilgang definert i applikasjonens `policy.xaml`-fil.
-Under finner du et eksempel på man setter opp en sikret kodeliste. Interfacet `IInstanceAppOptionsProvider` må implementeres og en `secure` boolean må legges på komponenten.
-Her vil man få ut den oppsatte kodelisten i det appen får et kall mot `/{org}/{app}/instances/{instanceOwnerId}/{instanceGUID}/options/children`.
-
-```C#
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using Altinn.App.Common.Models;
-using Altinn.App.PlatformServices.Models;
-
-namespace Altinn.App.Core
-{
- public class ChildrenAppOptionsProvider : IInstanceAppOptionsProvider
- {
- public string Id { get; set; } = "children";
-
- public Task GetInstanceAppOptionsAsync(InstanceIdentifier instanceIdentifier, string language, Dictionary keyValuePairs)
- {
- // ...
- // Some custom code to get the list of children from the instance owner
- // ...
-
- var options = new AppOptions
- {
- Options = new List
- {
- new AppOption
- {
- Label = "Ole",
- Value = "1"
- },
- new AppOption
- {
- Label = "Dole",
- Value = "2"
- },
- new AppOption
- {
- Label = "Doffen",
- Value = "3"
- }
- }
- };
-
- return Task.FromResult(options);
- }
- }
-}
-
-```
-
-For at denne implementasjonen skal plukkes opp av applikasjonen må den registreres i `Startup.cs` (eller `Program.cs` i .NET 6):
-
-```csharp
-services.AddTransient();
-```
-
-Legg merke til at du kan ha mange implementasjoner av dette interfacet. Den rette implementasjonen finnes gjennom å se på hvilken kodeliste id det spørres etter.
-
-Interfacene har en egenskap `Id`, som skal settes til til den id'en man skal spørre etter, og en metode `GetAppOptionsAsync` som returnerer selve kodelisten. Denne metoden tar i mot språk og en liste med key/value par som typisk er query parametre som plukkes opp av kontrolleren og sendes inn. Selv om språk kunne vært et key/value par og sånn sett hvert i listen, så er denne lagt utenfor for å være eksplisitt på språk.
-
-Siste konfigurasjon som trengs er å legge til `secure`-boolean på den aktuelle komponenten. Eksempel:
-
-```json {hl_lines=[13]}
- {
- "id": "dropdown-component",
- "type": "Dropdown",
- "textResourceBindings": {
- "title": "Some title",
- "description": "Some description"
- },
- "dataModelBindings": {
- "simpleBinding": "some.field"
- },
- "required": true,
- "optionsId": "children",
- "secure": true
- }
-```
-
-
-### Kombinere kodelister
-Noen ganger kan man ha ønske om å lage en kodeliste som er en kombinasjon av flere ulike kodelister. Et typisk eksempel er hvis man bruker et kodelistebibliotek og ønsker å legge til alternativ for for å ikke svare. (Eg. en kodeliste med fylker som mangler valg for "utlandet")
-
-Fra og med version 8.0.1 kan du bruke `AddJoinedAppOptions` til å kombinenere kodelister på denne måten.
-
-```C#
-services.AddSSBClassificationCodelistProvider("fylker", Classification.Counties);
-services.AddJoinedAppOptions("fylker-med-utland", "fylker", "utland");
-```
-
-Listen ``"utland"`` må være en egen liste. Enten registrert som en `IAppOptionsProvider` eller med en `.json` fil i `App/options/`.
\ No newline at end of file
diff --git a/content/app/development/data/options/repeating-group-codelists/_index.en.md b/content/app/development/data/options/repeating-group-codelists/_index.en.md
deleted file mode 100644
index d95cf0ba03d..00000000000
--- a/content/app/development/data/options/repeating-group-codelists/_index.en.md
+++ /dev/null
@@ -1,66 +0,0 @@
----
-title: Code lists based on repeating groups from the data model
-linktitle: From repeating groups
-description: How to configure code lists that gets it's values from a repeating group from the datamodel?
-weight: 150
----
-
-Traditional options are based on resources fetched from the backend.
-This approach differs a bit from this, as it enables setting up a direct connection from the options to the form data that is stored in app frontend.
-A use case here would typically be if the user fills out a repeating list of data that should later be selected in a dropdown/checkbox/radiobutton.
-
-### Configuration
-
-To set up options from the data model we have set up a new property on `RadioButtons`, `Checkboxes`, and `Dropdown`-components called `source`.
-This property contains the fields `group`, `label`, and `value`. Example:
-
-```json {hl_lines=["5-9"]}
- {
- "id": "dropdown-component-id",
- "type": "Dropdown",
- ...
- "source": {
- "group": "some.group",
- "label": "dropdown.label",
- "value": "some.group[{0}].someField"
- }
- },
-```
-
-Explanation:
-
-- **group** - the group field in the data model to base the options on
-- **label** - a reference to a text id to be used as the label for each iteration of the group, see more below.
-- **value** - a reference to a field in the group that should be used as the option value. Notice that we set up this `[{0}]` syntax. Here the `{0}` will be replaced by each index of the group.
-
-Notice that the **value** field must be unique for each element. If the repeating group does not contain a field which is unique for each item it is recommended to add a field to the data model that can be used as identifier, for instance a GUID.
-
-As for the **label** property, we have to define a text resource that can be used as a label for each repetition of the group.
-This follows similar syntax as the **value**, and will also be familiar if you have used [variables in text](../../../ux/texts).
-
-Example text resource connected:
-
-```json
-{
- "language": "nb",
- "resources": [
- {
- "id": "dropdown.label",
- "value": "Person: {0}, Age: {1}",
- "variables": [
- {
- "key": "some.group[{0}].name",
- "dataSource": "dataModel.default"
- },
- {
- "key": "some.group[{0}].age",
- "dataSource": "dataModel.default"
- }
- ]
- }
- ]
-}
-```
-
-In the example above we have two parameters in the text which is referencing fields in the group.
-We also recognize the `[{0}]` syntax in the `key` prop which enables the usage of this label for each index in the group.
diff --git a/content/app/development/data/options/repeating-group-codelists/_index.nb.md b/content/app/development/data/options/repeating-group-codelists/_index.nb.md
deleted file mode 100644
index bfafc5c1cb4..00000000000
--- a/content/app/development/data/options/repeating-group-codelists/_index.nb.md
+++ /dev/null
@@ -1,66 +0,0 @@
----
-title: Kodelister fra repeterede grupper i datamodellen
-linktitle: Fra repeterende grupper
-description: Hvordan konfigurere kodelister som får verdiene sine basert på verdier hentet fra en repeterende gruppe i datamodellen?
-weight: 150
----
-
-Tradisjonelle options baserer seg på ressurser hentet fra backend.
-Denne måten å gjøre ting på endrer seg litt på dette, da det muliggjør å sette opp en direkte kobling fra komponent til skjemadata som ligger lagret i app frontend.
-Et typisk bruksområde for dette er om brukeren fyller ut en liste med data som man senere i skjema ønsker å kunne velge mellom i en nedtrekksliste eller liknende.
-
-### Konfigurasjon
-
-For å sette opp options fra datamodellen har vi laget en nytt objekt som kan brukes på komponentene `RadioButtons`, `Checkboxes` og `Dropdown` som vi har kalt `source`.
-Dette nye objektet inneholder feltene `group`, `label` og `value`. Eksempel:
-
-```json {hl_lines=["5-9"]}
- {
- "id": "dropdown-component-id",
- "type": "Dropdown",
- ...
- "source": {
- "group": "some.group",
- "label": "dropdown.label",
- "value": "some.group[{0}].someField"
- }
- },
-```
-
-Forklaring:
-
-- **group** - gruppen i datamodellen man baserer options på.
-- **label** - en referanse til en text id som brukes som label for hver iterasjon av gruppen. Se mer under.
-- **value** - en referanse til det feltet i gruppen som skal bruke som option verdi. Legg merke til `[{0}]` syntaxen. Her vil `{0}` bli erstattet med den aktuelle indeksen for hvert element i gruppen.
-
-Merk at **value** feltet må være unikt for hvert element. Om man ikke har et felt som er unik anbefales det å legge på et ekstra felt i datamodellen som kan benyttes som identifikator f.eks en GUID eller liknende.
-
-For **label** feltet må vi definere en tekst ressurs som kan bli brukt som label for hver repetisjon av gruppen.
-Dette følger samme syntax som **value**, og vil være kjent for deg om du har brukt [variabler i tekst](../../../ux/texts).
-
-Eksempel:
-
-```json
-{
- "language": "nb",
- "resources": [
- {
- "id": "dropdown.label",
- "value": "Person: {0}, Age: {1}",
- "variables": [
- {
- "key": "some.group[{0}].name",
- "dataSource": "dataModel.default"
- },
- {
- "key": "some.group[{0}].age",
- "dataSource": "dataModel.default"
- }
- ]
- }
- ]
-}
-```
-
-I dette eksempelet har vi satt opp to parametere i teksten som refererer til felter i gruppen.
-Vi kjenner også igjen `[{0}]` syntaksen i `key` feltet som muliggjør gjenbruk av labelen for hver index i gruppen.
diff --git a/content/app/development/data/options/static-codelists/_index.en.md b/content/app/development/data/options/static-codelists/_index.en.md
deleted file mode 100644
index cdc2c69842e..00000000000
--- a/content/app/development/data/options/static-codelists/_index.en.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-title: Static code lists from the application repository
-linktitle: Static code lists
-description: How to configure static code lists from the application repository.
-toc: false
-weight: 50
----
-
-By adding json based option files in the application repository, the application will automatically read the file and expose it through the options api. For this to work, the files must be placed in the `App/options/` folder and be named according to the following conventions `{optionId}.json` for the application to recognize them.
-
-For example if you have a list of countries in a file named `countries.json`, the optionId would be `countries`, and would be exposed through the api at `{org}/{app}/api/options/countries`. The static code lists should be in a special format as shown below:
-
-```json
-[
- {
- "value": "norway",
- "label": "Norge"
- },
- {
- "value": "denmark",
- "label": "Danmark"
- },
- {
- "value": "sweden",
- "label": "country.label.sweden"
- }
-]
-```
-
-Note that the `label` field can be a key to a text resource (as shown above for sweden) or plain text.
\ No newline at end of file
diff --git a/content/app/development/data/options/static-codelists/_index.nb.md b/content/app/development/data/options/static-codelists/_index.nb.md
deleted file mode 100644
index 2f95579bee1..00000000000
--- a/content/app/development/data/options/static-codelists/_index.nb.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-title: Statiske kodelister fra applikasjon
-linktitle: Statiske kodelister
-description: Hvordan konfigurere statiske kodelister levert fra applikasjonen?
-toc: false
-weight: 50
----
-
-Ved å legge json-lister i options mappen i app repo vil appen automatisk lese denne filen og eksponere det gjennom options-apiet.
-Options filene må ligge under `App/options/` og vil bli differensiert ved hjelp av navngivningen på json-filen. F.eks `land.json`. Her vil da optionsId være `land`, og vil være eksponert gjennom endepunktet `{org}/{app}/api/options/land`.
-Kodelistene må være på et spesifikt format. Eksempel på en kodeliste som inneholder land (`App/options/land.json`):
-
-```json
-[
- {
- "value": "norway",
- "label": "Norge"
- },
- {
- "value": "denmark",
- "label": "Danmark"
- },
- {
- "value": "sweden",
- "label": "country.label.sweden"
- }
-]
-```
-
-`label` feltet kan inneholde en tekstnøkkel til teskstressursene eller ren tekst.
diff --git a/content/app/development/data/prefill/_index.en.md b/content/app/development/data/prefill/_index.en.md
deleted file mode 100644
index b52ca980d55..00000000000
--- a/content/app/development/data/prefill/_index.en.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-title: Prefill
-linktitle: Prefill
-description: Pre-filling an instance with data.
-weight: 10
----
-As of today, Altinn offers three methods for prefilling data in an app for a user.
-These methods can be combined freely to reach the desired result.
-
-{{}}
diff --git a/content/app/development/data/prefill/_index.nb.md b/content/app/development/data/prefill/_index.nb.md
deleted file mode 100644
index 4e518b7d32b..00000000000
--- a/content/app/development/data/prefill/_index.nb.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-title: Preutfylling
-linktitle: Preutfylling
-description: Preutfylling av en instans med data
-weight: 10
----
-Altinn tilbyr i dag tre fremgangsmåter for å preutfylle data i en app for en sluttbruker.
-Disse metodene kan kombineres fritt for å oppnå ønsket resultat
-
-{{}}
diff --git a/content/app/development/data/prefill/config/_index.en.md b/content/app/development/data/prefill/config/_index.en.md
deleted file mode 100644
index 9c0cb7d1345..00000000000
--- a/content/app/development/data/prefill/config/_index.en.md
+++ /dev/null
@@ -1,162 +0,0 @@
----
-title: Prefilling data using configuration
-linktitle: Config
-description: How to configure prefill for an app using configuration files.
-toc: false
-weight: 200
----
-
-Using configuration only, Altinn apps support prefill with data from the Central Coordinating Register (Enhetsregisteret), the National Population Register (Folkeregisteret) and user profile in Altinn.
-
-By following the description below, you will during instantiation of a form prefill the data model with
-the defined values obtained from Altinns data base.
-
-## Prefill from national register and user profile
-
-### Setup of prefill in the application repository
-
-Create a new json file in the app repo under `App/models`.
-The name of the file should contain the name of the data model and have the postfix ".prefill.json".
-If the data model is called _appModel_ you should now be able to find these three files in the map:
-_appModel.metadata.json_, _appModel.schema.json_, _appModel.prefill.json_
-
-Paste the code below into the file.
-
-```json
-{
- "$schema": "https://altinncdn.no/schemas/json/prefill/prefill.schema.v1.json",
- "allowOverwrite": true,
- "ER": {
- },
- "DSF": {
- },
- "UserProfile": {
- }
-}
-```
-
-### Configuration of _prefill.json_
-
-- **$schema** points to the json schema definition of the file. The current version is v1.
- Because of this file, Visual Studio Code will validate and offer intellisense/autocomplete when you edit the file locally.
-
-- **allowOverwrite** determines whether prefill defined in this file can overwrite a field in the data model if it already has a value.
-
-- **ER** here you enter fields from the data model that are to be prefilled with data from the Central Coordinating Register.
-Fields that are prefilled with ER-data will only have a value if you instantiate on behalf of an organization.
-Instantiation will fail if you attempt to prefill ER-data, but do not have an organization available.
-
-The example below will populate the field _Datamodell.Organisasjon.Organisasjonsnummer_ with the organization number retrieved from the Central Coordinating register.
-
-```json
-"ER": {
- "OrgNumber":"Datamodell.Organisasjon.Organisasjonsnummer"
-}
-```
-
-- **DSF** here you enter fields from the data model that are to be prefilled with data from the National Population
- Register.
- The field that is prefilled with DSF-data will only have a value if you instantiate on behalf of a person.
- Instantiation will fail if you attempt to prefill DSF-data, but do not have a person available.
-
-The example below will populate the field _Datamodell.Person.Nummer_ with the phone number retrieved from the National Population Register.
-
- ```json
-"DSF": {
- "TelephoneNumber":"Datamodell.Person.Nummer"
-}
-```
-
-- **UserProfile** here you enter fields from the data model that are to be prefilled with data from the users profile in Altinn.
-Note that it is the logged in user who instantiates the app the data is collected for.
-
-The example below will populate the field _Datamodell.Bruker.Epost_ with the email retrieved from the users profile in Altinn.
-
-```json
-"UserProfile": {
- "Email":"Datamodell.Bruker.Epost"
-}
-```
-
-### Available prefill values
-
-The JSON-schema definition of the prefill file is also available [here](https://altinncdn.no/schemas/json/prefill/prefill.schema.v1.json).
-The use of a schema enables editors, [e.g. Visual Studio Code](https://code.visualstudio.com/docs/languages/json#_mapping-in-the-json),
-to validate and offer intellisense for faster editing.
-
-#### The National Population Register
-
-The personal data that is exposed is attached to the person the form is instantiated on behalf of. If Ola Nordmann were to instantiate a form on behalf of
-Kari Nordmann, it would be Kari's data that would be exposed.
-Available values for prefill includes:
-
-- SSN
-- Name
-- FirstName
-- MiddleName
-- LastName
-- TelephoneNumber
-- MobileNumber
-- MailingAddress
-- MailingPostalCode
-- MailingPostalCity
-- AddressMunicipalNumber
-- AddressMunicipalName
-- AddressStreetName
-- AddressHouseNumber
-- AddressHouseLetter
-- AddressPostalCode
-- AddressCity
-
-#### The Central Coordinating Register
-
-The unit exposed is that which is attached to the organization a form is instantiated on behalf of.
-Available values for prefill includes:
-
-- OrgNumber
-- Name
-- UnitType
-- TelephoneNumber
-- MobileNumber
-- FaxNumber
-- EMailAddress
-- InternetAddress
-- MailingAddress
-- MailingPostalCode
-- MailingPostalCity
-- BusinessAddress
-- BusinessPostalCode
-- BusinessPostalCity
-
-#### User profile
-
-The user profile exposed is the profile belonging to the one who instantiated the service. If Ola Nordmann instantiates
-a form on behalf of
-Kari Nordmann, the data retrieved from here would belong to Ola. For the objects Party.Organization and Party.Person,
-you will find the same fields that are included in ER and DSF-prefill. Note that Party.Organization will be null if the
-user is logged in as an individual, and the equivalent if they are logged in with a business user. The prefill will fail
-if the object you prefill from does not exist, so if you wish to dynamically prefill based on these values it has to be
-setup as [custom prefill.](../custom/).
-Available values for prefill includes:
-
-- UserId
-- UserName
-- PhoneNumber
-- Email
-- PartyId
-- Party.PartyId
-- Party.PartyTypeName
-- Party.OrgNumber
-- Party.SSN
-- Party.UnitType
-- Party.Name
-- Party.isDeleted
-- Party.OnlyHierarchyElementWithNoAccess
-- Party.Person
-- Party.Organization
-- Party.ChildParties
-- UserType
-- ProfileSettingPreference.Language
-- ProfileSettingPreference.PreSelectedPartyId
-- ProfileSettingsPreference.DoNotPromptForParty
-
diff --git a/content/app/development/data/prefill/config/_index.nb.md b/content/app/development/data/prefill/config/_index.nb.md
deleted file mode 100644
index 0f92e07768c..00000000000
--- a/content/app/development/data/prefill/config/_index.nb.md
+++ /dev/null
@@ -1,234 +0,0 @@
----
-title: Preutfylling av data med konfigurasjon
-linktitle: Konfigurasjon
-description: Hvordan konfigurere prefill for en app.
-toc: false
-weight: 200
----
-
-Ved bruk av kun konfigurasjon støtter Altinn apps prefill med data fra Enhetsregisteret, Folkeregisteret og brukerprofil i Altinn.
-
-Ved å følge beskrivelsen nedenfor vil man under instansiering av et skjema preutfylle datamodellen med
-de definerte verdiene hentet fra Altinns database.
-
-## Prefill fra nasjonale register og brukerprofil
-
-### Oppsett av prefill i applikasjons repository
-
-Opprett en ny json-fil i app repoet under `App/models`.
-Navnet på filen skal inneholde navnet på datamodellen og ha postfix ".prefill.json".
-Dersom datamodellen din heter _appModel_ skal du nå kunne finne disse tre filene i mappen:
-_appModel.metadata.json_, _appModel.schema.json_, _appModel.prefill.json_
-
-Lim inn innholdet nedenfor i filen.
-
-```json
-{
- "$schema": "https://altinncdn.no/schemas/json/prefill/prefill.schema.v1.json",
- "allowOverwrite": true,
- "ER": {
- },
- "DSF": {
- },
- "UserProfile": {
- }
-}
-```
-
-### Konfigurering av _prefill.json_
-
-- **$schema** peker på json schema definisjonen til filen. Nåværende versjon er v1.
- Visual Studio Code vil pga. denne validere og tilby intellisense/autocomplete når du editerer filen lokalt.
-
-- **allowOverwrite** avgjør om prefill definert i denne filen kan overskrive et felt i datamodellen dersom det allerede har en verdi.
-
-- **ER** her legger man inn felter fra datamodellen som skal preutfylles med data fra enhetsregisteret.
-Felt som preutfylles med ER-data vil kun få en verdi dersom man instansierer på vegne av en organisasjon.
-Instansiering vil feile dersom man forsøker å preutfylle ER-data, men ikke har en organisasjon tilgjengelig.
-
-Eksempelet nedenfor vil populere feltet _Datamodell.Organisasjon.Organisasjonsnummer_ med organisasjonsnummeret hentet fra enhetsregisteret.
-
-```json
-"ER": {
- "OrgNumber":"Datamodell.Organisasjon.Organisasjonsnummer"
-}
-```
-
-- **DSF** her legger man inn felter fra datamodellen som skal preutfylles med data fra folkeregistret.
-Feltet som preutfylles med DSF-data vil kun få en verdi dersom man instansierer på vegne av en person.
-Instansiering vil feile dersom man forsøker å preutfylle DSF-data, men ikke har en person tilgjengelig.
-
-Eksempelet nedenfor vil populere feltet _Datamodell.Person.Nummer_ med telefonnummer henter fra folkeregistret.
-
- ```json
-"DSF": {
- "TelephoneNumber":"Datamodell.Person.Nummer"
-}
-```
-
-- **UserProfile** her legger man inn felter fra datamodellen som skal preutfylles med data fra brukerens profil i Altinn.
-Merk at det er den innloggede brukeren som instansierer man henter ut data for.
-
-Eksempelet nedenfor vil populere feltet _Datamodell.Bruker.Epost med epost hentet fra brukerens profil i Altinn.
-
-```json
-"UserProfile": {
- "Email":"Datamodell.Bruker.Epost"
-}
-```
-
-### Tilgjengelige prefill verdier
-
-JSON-schema definisjonen av prefill-filen er også tilgjengelig [her](https://altinncdn.no/schemas/json/prefill/prefill.schema.v1.json).
-Bruken av et schema gjør at editorer, [f.eks. Visual Studio Code](https://code.visualstudio.com/docs/languages/json#_mapping-in-the-json),
-kan validere og tilby intellisense for raskere editering.
-
-#### Folkeregisteret
-
-Persondata som eksponeres er tilknyttet personen som skjemaet instansieres på vegne av. Dersom Ola Nordman instansierer et skjema på vegne av
-Kari Nordmann vil det være Kari sine data som eksponeres.
-Tilgjengelige verdier for prefill inkluderer:
-
-- SSN
-- Name
-- FirstName
-- MiddleName
-- LastName
-- TelephoneNumber
-- MobileNumber
-- MailingAddress
-- MailingPostalCode
-- MailingPostalCity
-- AddressMunicipalNumber
-- AddressMunicipalName
-- AddressStreetName
-- AddressHouseNumber
-- AddressHouseLetter
-- AddressPostalCode
-- AddressCity
-
-#### Enhetsregisteret
-
-Enheten som eksponeres er tilknyttet organisasjon som et skjema blir instansiert på vegne av.
-Tilgjengelige verdier for prefill inkluderer:
-
-- OrgNumber
-- Name
-- UnitType
-- TelephoneNumber
-- MobileNumber
-- FaxNumber
-- EMailAddress
-- InternetAddress
-- MailingAddress
-- MailingPostalCode
-- MailingPostalCity
-- BusinessAddress
-- BusinessPostalCode
-- BusinessPostalCity
-
-#### Brukerprofil
-
-Brukerprofilen som eksponeres er profilen til den som instansierer tjenesten. Dersom Ola Nordmann instansierer et skjema på vegne av Kari Nordmann
-vil data som hentes ut herfra være knyttet til Ola. For objektene Party.Organization og Party.Person vil man finne igjen samme feltene som man ser i ER og DSF-prefill. Merk at Party.Organization vil være null om brukeren er logget inn som en privatperson, og tilsvarende for Party.Person om man er logget inn med en virksomhetsbruker. Preutfyllingen vil feile om objektet man preutfyller fra ikke finnes. Om man ønsker å dynamisk preutfylle basert på disse verdiene må dette settes opp som [egendefinert prefill](../custom/).
-Tilgjengelige verdier for prefill inkluderer:
-
-- UserId
-- UserName
-- PhoneNumber
-- Email
-- PartyId
-- Party.PartyId
-- Party.PartyTypeName
-- Party.OrgNumber
-- Party.SSN
-- Party.UnitType
-- Party.Name
-- Party.isDeleted
-- Party.OnlyHierarchyElementWithNoAccess
-- Party.Person
-- Party.Organization
-- Party.ChildParties
-- UserType
-- ProfileSettingPreference.Language
-- ProfileSettingPreference.PreSelectedPartyId
-- ProfileSettingsPreference.DoNotPromptForParty
-
-## Egendefinert prefill
-
-Altinn apps muliggjør prefill av en instans med egendefinert data,
-det være seg resultet fra et API-kall, beregninger gjort under instansiering, eller annen logikk.
-Dette implementeres i metoden _DataCreation_ i filen _InstansiationHandler.cs_ som finnes i applikasjonsrepoet under `App/logic`.
-
-Eksempelet nedenfor populerer feltet _Bruker.FulltNavn_ i modellen _Datamodell_ med verdien "Test Testesen".
-
-```C# {hl_lines=[6]}
-public async Task DataCreation(Instance instance, object data)
-{
- if (data.GetType() == typeof(Datamodell))
- {
- Datamodell model = (Datamodell)data;
- model.Bruker.FulltNavn = "Test Testesen";
- }
-}
-```
-
-Bytt ut _Datamodell_ med navnet på C# klassen som er blitt generert basert på xsd-en som
-ble lastet opp i Altinn Studio. Dersom du bruker en egnet kodeeditor vil du kunne definere felter
-som skal populeres ved bruk av intellisense.
-
-Vær oppmerksom på at dersom du har komplekse typer i modellen din, må disse instansieres før man kan
-tilegne en verdi til ett av typens underelementer. Se eksempel nedenfor der vi legger til grunn at 'Bruker'
-og 'Name' er egne C# klasser.
-
-```C#
-public async Task DataCreation(Instance instance, object data)
-{
- if (data.GetType() == typeof(Datamodell))
- {
- Datamodell model = (Datamodell)data;
- Bruker b = new Bruker();
- b.Navn = new Name();
- b.Navn.FulltNavn = "Test Testesen";
- }
-}
-```
-
-### Instansiering med prefill
-
-Altinn apper støtter instansiering med prefill.
-Skjemadata legges ved i en multipart i instansieringsrequest som sendes til appen.
-Nedenfor ser du et eksempel på en request for å instansiere en app med prefill for partyId 12345.
-
-```http {hl_lines=[10]}
-Content-Type: multipart/form-data; boundary="abcdefg"
-Body:
-
---abcdefg
-Content-Type: application/json; charset=utf-8
-Content-Disposition: form-data; name="instance"
-
-{
- "instanceOwner": {
- "PartyId" : "12345"
- }
-}
-
---abcdefg
-Content-Type: application/xml
-Content-Disposition: form-data; name="Endring-av-navn"
-
-
-
-
-
- Ola Nordmann
-
-
- LANGØY MADS
-
-
-
-
---abcdefg--
-```
diff --git a/content/app/development/data/prefill/custom/_index.en.md b/content/app/development/data/prefill/custom/_index.en.md
deleted file mode 100644
index c103c240ae7..00000000000
--- a/content/app/development/data/prefill/custom/_index.en.md
+++ /dev/null
@@ -1,94 +0,0 @@
----
-title: Prefilling data using custom code
-linktitle: Custom
-description: How to code custom prefill of data in an app.
-toc: false
-weight: 300
----
-
-Altinn apps enable prefill of an instance with custom data,
-whether it is the result of an API call, calculations done under instantiation or other logic.
-
-{{}}
-
-{{}}
-In version 7 the way to do custom code instantiation has changed. We now use an dependency injection based approach
-instead of overriding methods. If you previously used to place your custom code in the DataCreation method in the _
-InstantiationHandler.cs_ class you will see that it's mostly the same.
-
-1. Create a class that implements the `IInstantiationProcessor` interface found in the `Altinn.App.Core.Features` namespace.
- You can name and place the file in any folder you like within your project, but we suggest you use meaningful namespaces like in any other .Net project.
- The example below populates the field _Bruker.FulltNavn_ in the model _Datamodell_ with the value "Test Testesen".
- ```C# {hl_lines=[23]}
- using System.Collections.Generic;
- using System.Threading.Tasks;
- using Altinn.App.Core.Features;
- using Altinn.App.Models;
- using Altinn.Platform.Storage.Interface.Models;
-
- public class Instantiation: IInstantiationProcessor
- {
- public async Task DataCreation(Instance instance, object data, Dictionary prefill)
- {
- if (data.GetType() == typeof(Datamodell))
- {
- Datamodell skjema = (Datamodell)data;
-
- Bruker b = new Bruker();
- b.Navn = new Name();
- b.FulltNavn = "Test Testesen";
-
- skjema.Bruker = b;
- }
-
- await Task.CompletedTask;
- }
- }
- ```
-2. Register you custom implementation in the _Program.cs_ class
- ```C#
- services.AddTransient();
- ```
- This ensures your custom code is known to the application and that it will be executed.
-
-{{}}
-{{}}
-
-This is implemented in the method _DataCreation_ in the file _InstantiationHandler.cs_ that can be found in the application repo under `App/logic`.
-
-The example below populates the field _Bruker.FulltNavn_ in the model _Datamodell_ with the value "Test Testesen".
-
-```C# {hl_lines=[6]}
-public async Task DataCreation(Instance instance, object data)
-{
- if (data.GetType() == typeof(Datamodell))
- {
- Datamodell model = (Datamodell)data;
- model.Bruker.FulltNavn = "Test Testesen";
- }
-}
-```
-
-Replace _Data model_ with the name on the C# class that has been generated based
-on the xsd uploaded to Altinn Studio. If you use a suitable code editor you will be able to define fields
-to be populated using intellisense.
-
-Keep in mind that if you have complex types in your model, these will need to be instantiated before you can
-assign a value to one of the type's sub elements. See the example below where we assume that `Bruker` and
-`Name` are separate C# classes.
-
-```C#
-public async Task DataCreation(Instance instance, object data)
-{
- if (data.GetType() == typeof(Datamodell))
- {
- Datamodell model = (Datamodell)data;
- Bruker b = new Bruker();
- b.Navn = new Name();
- b.Navn.FulltNavn = "Test Testesen";
- }
-}
-```
-{{}}
-
-{{}}
\ No newline at end of file
diff --git a/content/app/development/data/prefill/custom/_index.nb.md b/content/app/development/data/prefill/custom/_index.nb.md
deleted file mode 100644
index 9facd474dcc..00000000000
--- a/content/app/development/data/prefill/custom/_index.nb.md
+++ /dev/null
@@ -1,93 +0,0 @@
----
-title: Preutfylling av data med egendefinert kode
-linktitle: Egendefinert
-description: Hvordan kode egendefinert preutfylling i applikasjonen.
-toc: false
-weight: 300
----
-
-Altinn-apper muliggjør forhåndsutfylling av en instans med egne data,
-enten det er resultatet av et API-kall, beregninger gjort under instansiering eller annen logikk.
-
-{{}}
-
-{{}}
-I versjon 7 har vi endret måten preutfylling med egendefinert kode gjøres på. Vi benytter nå _dependency injection_ i stedet for overstyring av metoder. Hvis du tidligere plasserte koden din i _DataCreation_ metoden in _InstantiationHandler.cs_ klassen så vil du erfare at det er mer eller mindre det samme som nå gjøres.
-1. Opprett en klasse som implementerer `IInstantiationProcessor` grensesnittet som ligger i `Altinn.App.Core.Features` navnerommet.
- Du kan navngi og plassere filene i den mappestrukturen du selv ønsker i prosjektet ditt. Men vi anbefaler at du benytter meningsfulle navnerom som i et hvilket som helst annet .Net prosjekt.
- Eksempelet nedenfor populerer feltet _Bruker.FulltNavn_ i modellen _Datamodell_ med verdien "Test Testesen".
- ```C# {hl_lines=[23]}
- using System.Collections.Generic;
- using System.Threading.Tasks;
- using Altinn.App.Core.Features;
- using Altinn.App.Models;
- using Altinn.Platform.Storage.Interface.Models;
-
- public class Instantiation: IInstantiationProcessor
- {
- public async Task DataCreation(Instance instance, object data, Dictionary prefill)
- {
- if (data.GetType() == typeof(Datamodell))
- {
- Datamodell skjema = (Datamodell)data;
-
- Bruker b = new Bruker();
- b.Navn = new Name();
- b.FulltNavn = "Test Testesen";
-
- skjema.Bruker = b;
- }
-
- await Task.CompletedTask;
- }
- }
- ```
-2. Registrer din implementering i _Program.cs_ klassen
- ```C#
- services.AddTransient();
- ```
- Dette sørger for at din kode er kjent for applikasjonen og at koden blir kjørt når den skal.
-
-{{}}
-{{}}
-
-Altinn apps muliggjør prefill av en instans med egendefinert data,
-det være seg resultet fra et API-kall, beregninger gjort under instansiering, eller annen logikk.
-Dette implementeres i metoden _DataCreation_ i filen _InstansiationHandler.cs_ som finnes i applikasjonsrepoet under `App/logic`.
-
-Eksempelet nedenfor populerer feltet _Bruker.FulltNavn_ i modellen _Datamodell_ med verdien "Test Testesen".
-
-```C# {hl_lines=[6]}
-public async Task DataCreation(Instance instance, object data)
-{
- if (data.GetType() == typeof(Datamodell))
- {
- Datamodell model = (Datamodell)data;
- model.Bruker.FulltNavn = "Test Testesen";
- }
-}
-```
-
-Bytt ut _Datamodell_ med navnet på C# klassen som er blitt generert basert på xsd-en som
-ble lastet opp i Altinn Studio. Dersom du bruker en egnet kodeeditor vil du kunne definere felter
-som skal populeres ved bruk av intellisense.
-
-Vær oppmerksom på at dersom du har komplekse typer i modellen din, må disse instansieres før man kan
-tilegne en verdi til ett av typens underelementer. Se eksempel nedenfor der vi legger til grunn at 'Bruker'
-og 'Name' er egne C# klasser.
-
-```C#
-public async Task DataCreation(Instance instance, object data)
-{
- if (data.GetType() == typeof(Datamodell))
- {
- Datamodell model = (Datamodell)data;
- Bruker b = new Bruker();
- b.Navn = new Name();
- b.Navn.FulltNavn = "Test Testesen";
- }
-}
-```
-{{}}
-
-{{}}
\ No newline at end of file
diff --git a/content/app/development/data/prefill/instantiation/_index.en.md b/content/app/development/data/prefill/instantiation/_index.en.md
deleted file mode 100644
index b2efdc1a5f8..00000000000
--- a/content/app/development/data/prefill/instantiation/_index.en.md
+++ /dev/null
@@ -1,44 +0,0 @@
----
-title: Prefilling data on an http post request
-linktitle: Http post
-description: How to configure prefill for an app when creating a new instance from a http post request.
-toc: false
-weight: 400
----
-
-Altinn apps support instantiation with prefill.
-The form data is attached in a multipart in the instantiation request that is sent to the app.
-Below you will se an example of a request to instantiate an app with prefill for partyID 12345.
-
-```http {hl_lines=[10]}
-Content-Type: multipart/form-data; boundary="abcdefg"
-Body:
-
---abcdefg
-Content-Type: application/json; charset=utf-8
-Content-Disposition: form-data; name="instance"
-
-{
- "instanceOwner": {
- "PartyId" : "12345"
- }
-}
-
---abcdefg
-Content-Type: application/xml
-Content-Disposition: form-data; name="Endring-av-navn"
-
-
-
-
-
- Ola Nordmann
-
-
- LANGØY MADS
-
-
-
-
---abcdefg--
-```
diff --git a/content/app/development/data/prefill/instantiation/_index.nb.md b/content/app/development/data/prefill/instantiation/_index.nb.md
deleted file mode 100644
index 88a25d0ee82..00000000000
--- a/content/app/development/data/prefill/instantiation/_index.nb.md
+++ /dev/null
@@ -1,44 +0,0 @@
----
-title: Preutfylling med http post
-linktitle: Http post
-description: Hvordan konfigurere prefill for en app ved bruk av http post requests.
-toc: false
-weight: 400
----
-
-Altinn apper støtter instansiering med prefill.
-Skjemadataen legges ved i en multipart i instansieringsrequesten som sendes til appen.
-Nedenfor ser du et eksempel på en request for å instansiere en app med prefill for partyId 12345.
-
-```http {hl_lines=[10]}
-Content-Type: multipart/form-data; boundary="abcdefg"
-Body:
-
---abcdefg
-Content-Type: application/json; charset=utf-8
-Content-Disposition: form-data; name="instance"
-
-{
- "instanceOwner": {
- "PartyId" : "12345"
- }
-}
-
---abcdefg
-Content-Type: application/xml
-Content-Disposition: form-data; name="Endring-av-navn"
-
-
-
-
-
- Ola Nordmann
-
-
- LANGØY MADS
-
-
-
-
---abcdefg--
-```
diff --git a/content/app/development/logic/_index.en.md b/content/app/development/logic/_index.en.md
deleted file mode 100644
index 1899d40d2c6..00000000000
--- a/content/app/development/logic/_index.en.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-title: Logic
-linktitle: Logic
-description: How to add, change and configure application logic such as validation, calculation, dynamics and more
-toc: false
-weight: 30
----
-
-{{}}
\ No newline at end of file
diff --git a/content/app/development/logic/_index.nb.md b/content/app/development/logic/_index.nb.md
deleted file mode 100644
index 6c7f90100f5..00000000000
--- a/content/app/development/logic/_index.nb.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-title: Logikk
-linktitle: Logikk
-description: Hvordan legge til, endre og konfigurere applikasjonslogikk som validering, kalkulering, dynamikk m.m.
-toc: false
-weight: 30
----
-
-{{}}
\ No newline at end of file
diff --git a/content/app/development/logic/dataprocessing/_index.en.md b/content/app/development/logic/dataprocessing/_index.en.md
deleted file mode 100644
index cc772ed7cfb..00000000000
--- a/content/app/development/logic/dataprocessing/_index.en.md
+++ /dev/null
@@ -1,218 +0,0 @@
----
-title: Data processing
-description: How to add Calculations and other data processing?
-toc: false
----
-
-Data processing is run on the server and is based on input from the user/form data.
-Data processing can be purely mathematical calculations, or it could transfer values between fields, retrieve results from API calls, etc.
-
-Data processing runs each time data is saved, meaning it runs each time a user has made a change.
-
-To ensure optimal experience and control, the application template has two different events where logic can be placed.
-
-- ProcessDataWrite runs when data is saved
-- ProcessDataRead runs when data is read from the database
-
-{{%notice info%}}
-**IMPORTANT**
-
-For versions 4-7, when data processing that updates the data on the server runs, the front-end must be notified so the updated data can be loaded.
-To achieve this, the `ProcessDataWrite` method needs to return `true` if any data is updated.
-If this is not done, the updated data is not visible to the user until they refresh the page.
-
-
-Starting from v8, you do not need to return anything from `ProcessDataWrite`. To update the data, simply modify the incoming data object as before.
-{{% /notice%}}
-{{}}
-
-{{}}
-
-1. Create a class that implements the `IDataProcessor` interface found in the `Altinn.App.Core.Features.DataProcessing` namespace.
- You can name and place the file in any folder you like within your project, but we suggest you use meaningful namespaces like in any other .Net project.
- Example code from app that processes and populates different data while saving.
-
- ```C#
- public async Task ProcessDataWrite(Instance instance, Guid? dataId, object data, object? previousData, string? language)
- {
- if (data is SoknadUnntakKaranteneHotellVelferd model)
- {
- string org = instance.Org;
- string app = instance.AppId.Split("/")[1];
- int partyId = int.Parse(instance.InstanceOwner.PartyId);
- Guid instanceGuid = Guid.Parse(instance.Id.Split("/")[1]);
-
- // handling mapping of multiple choice velferdsgrunner
- if (!string.IsNullOrEmpty(model.velferdsgrunner?.sammenstilling))
- {
- model.velferdsgrunner.helseproblemer = model.velferdsgrunner.sammenstilling.Contains("helseproblemer");
- model.velferdsgrunner.barnefodsel = model.velferdsgrunner.sammenstilling.Contains("barnefodsel");
- model.velferdsgrunner.begravelse = model.velferdsgrunner.sammenstilling.Contains("begravelse");
- model.velferdsgrunner.naerstaaende = model.velferdsgrunner.sammenstilling.Contains("naerstaaende");
- model.velferdsgrunner.adopsjon = model.velferdsgrunner.sammenstilling.Contains("adopsjon");
- model.velferdsgrunner.sarligeOmsorg = model.velferdsgrunner.sammenstilling.Contains("sarligeOmsorg");
- model.velferdsgrunner.barnAlene = model.velferdsgrunner.sammenstilling.Contains("barnAlene");
- model.velferdsgrunner.hjemmeeksamen = model.velferdsgrunner.sammenstilling.Contains("hjemmeeksamen");
- model.velferdsgrunner.arbeidunntak = model.velferdsgrunner.sammenstilling.Contains("arbeidunntak");
- model.velferdsgrunner.andreVelferdshensyn = model.velferdsgrunner.sammenstilling.Contains("annet");
- model.velferdsgrunner.andreVelferdshensynBeskrivelse = model.velferdsgrunner.sammenstilling.Contains("annet") ? model.velferdsgrunner.andreVelferdshensynBeskrivelse : null;
- }
- else
- {
- model.velferdsgrunner = null;
- }
-
- // set data for receipt if not set
- if (string.IsNullOrEmpty(model.applogic?.altinnRef))
- {
- model.applogic ??= new Applogic();
-
- Party party = await _registerService.GetParty(
- int.Parse(instance.InstanceOwner.PartyId));
- model.applogic.avsender =
- $"{instance.InstanceOwner.PersonNumber}-{party.Name}";
- model.applogic.altinnRef = instance.Id.Split("-")[4];
- }
- }
- }
- ```
-
-2. Register you custom implementation in the _Program.cs_ class
-
- ```C#
- services.AddTransient();
- ```
-
- This ensures your custom code is known to the application and that it will be executed.
-
-{{}}
-
-{{}}
-
-In version 7 the way to do custom code instantiation has changed. We now use an dependency injection based approach insted of overriding methods. If you previously used to place your custom code in the _ProcessDataWrite_ and ProcessDataWrite* methods in the \_DataProcessingHandler.cs* class you will see that it's mostly the same.
-
-1. Create a class that implements the `IDataProcessor` interface found in the `Altinn.App.Core.Features.DataProcessing` namespace.
- You can name and place the file in any folder you like within your project, but we suggest you use meaningful namespaces like in any other .Net project.
- Example on code from app that processes and populates different data while saving.
-
- ```C#
- public async Task ProcessDataWrite(
- Instance instance, Guid? dataId, object data)
- {
- bool edited = false;
-
- if (data is SoknadUnntakKaranteneHotellVelferd model)
- {
- string org = instance.Org;
- string app = instance.AppId.Split("/")[1];
- int partyId = int.Parse(instance.InstanceOwner.PartyId);
- Guid instanceGuid = Guid.Parse(instance.Id.Split("/")[1]);
-
- // handling mapping of multiple choice velferdsgrunner
- if (!string.IsNullOrEmpty(model.velferdsgrunner?.sammenstilling))
- {
- model.velferdsgrunner.helseproblemer = model.velferdsgrunner.sammenstilling.Contains("helseproblemer");
- model.velferdsgrunner.barnefodsel = model.velferdsgrunner.sammenstilling.Contains("barnefodsel");
- model.velferdsgrunner.begravelse = model.velferdsgrunner.sammenstilling.Contains("begravelse");
- model.velferdsgrunner.naerstaaende = model.velferdsgrunner.sammenstilling.Contains("naerstaaende");
- model.velferdsgrunner.adopsjon = model.velferdsgrunner.sammenstilling.Contains("adopsjon");
- model.velferdsgrunner.sarligeOmsorg = model.velferdsgrunner.sammenstilling.Contains("sarligeOmsorg");
- model.velferdsgrunner.barnAlene = model.velferdsgrunner.sammenstilling.Contains("barnAlene");
- model.velferdsgrunner.hjemmeeksamen = model.velferdsgrunner.sammenstilling.Contains("hjemmeeksamen");
- model.velferdsgrunner.arbeidunntak = model.velferdsgrunner.sammenstilling.Contains("arbeidunntak");
- model.velferdsgrunner.andreVelferdshensyn = model.velferdsgrunner.sammenstilling.Contains("annet");
- model.velferdsgrunner.andreVelferdshensynBeskrivelse = model.velferdsgrunner.sammenstilling.Contains("annet") ? model.velferdsgrunner.andreVelferdshensynBeskrivelse : null;
-
- edited = true;
- }
- else
- {
- model.velferdsgrunner = null;
- }
-
- // set data for receipt if not set
- if (string.IsNullOrEmpty(model.applogic?.altinnRef))
- {
- model.applogic ??= new Applogic();
-
- Party party = await _registerService.GetParty(
- int.Parse(instance.InstanceOwner.PartyId));
- model.applogic.avsender =
- $"{instance.InstanceOwner.PersonNumber}-{party.Name}";
- model.applogic.altinnRef = instance.Id.Split("-")[4];
- }
- }
- return await Task.FromResult(edited);
- }
- ```
-
-2. Register you custom implementation in the _Program.cs_ class
-
- ```C#
- services.AddTransient();
- ```
-
- This ensures your custom code is known to the application and that it will be executed.
-
- {{}}
- {{}}
- Data processing is coded in C#, in the file `DataProcessingHandler.cs`. This file can easily be edited by downloading the source code to the app and editing on your own computer, e.g. in Visual Studio Code.
- The data model with form data is available and can be edited/updated when needed.
-
-Example code from app that processes and populates various data while saving.
-
-```C#
-public async Task ProcessDataWrite(
- Instance instance, Guid? dataId, object data)
-{
- bool edited = false;
-
- if (data is SoknadUnntakKaranteneHotellVelferd model)
- {
- string org = instance.Org;
- string app = instance.AppId.Split("/")[1];
- int partyId = int.Parse(instance.InstanceOwner.PartyId);
- Guid instanceGuid = Guid.Parse(instance.Id.Split("/")[1]);
-
- // handling mapping of multiple choice velferdsgrunner
- if (!string.IsNullOrEmpty(model.velferdsgrunner?.sammenstilling))
- {
- model.velferdsgrunner.helseproblemer = model.velferdsgrunner.sammenstilling.Contains("helseproblemer");
- model.velferdsgrunner.barnefodsel = model.velferdsgrunner.sammenstilling.Contains("barnefodsel");
- model.velferdsgrunner.begravelse = model.velferdsgrunner.sammenstilling.Contains("begravelse");
- model.velferdsgrunner.naerstaaende = model.velferdsgrunner.sammenstilling.Contains("naerstaaende");
- model.velferdsgrunner.adopsjon = model.velferdsgrunner.sammenstilling.Contains("adopsjon");
- model.velferdsgrunner.sarligeOmsorg = model.velferdsgrunner.sammenstilling.Contains("sarligeOmsorg");
- model.velferdsgrunner.barnAlene = model.velferdsgrunner.sammenstilling.Contains("barnAlene");
- model.velferdsgrunner.hjemmeeksamen = model.velferdsgrunner.sammenstilling.Contains("hjemmeeksamen");
- model.velferdsgrunner.arbeidunntak = model.velferdsgrunner.sammenstilling.Contains("arbeidunntak");
- model.velferdsgrunner.andreVelferdshensyn = model.velferdsgrunner.sammenstilling.Contains("annet");
- model.velferdsgrunner.andreVelferdshensynBeskrivelse = model.velferdsgrunner.sammenstilling.Contains("annet") ? model.velferdsgrunner.andreVelferdshensynBeskrivelse : null;
-
- edited = true;
- }
- else
- {
- model.velferdsgrunner = null;
- }
-
- // set data for receipt if not set
- if (string.IsNullOrEmpty(model.applogic?.altinnRef))
- {
- model.applogic ??= new Applogic();
-
- Party party = await _registerService.GetParty(
- int.Parse(instance.InstanceOwner.PartyId));
- model.applogic.avsender =
- $"{instance.InstanceOwner.PersonNumber}-{party.Name}";
- model.applogic.altinnRef = instance.Id.Split("-")[4];
- }
- }
-
- return await Task.FromResult(edited);
-}
-```
-
-{{}}
-
-{{}}
diff --git a/content/app/development/logic/dataprocessing/_index.nb.md b/content/app/development/logic/dataprocessing/_index.nb.md
deleted file mode 100644
index 107fec2e8fd..00000000000
--- a/content/app/development/logic/dataprocessing/_index.nb.md
+++ /dev/null
@@ -1,216 +0,0 @@
----
-title: Dataprosessering
-description: Hvordan legge til kalkuleringer og annen dataprosessering?
-toc: true
----
-
-Dataprosessering kjøres på serveren, og er basert på input fra sluttbruker/skjemadata.
-Dataprosessering kan være kan være rent matematiske kalkuleringer, det kan også være å overføre verdier mellom felter, resultater av API-kall, osv.
-
-Dataprosessering kjøres hver gang data lagres, og dermed hver gang en bruker har gjort en endring.
-
-For å sikre optimal opplevelse og kontroll er applikasjonstemplaten to forskjellige hendelser hvor logikk kan plasseres.
-
-- ProcessDataWrite kjøres når data lagres
-- ProcessDataRead kjøres når data leses fra databasen
-
-{{%notice info%}}
-**VIKTIG**
-
-For versjon 4-7: Når en dataprosessering som har oppdatert dataene på server er kjørt, må front-end få beskjed om dette sånn at de oppdaterte dataene kan lastes inn.
-For at det skal skje, må `ProcessDataWrite`-metoden returnere `true` om det er noen av dataene som har blitt oppdatert.
-Hvis dette ikke gjøres, vil de oppdaterte dataen ikke være synlig for sluttbruker før de ev. laster inn siden på nytt.
-
-
-Fra og med versjon 8 trenger du ikke returnere noe fra `ProcessDataWrite`. For å oppdatere dataen trenger du bare å endre på dataen som kommer inn til metoden, som før.
-{{% /notice%}}
-
-{{}}
-
-{{}}
-
-1. Opprett en klasse som implementerer `IDataProcessor` grensesnittet som ligger i `Altinn.App.Core.Features.DateProcessing` navnerommet.
- Du kan navngi og plassere filene i den mappestrukturen du selv ønsker i prosjektet ditt. Men vi anbefaler at du benytter meningsfulle navnerom som i et hvilket som helst annet .Net prosjekt.
- Eksempel på kode fra app som prosesserer og populerer forskjellige data under lagring.
-
- ```C#
- public async Task ProcessDataWrite(Instance instance, Guid? dataId, object data, object? previousData, string? language)
- {
- if (data is SoknadUnntakKaranteneHotellVelferd model)
- {
- string org = instance.Org;
- string app = instance.AppId.Split("/")[1];
- int partyId = int.Parse(instance.InstanceOwner.PartyId);
- Guid instanceGuid = Guid.Parse(instance.Id.Split("/")[1]);
-
- // handling mapping of multiple choice velferdsgrunner
- if (!string.IsNullOrEmpty(model.velferdsgrunner?.sammenstilling))
- {
- model.velferdsgrunner.helseproblemer = model.velferdsgrunner.sammenstilling.Contains("helseproblemer");
- model.velferdsgrunner.barnefodsel = model.velferdsgrunner.sammenstilling.Contains("barnefodsel");
- model.velferdsgrunner.begravelse = model.velferdsgrunner.sammenstilling.Contains("begravelse");
- model.velferdsgrunner.naerstaaende = model.velferdsgrunner.sammenstilling.Contains("naerstaaende");
- model.velferdsgrunner.adopsjon = model.velferdsgrunner.sammenstilling.Contains("adopsjon");
- model.velferdsgrunner.sarligeOmsorg = model.velferdsgrunner.sammenstilling.Contains("sarligeOmsorg");
- model.velferdsgrunner.barnAlene = model.velferdsgrunner.sammenstilling.Contains("barnAlene");
- model.velferdsgrunner.hjemmeeksamen = model.velferdsgrunner.sammenstilling.Contains("hjemmeeksamen");
- model.velferdsgrunner.arbeidunntak = model.velferdsgrunner.sammenstilling.Contains("arbeidunntak");
- model.velferdsgrunner.andreVelferdshensyn = model.velferdsgrunner.sammenstilling.Contains("annet");
- model.velferdsgrunner.andreVelferdshensynBeskrivelse = model.velferdsgrunner.sammenstilling.Contains("annet") ? model.velferdsgrunner.andreVelferdshensynBeskrivelse : null;
- }
- else
- {
- model.velferdsgrunner = null;
- }
-
- // set data for receipt if not set
- if (string.IsNullOrEmpty(model.applogic?.altinnRef))
- {
- model.applogic ??= new Applogic();
-
- Party party = await _registerService.GetParty(
- int.Parse(instance.InstanceOwner.PartyId));
- model.applogic.avsender =
- $"{instance.InstanceOwner.PersonNumber}-{party.Name}";
- model.applogic.altinnRef = instance.Id.Split("-")[4];
- }
- }
- }
- ```
-
-2. Registrer din implementering i _Program.cs_ klassen
- ```C#
- services.AddTransient();
- ```
- Dette sørger for at din kode er kjent for applikasjonen og at koden blir kjørt når den skal.
-
-{{}}
-
-{{}}
-I versjon 7 har vi endret måten preutfylling med egendefinert kode gjøres på. Vi benytter nå _dependency injection_ i stedet for overstyring av metoder. Hvis du tidligere plasserte koden din i _ProcessDataRead_ og _ProcessDataWrite_ metodene in _DataProcessingHandler.cs_ klassen så vil du erfare at det er mer eller mindre det samme som nå gjøres.
-
-1. Opprett en klasse som implementerer `IDataProcessor` grensesnittet som ligger i `Altinn.App.Core.Features.DateProcessing` navnerommet.
- Du kan navngi og plassere filene i den mappestrukturen du selv ønsker i prosjektet ditt. Men vi anbefaler at du benytter meningsfulle navnerom som i et hvilket som helst annet .Net prosjekt.
- Eksempel på kode fra app som prosesserer og populerer forskjellige data under lagring.
-
- ```C#
- public async Task ProcessDataWrite(
- Instance instance, Guid? dataId, object data)
- {
- bool edited = false;
-
- if (data is SoknadUnntakKaranteneHotellVelferd model)
- {
- string org = instance.Org;
- string app = instance.AppId.Split("/")[1];
- int partyId = int.Parse(instance.InstanceOwner.PartyId);
- Guid instanceGuid = Guid.Parse(instance.Id.Split("/")[1]);
-
- // handling mapping of multiple choice velferdsgrunner
- if (!string.IsNullOrEmpty(model.velferdsgrunner?.sammenstilling))
- {
- model.velferdsgrunner.helseproblemer = model.velferdsgrunner.sammenstilling.Contains("helseproblemer");
- model.velferdsgrunner.barnefodsel = model.velferdsgrunner.sammenstilling.Contains("barnefodsel");
- model.velferdsgrunner.begravelse = model.velferdsgrunner.sammenstilling.Contains("begravelse");
- model.velferdsgrunner.naerstaaende = model.velferdsgrunner.sammenstilling.Contains("naerstaaende");
- model.velferdsgrunner.adopsjon = model.velferdsgrunner.sammenstilling.Contains("adopsjon");
- model.velferdsgrunner.sarligeOmsorg = model.velferdsgrunner.sammenstilling.Contains("sarligeOmsorg");
- model.velferdsgrunner.barnAlene = model.velferdsgrunner.sammenstilling.Contains("barnAlene");
- model.velferdsgrunner.hjemmeeksamen = model.velferdsgrunner.sammenstilling.Contains("hjemmeeksamen");
- model.velferdsgrunner.arbeidunntak = model.velferdsgrunner.sammenstilling.Contains("arbeidunntak");
- model.velferdsgrunner.andreVelferdshensyn = model.velferdsgrunner.sammenstilling.Contains("annet");
- model.velferdsgrunner.andreVelferdshensynBeskrivelse = model.velferdsgrunner.sammenstilling.Contains("annet") ? model.velferdsgrunner.andreVelferdshensynBeskrivelse : null;
-
- edited = true;
- }
- else
- {
- model.velferdsgrunner = null;
- }
-
- // set data for receipt if not set
- if (string.IsNullOrEmpty(model.applogic?.altinnRef))
- {
- model.applogic ??= new Applogic();
-
- Party party = await _registerService.GetParty(
- int.Parse(instance.InstanceOwner.PartyId));
- model.applogic.avsender =
- $"{instance.InstanceOwner.PersonNumber}-{party.Name}";
- model.applogic.altinnRef = instance.Id.Split("-")[4];
- }
- }
-
- return await Task.FromResult(edited);
- }
- ```
-
-2. Registrer din implementering i _Program.cs_ klassen
- ```C#
- services.AddTransient();
- ```
- Dette sørger for at din kode er kjent for applikasjonen og at koden blir kjørt når den skal.
-
-{{}}
-
-{{}}
-Dataprosessering kodes i C#, i filen `DataProsessingHandler.cs`. Denne filen kan redigeres enklest ved å laste ned kildekoden til app'en og redigere på egen maskin, f.eks. i Visual Studio Code.
-Datamodellen med skjemadata er tilgjengelig og kan redigeres/oppdateres etter ønske/behov.
-
-Eksempel på kode fra app som prosesserer og populerer forskjellige data under lagring.
-
-```C#
-public async Task ProcessDataWrite(
- Instance instance, Guid? dataId, object data)
-{
- bool edited = false;
-
- if (data is SoknadUnntakKaranteneHotellVelferd model)
- {
- string org = instance.Org;
- string app = instance.AppId.Split("/")[1];
- int partyId = int.Parse(instance.InstanceOwner.PartyId);
- Guid instanceGuid = Guid.Parse(instance.Id.Split("/")[1]);
-
- // handling mapping of multiple choice velferdsgrunner
- if (!string.IsNullOrEmpty(model.velferdsgrunner?.sammenstilling))
- {
- model.velferdsgrunner.helseproblemer = model.velferdsgrunner.sammenstilling.Contains("helseproblemer");
- model.velferdsgrunner.barnefodsel = model.velferdsgrunner.sammenstilling.Contains("barnefodsel");
- model.velferdsgrunner.begravelse = model.velferdsgrunner.sammenstilling.Contains("begravelse");
- model.velferdsgrunner.naerstaaende = model.velferdsgrunner.sammenstilling.Contains("naerstaaende");
- model.velferdsgrunner.adopsjon = model.velferdsgrunner.sammenstilling.Contains("adopsjon");
- model.velferdsgrunner.sarligeOmsorg = model.velferdsgrunner.sammenstilling.Contains("sarligeOmsorg");
- model.velferdsgrunner.barnAlene = model.velferdsgrunner.sammenstilling.Contains("barnAlene");
- model.velferdsgrunner.hjemmeeksamen = model.velferdsgrunner.sammenstilling.Contains("hjemmeeksamen");
- model.velferdsgrunner.arbeidunntak = model.velferdsgrunner.sammenstilling.Contains("arbeidunntak");
- model.velferdsgrunner.andreVelferdshensyn = model.velferdsgrunner.sammenstilling.Contains("annet");
- model.velferdsgrunner.andreVelferdshensynBeskrivelse = model.velferdsgrunner.sammenstilling.Contains("annet") ? model.velferdsgrunner.andreVelferdshensynBeskrivelse : null;
-
- edited = true;
- }
- else
- {
- model.velferdsgrunner = null;
- }
-
- // set data for receipt if not set
- if (string.IsNullOrEmpty(model.applogic?.altinnRef))
- {
- model.applogic ??= new Applogic();
-
- Party party = await _registerService.GetParty(
- int.Parse(instance.InstanceOwner.PartyId));
- model.applogic.avsender =
- $"{instance.InstanceOwner.PersonNumber}-{party.Name}";
- model.applogic.altinnRef = instance.Id.Split("-")[4];
- }
- }
-
- return await Task.FromResult(edited);
-}
-```
-
-{{}}
-
-{{}}
diff --git a/content/app/development/logic/dynamic/_index.en.md b/content/app/development/logic/dynamic/_index.en.md
deleted file mode 100644
index 4235473bc81..00000000000
--- a/content/app/development/logic/dynamic/_index.en.md
+++ /dev/null
@@ -1,409 +0,0 @@
----
-title: Dynamics
-description: How to add dynamics?
-tags: [dynamics]
-toc: true
----
-
-{{% panel theme="warning" %}}
-⚠️ Dynamics are under active development. The `RuleHandler.js` file will in the future be replaced by
-[dynamic expressions](../expressions). Currently only show/hide dynamics are supported using expressions, but
-calculation and validation will be supported in the future.
-{{% /panel %}}
-
-## Introduction
-
-Dynamics are events that happen on the client side. These can be separated in two categories:
-- Calculations - do calculations on the client side, and update the fields with new value.
-- Show/hide fields - decide if fields should be hidden or displayed based on form values.
-
-There are two ways to add and change dynamics for an Altinn App:
-1. Directly in Altinn Studio under _Lage_-tab. Select _Rediger dynamikk_ in the right menu.
-2. In a local development environment by working in the file `RuleHandler.js` which can be found in the `App/ui` folder.
-
-All dynamics are written as JavaScript functions in the _RuleHandler_ file.
-Functions that are defined in this file can be configured to run for selected fields in the app.
-
-
-{{%notice info%}}
-The dynamic code to show/hide fields or perform calculations should be set up so that it handles possible errors in the input gracefully.
-It should, for instance, handle empty fields or strings where you expect numbers without crashing.
-If the dynamic does not work as expected, take a look at the code that defines the dynamic and verify that it handles errors.
-{{% /notice%}}
-
-{{% notice warning %}}
-NOTE: In order to support dynamics in older browsers the code defined in `RuleHandler.js` must be written in the version of ECMAScript that the given browser supports.
-For IE11 this is ECMAScript 5.
-{{% /notice %}}
-
-## Add or edit functions for dynamics
-
-There are two JavaScript objects in the file `RuleHandler.js`:
-
-- `ruleHandlerObject` - functions for calculations
-- `conditionalRuleHandlerObject` - functions for hiding/showing fields
-
-It is in these objects the functions should be defined. In addition to these there are two _helper objects_ (`ruleHandlerHelper` and `conditionalRuleHandlerHelper`), where you configure what input the different functions expect. This is done in order to be able to configure rules in Altinn Studio at a later point.
-To be able to configure dynamics in Altinn Studio the functions must be defined in the JavaScript objects (`ruleHandlerObject` or `conditionalRuleHandlerObject`), and the parameters they expect in the corresponding helper object.
-
-The structure of the helper object:
-
-```javascript
-var ruleHandlerHelper = {
- : () => {
- return {
- : "",
- : "",
- : ""
- ...
- };
- }
-}
-```
-
-The structure of objects containing the JavaScript functions:
-
-```javascript
-var ruleHandlerObject = {
- : () => {
- // Do something here
- // Values from input parameters defined in
- // helper can be accessed through the object passed
- // into the rule, f.ex.
- // .
- }
-}
-```
-
-For instance, to create a rule that calculates the sum of two numbers (calculation) the following code is needed:
-
-```javascript
-var ruleHandlerHelper = {
- sum: () => {
- return {
- field1: "Field 1 in sum",
- field2: "Field 2 in sum"
- };
- }
-}
-
-var ruleHandlerObject = {
- sum: (data) => {
- // Check if data is available
- if (!data) return;
-
- // Check if value from input fields are available
- // If not, use value 0 in sum
- data.field1 = data.field1 ? data.field1 : 0;
- data.field2 = data.field2 ? data.field2 : 0;
-
- // return the sum
- return data.field1 + data.field2;
- }
-}
-```
-
-Some default methods for calculations, with helper objects, are defined as part of the app template.
-
-| Method name | Description | Parameters | Defined in object/helper |
-| -------------------- | -------------------------------------------------------------------------- | ----------------------- | ------------------------------------------------------------- |
-| `sum` | Returns the sum of two values | `value1`, `value2` | `ruleHandlerObject`/`ruleHandlerHelper` |
-| `fullName` | Combines two strings (first name and last name) separated with a space. | `firstName`, `lastName` | `ruleHandlerObject`/`ruleHandlerHelper` |
-| `lengthGreaterThan4` | Returns `true` if the value is longer than 4 chars long. | `value` | `conditionalRuleHandlerObject`/`conditionalRuleHandlerHelper` |
-
-
- Dynamics are run if a change has occurred in the input fields connected to the rule. The functions have to handle cases where, for instance, only one of the two parameters have defined values.
-
-An example of how this could be done is shown in the `sum`-function below, where missing values are corrected to the value `0`.
-
-
-```javascript
-var ruleHandlerObject = {
- sum: (obj) => {
- obj.value1 = obj.value1 ? +obj.value1 : 0;
- obj.value2 = obj.value2 ? +obj.value2 : 0;
- return obj.value1 + obj.value2;
- },
-
- fullName: (obj) => {
- return obj.firstName + ' ' + obj.lastName;
- }
-}
-var ruleHandlerHelper = {
- sum: () => {
- return {
- value1: "Value 1",
- value2: "Value 2"
- }
- },
-
- fullName: () => {
- return {
- firstName: "First name",
- lastName: "Last name"
- };
- }
-}
-
-var conditionalRuleHandlerObject = {
- lengthBiggerThan4: (obj) => {
- if (obj.value == null) return false;
- return obj.value.length >= 4;
- }
-}
-var conditionalRuleHandlerHelper = {
- lengthBiggerThan4: () => {
- return {
- value: "value"
- }
- }
-}
-```
-
-## Configure dynamics for UI components
-
-1. Add the relevant UI components to the layout.
-2. In the right menu, select _Regler for beregninger_ or _Regler for vis/skjul felt_.
- ![Rules for hiding/showing fields](rules-show-hide.png)
-3. Select the wanted rule. Or add a function, as described in the sections above. ![Select a rule](rules-select-rule.png)
-4. Configure which field(s) that should be used as _input_ for the function - this is fields in the data model.
- ![Configure dynamics](rules-configure.png)
-5. Select which component(s) should be affected by the rule (receive value or be shown/hidden) - these are components in the layout.
- - For rules for hiding/showing elements several fields can be selected for the same rule.
-6. Save the configuration.
-7. Test that the rules works as expected.
-
-Existing configured rules is shown in the right menu, and can be edited/deleted.
-
-The configuration can also be seen in the file `App/ui/RuleConfiguration.json`. This can be manually edited if necessary.
-
-## Example usage of dynamics on an app
-
-Scenario:
-
-An app with a UI has several fields for input. One of these fields is a radio button with the options "Yes" and "No".
-Depending on what the user selects, different content is to be displayed:
-- Yes: a new input field is shown, along with information about what should be entered.
-- No: a different text with information is shown.
-
-This can be solved by adding the following in `RuleHandler.js`, either through _Rediger dynamikk_ in Altinn Studio, or by manually editing the source code.
-
-```javascript
-var conditionalRuleHandlerObject = {
- sjekkVirksomhetIDrift: (obj) => {
- return (obj.value && obj.value === "Yes");
- },
-
- sjekkVirksomhetIkkeIDrift: (obj) => {
- return (!obj.value || obj.value != "Yes");
- }
-}
-
-var conditionalRuleHandlerHelper = {
- sjekkVirksomhetIDrift: () => {
- return {
- value: "value"
- }
- },
- sjekkVirksomhetIkkeIDrift: () => {
- return {
- value: "value"
- }
- }
-}
-```
-
-Here, two functions have been added which checks if the value is "Yes" or not.
-After this code is added, the rules can be configured in studio. The results are displayed below:
-
-![Test of dynamics screenshot](dynamics-test.gif "Test of dynamics example")
-
-## Dynamics in repeating groups
-
-It is also possible to add dynamics within a repeating group. This requires that the rule is configured in Altinn Studio as
-usual, and then manually doing some extra configuration in the `App/ui/RuleConfiguration.json` file as described below.
-
-- For each `inputParams`, `{0}` need to be added after the _group part_ of the data binding. For instance `model.group{0}.field`. The index indicator will be replaced by the index for each relevant field in the repeating group.
-- For each `selectedFields` (the fields affected by the rule), `{0}` needs to be added after the field ID, for instance `layoutComponent{0}`
-- A new property must also be added to the rule, `repeatingGroup`. This object must contain the ID of the relevant group in the layout file.
-
-Here is an example of a rule that is configured for a repeating group:
-
-```json {hl_lines=[8,12-13,15-17]}
-{
- "data": {
- "ruleConnection": {},
- "conditionalRendering": {
- "9f9f2a50-360b-11ea-b69a-8510e2e248b9": {
- "selectedFunction": "lengthBiggerThan4",
- "inputParams": {
- "value": "model.group{0}.field"
- },
- "selectedAction": "Show",
- "selectedFields": {
- "first": "some-field{0}",
- "second": "some-other-field{0}"
- },
- "repeatingGroup": {
- "groupId": "the-group-id",
- }
- }
- }
- }
-}
-```
-
-### Nested repeating groups
-
-It is also possible to add dynamics for nested repeating groups. The configuration resembles that of a repeating group, but a second parameter `childGroupId` is added in the `repeatingGroup`object, as well as an extra index indicator.
-
-Example:
-
-```json {hl_lines=[8,12,14,15,16]}
-{
- "data": {
- "ruleConnection": {},
- "conditionalRendering": {
- "hide-nested-group-field": {
- "selectedFunction": "shouldHide",
- "inputParams": {
- "value": "someGroup{0}.nestedGroup{1}.someField"
- },
- "selectedAction": "Hide",
- "selectedFields": {
- "field": "the-component-id{0}{1}"
- },
- "repeatingGroup": {
- "groupId": "mainGroup",
- "childGroupId": "subGroup"
- }
- }
- }
- }
-}
-```
-
-## Example with more complex dynamics
-
-Scenario:
-An app has two sets of radiobuttons (yes/no) and a checkbox.
-
-- When the app is loaded, only the first set of radiobuttons is visible.
-- If the user selects `Yes`, the second set of radiobuttons is shown.
- - If the user selects `Yes` in the second choice, the checkbox is shown.
- - If the user goes back to the first set of radiobuttons and selects `No`, both the second set of radiobuttons and the checkbox are hidden.
-
-### Alternative 1
-This can be solved by configuring two different conditions for when the fields should be displayed:
-
-- One condition for the second set of radiobuttons
- - Is shown if `Yes` is selected in the first set
-- One condition for the checkbox
- - Is shown if `Yes` is selected in both sets of radiobuttons.
-
-Example code that can solve this case:
-
-```javascript
-var conditionalRuleHandlerObject = {
- showField2: (obj) => {
- if (obj && obj.field1 && obj.field1=== "yes") {
- return true;
- }
- return false;
- },
-
- showField3: (obj) => {
- if (obj && obj.field1 && obj.field1 === "yes"
- && obj.field2 && obj.field2 === "yes") {
- return true;
- }
- return false;
- }
-}
-
-var conditionalRuleHandlerHelper = {
- showField2: () => {
- return {
- field1: "Field 1"
- };
- },
-
- showField3: () => {
- return {
- field1: "Field 1",
- field2: "Field 2"
- };
- }
-}
-```
-
-### Alternative 2
-
-This can also be configured by using the same condition to show both the second set of radiobuttons and the checkbox.
-In addition, there needs to be a rule that removes the value from the second set of radiobuttons if the user selects `No` in the first set:
-
-```javascript
-var ruleHandlerObject = {
- clearField: (obj) => {
- if (obj && obj.checkValue === "no") {
- return "";
- }
- return obj.currentValue;
- }
-}
-
-var ruleHandlerHelper = {
- clearField: () => {
- return {
- checkValue: "check against this value",
- currentValue: "the current value"
- }
- }
-}
-
-var conditionalRuleHandlerObject = {
- showField: (obj) => {
- if (obj && obj.checkField && obj.checkField === "yes") {
- return true;
- }
- return false;
- }
-}
-
-var conditionalRuleHandlerHelper = {
- showField: () => {
- return {
- checkField: "check against this value"
- };
- }
-}
-```
-
-
-## Dynamics in PDF
-
-From Nuget versions 3.0.0 it is also possible to add dynamics for the PDF. This is done in the PDF Handler.
-The application must include the `layout/ui/Settings.json` file [defined here](../../../../app/development/ux/pages/navigation/#order).
-
-Configuring dynamics in PDF is similar to how validations are added on the server side.
-
-In the example below, if the string `some-value` is part of a value in the data model, the component with the ID `079f205b-c9ea-414d-9983-0d158e833e8a` is hidden. The ID is reflected in the layout files.
-
-```C#
- public async Task FormatPdf(LayoutSettings layoutSettings, object data)
- {
- if (data is Skjema)
- {
- Skjema skjema = (Skjema)data;
-
- if (skjema?.Innledninggrp9342?.Kontaktinformasjongrp9344?.KontaktpersonNavndatadef2?.value.Contains("some-value") == true)
- {
- layoutSettings.Components = new Components();
- layoutSettings.Components.ExcludeFromPdf = new System.Collections.Generic.List();
- layoutSettings.Components.ExcludeFromPdf.Add("079f205b-c9ea-414d-9983-0d158e833e8a");
- }
- }
-
- return await Task.FromResult(layoutSettings);
- }
- ```
diff --git a/content/app/development/logic/dynamic/_index.nb.md b/content/app/development/logic/dynamic/_index.nb.md
deleted file mode 100644
index 51e456fd45a..00000000000
--- a/content/app/development/logic/dynamic/_index.nb.md
+++ /dev/null
@@ -1,413 +0,0 @@
----
-title: Dynamikk
-description: Hvordan legge til dynamikk?
-toc: true
----
-
-{{% panel theme="warning" %}}
-⚠️ Dynamikk er et område under aktiv utvikling. Logikk-filer skrevet i JavaScript fases etterhvert ut og blir erstattet
-av [dynamiske uttrykk](../expressions). Foreløpig gjelder dette dynamikk for vis/skjul, men etterhvert skal uttrykk
-også kunne brukes for å utføre beregninger og styre valideringsmeldinger.
-{{% /panel %}}
-
-## Introduksjon
-
-Dynamikk er hendelser som skjer på klient-siden. Disse kan deles opp i to kategorier:
-- Beregning - kjøre beregninger på klient-side, og oppdatere felter med ny verdi
-- Vis/skjul felter - bestemme om felter skal vises eller skjules basert på verdier i skjema.
-
-Det er to måter å legge til og endre dynamikkregler for en Altinn App.
-1. Direkte i Altinn Studio under _Lage_-fanen. Velg _Rediger dynamikk_ i høyre-menyen.
-2. I lokalt utviklingsmiljø ved å jobbe i filen `RuleHandler.js` som finnes i `App/ui`-mappen .
-
-
-All dynamikk skrives som funksjoner i JavaScript i _RuleHandler_-filen.
-Funksjonene som er definert i denne filen kan videre konfigureres til å kjøres for feltene i skjemaet.
-
-{{%notice info%}}
-Koden som definerer beregninger eller regler for vis/skjul bør settes opp slik at den håndterer eventuell feil i input.
-Blant annet bør de håndtere å motta et tomt felt, eller tekst der man forventer et tall, uten å kræsje.
-Dersom dynamikken ikke fungerer som forventet, ta en titt på koden som definerer
-beregninger eller regler for vis/skjul for å se om det er noe feilhåndtering som mangler.
-{{% /notice%}}
-
-{{%notice warning%}}MERK: For å støtte beregning/vis-skjul felter på eldre nettlesere, må man skrive
-JavaScript-koden man legger i `RuleHandler.js` i den versjonen av ECMAScript som den aktuelle nettleseren støtter.
-For IE11 vil dette være ECMAScript 5. {{%/notice%}}
-
-## Legg til/rediger funksjoner for beregninger eller vis/skjul
-
-I filen `RuleHandler.js` er det satt opp to JavaScript-objekter:
-
-- `ruleHandlerObject` - funksjoner for beregninger
-- `conditionalRuleHandlerObject` - funksjoner med regler for vis/skjul
-
-Det er inne i disse at de forskjellige funksjonene skal defineres. I tillegg er det satt opp to _hjelpeobjekter_ (`ruleHandlerHelper` og `conditionalRuleHandlerHelper`), hvor man skal sette opp hva slags input de forskjellige funksjonene forventer å få inn. Dette gjør det mulig å konfigurere reglene i Altinn Studio senere. For at en funksjon skal være tilgjengelig for å konfigureres som dynamikk, må selve funksjonen være definert i hovedobjektet
-(`ruleHandlerObject` eller `conditionalRuleHandlerObject`), og parametrene den forventer å få inn må være satt opp i det tilhørende hjelpeobjektet.
-
-Strukturen på hjelpeobjektet vises under:
-
-```javascript
-var ruleHandlerHelper = {
- : () => {
- return {
- : "",
- : "",
- : ""
- ...
- };
- }
-}
-```
-
-Strukturen på hovedobjektet, som inneholder funksjoner som brukes i dynamikk, vises under:
-
-```javascript
-var ruleHandlerObject = {
- : () => {
- // Do something here
- // Values from input parameters defined in
- // helper can be accessed through the object passed
- // into the rule, f.ex.
- // .
- }
-}
-```
-
-For eksempel, for å lage en regel som returnerer summen av to tall (beregning), vil man trenge følgende kode:
-
-```javascript
-var ruleHandlerHelper = {
- sum: () => {
- return {
- field1: "Field 1 in sum",
- field2: "Field 2 in sum"
- };
- }
-}
-
-var ruleHandlerObject = {
- sum: (data) => {
- // Check if data is available
- if (!data) return;
-
- // Check if value from input fields are available
- // If not, use value 0 in sum
- data.field1 = data.field1 ? data.field1 : 0;
- data.field2 = data.field2 ? data.field2 : 0;
-
- // return the sum
- return data.field1 + data.field2;
- }
-}
-```
-
-Noen standardmetoder for beregninger, med hjelpeobjekt, er satt opp automatisk når appen lages i Altinn Studio. Noen av disse er vist i eksempelet under.
-
-| Method name | Description | Parameters | Defined in object/helper |
-|----------------------| ---------------------------------------------------------------- | ----------------------- | ------------------------------------------------------------- |
-| `sum` | Returnerer summen av to verdier | `value1`, `value2` | `ruleHandlerObject`/`ruleHandlerHelper` |
-| `fullName` | Returnerer to tekster (fornavn og etternavn) satt sammen med mellomrom mellom. | `firstName`, `lastName` | `ruleHandlerObject`/`ruleHandlerHelper` |
-| `lengthBiggerThan4` | Returnerer `true` dersom verdien den får inn er lengre enn 4 karakterer lang. | `value` | `conditionalRuleHandlerObject`/`conditionalRuleHandlerHelper` |
-
-
-Regler for dynamikk kjøres dersom det har skjedd en endring i input-parametrene til de forskjellige reglene.
-Funksjonene som da kjøres må kunne håndtere dersom det f.eks. har kommet inn kun 1 av 2 parametre eller lignende.
-
-Et eksempel på hvordan dette kan gjøres er vist i `sum`-funksjonen under, hvor man tester hvilke parametre man
-har fått inn, og setter verdi til `0` på den/de parametre som mangler, sånn at regelen fortsatt fungerer.
-
-```javascript
-var ruleHandlerObject = {
- sum: (obj) => {
- obj.value1 = obj.value1 ? +obj.value1 : 0;
- obj.value2 = obj.value2 ? +obj.value2 : 0;
- return obj.value1 + obj.value2;
- },
-
- fullName: (obj) => {
- return obj.firstName + ' ' + obj.lastName;
- }
-}
-var ruleHandlerHelper = {
- sum: () => {
- return {
- value1: "Value 1",
- value2: "Value 2"
- }
- },
-
- fullName: () => {
- return {
- firstName: "First name",
- lastName: "Last name"
- };
- }
-}
-
-var conditionalRuleHandlerObject = {
- lengthBiggerThan4: (obj) => {
- if (obj.value == null) return false;
- return obj.value.length >= 4;
- }
-}
-var conditionalRuleHandlerHelper = {
- lengthBiggerThan4: () => {
- return {
- value: "value"
- }
- }
-}
-```
-
-## Konfigurere dynamikk for skjemakomponenter
-
-1. Legg til de skjemakomponentene som ønskes i layout.
-2. I menyen til høyre, velg å legge til _Regler for beregninger_ eller _Regler for vis/skjul felt_.
- ![Regler for vis/skjul knapp](rules-show-hide.png)
-3. Velg en tilgjengelig funksjon som gjør det du ønsker. Legg eventuelt til en ny funksjon, se beskrivelse over.
- ![Velg regel](rules-select-rule.png)
-4. Sett opp hvilke(t) felt som skal fungere som _input_ til funksjonen - her er det felt i datamodellen som gjelder.
- ![Konfigurere dynamikk](rules-configure.png)
-5. Sett opp hvilke(t) felt som skal påvirkes av regelen (skal motta beregnet verdi, eller skal vises/skjules) - her er det skjemakomponent som gjelder.
- - For regler for vis/skjul felt, kan man velge flere felter som skal vises/skjules basert på samme regel.
-6. Lagre konfigurasjonen.
-7. Test at det fungerer som forventet.
-
-Eksisterende oppsett ligger synlig i menyen til høyre og kan redigeres/slettes.
-
-Konfigurasjonen legges i filen `App/ui/RuleConfiguration.json`. Denne kan også redigeres manuelt ved behov.
-
-## Eksempel på bruk av dynamikk i skjema
-
-Scenario:
-
-En app med skjema har flere felter for input. Én av disse er en radioknapp-gruppe, med valgene "Ja" og "Nei".
-Avhengig av hva sluttbruker velger her, skal forskjellig innhold vises i skjemaet:
-
-- Ja: Et nytt input-felt vises, sammen med ekstra informasjon om hvordan feltet skal fylles ut.
-- Nei: En annen informasjonstekst vises.
-
-Dette kan gjøres ved å legge inn følgende i `RuleHandler.js`, enten via _Rediger dynamikk_ i Altinn Studio, eller ved å laste ned kildekoden
-til appen og redigere lokalt.
-
-```javascript
-var conditionalRuleHandlerObject = {
- sjekkVirksomhetIDrift: (obj) => {
- return (obj.value && obj.value === "Ja");
- },
-
- sjekkVirksomhetIkkeIDrift: (obj) => {
- return (!obj.value || obj.value != "Ja");
- }
-}
-
-var conditionalRuleHandlerHelper = {
- sjekkVirksomhetIDrift: () => {
- return {
- value: "Verdi"
- }
- },
- sjekkVirksomhetIkkeIDrift: () => {
- return {
- value: "Verdi"
- }
- }
-}
-```
-
-Her har to funksjoner blitt opprettet, som sjekker om verdien er henholdsvis "Ja" eller ikke.
-Etter at denne koden er lagt til, kan regelen konfigureres i Altinn Studio. Resultatet vises under.
-
-![Test av dynamikk med dynamikk skjermbilde](dynamics-test.gif "Test av eksempel med dynamikk")
-
-## Dynamikk i repeterende gruppe
-Det er også mulig å sette opp dynamikk innad i en repeterende gruppe. Dette krever at man først setter opp regelen som
-vanlig, og så redigerer på oppsettet i `App/ui/RuleConfiguration.json` manuelt. Helt konkret, er det følgende som må endres:
-
-- For alle `inputParams`, må man legge til `{0}` etter _gruppe-delen_ av datamodellen. F.eks. `Datamodell.gruppe{0}.felt`. Dette erstattes i koden av _indeksen_ til
-hvert enkelt innslag av den repeterende gruppen.
-- For alle `selectedFields` (altså feltene som påvirkes av reglen), må man legge til `{0}` bak felt-ID-en. F.eks. `skjemaFelt1{0}`
-- I tillegg må man legge enn en ny egenskap på regelen, `repeatingGroup`. Denne skal inneholde ID-en til gruppen i layout-filen.
-
-Et eksempel på en regel som er satt opp for repeterende grupper vises under:
-
-```json {hl_lines=[8,12-13,15-17]}
-{
- "data": {
- "ruleConnection": {},
- "conditionalRendering": {
- "9f9f2a50-360b-11ea-b69a-8510e2e248b9": {
- "selectedFunction": "lengthBiggerThan4",
- "inputParams": {
- "value": "Skjemainnhold.personalia.arbeidserfaring{0}.stilling"
- },
- "selectedAction": "Show",
- "selectedFields": {
- "962e2f60-3797-11ea-bfa5-9922024b4738": "a-e-4{0}",
- "something": "arbeidsgiver-adresse{0}"
- },
- "repeatingGroup": {
- "groupId": "arbeidserfaring-group",
- }
- }
- }
- }
-}
-```
-
-### Nøstede repeterende grupper
-
-Det er også mulig å sette opp dynamikk for nøstede repeterende grupper. Oppsettet likner på repeterende grupper, men man har med et ektra parameter `childGroupId` i `repeatingGroup`-objektet, samt en ekstra indeks-indikator.
-
-Eksempel:
-
-```json {hl_lines=[8,12,14,15,16]}
-{
- "data": {
- "ruleConnection": {},
- "conditionalRendering": {
- "hide-nested-group-field": {
- "selectedFunction": "shouldHide",
- "inputParams": {
- "value": "someGroup{0}.nestedGroup{1}.someField"
- },
- "selectedAction": "Hide",
- "selectedFields": {
- "field": "the-component-id{0}{1}"
- },
- "repeatingGroup": {
- "groupId": "mainGroup",
- "childGroupId": "subGroup"
- }
- }
- }
- }
-}
-```
-
-## Eksempel med mer kompleks dynamikk
-
-Scenario:
-Et skjema med to sett med radioknapper (ja/nei) og en avkrysningsboks.
-
-- Når skjema lastes, er kun det første settet med radioknapper synlig.
-- Hvis brukeren velger _Ja_, vises det andre settet med radioknapper.
- - Hvis brukeren velger _Ja_ i det andre settet, blir avkrysningsboksen synlig.
- - Hvis brukeren går tilbake til det første settet med radioknapper og velger _Nei_, blir både det andre settet med radioknapper og avkrysningsboksen ikke lenger synlig.
-
-
-### Alternativ 1
-Dette kan settes opp ved å lage to forskjellige betingelser for når feltene skal vises:
-
-- Én betingelse for det andre settet med radioknapper
- - Vises dersom _Ja_ er valgt i det første settet
-- Én betingelse for avkrysningsboksen
- - Vises dersom _Ja_ er valgt i begge sett med radioknapper.
-
-Kode for å oppnå dette kan se slik ut:
-
-```javascript
-var conditionalRuleHandlerObject = {
- showField2: (obj) => {
- if (obj && obj.field1 && obj.field1=== "yes") {
- return true;
- }
- return false;
- },
-
- showField3: (obj) => {
- if (obj && obj.field1 && obj.field1 === "yes"
- && obj.field2 && obj.field2 === "yes") {
- return true;
- }
- return false;
- }
-}
-
-var conditionalRuleHandlerHelper = {
- showField2: () => {
- return {
- field1: "Field 1"
- };
- },
-
- showField3: () => {
- return {
- field1: "Field 1",
- field2: "Field 2"
- };
- }
-}
-```
-
-### Alternativ 2
-Dette kan også settes opp ved å bruke den samme betingelsen for å vise både det andre settet med radioknapper og avkrysningsboksen. I tillegg må man
-da ha en regel som sletter verdien i det andre settet med radioknapper dersom verdien i det første settet settes til _Nei_:
-
-```javascript
-var ruleHandlerObject = {
- clearField: (obj) => {
- if (obj && obj.checkValue === "no") {
- return "";
- }
- return obj.currentValue;
- }
-}
-
-var ruleHandlerHelper = {
- clearField: () => {
- return {
- checkValue: "check against this value",
- currentValue: "the current value"
- }
- }
-}
-
-var conditionalRuleHandlerObject = {
- showField: (obj) => {
- if (obj && obj.checkField && obj.checkField === "yes") {
- return true;
- }
- return false;
- }
-}
-
-var conditionalRuleHandlerHelper = {
- showField: () => {
- return {
- checkField: "check against this value"
- };
- }
-}
-```
-
-
-## Dynamikk i PDF
-
-Fra versjon 3.0.0 er det også mulig å legge inn dynamikk for PDF. Dette gjøres i _PDF Handler_. Her kan man ved hjelp av logikk velge å skjulte felter eller sider i print.
-
-Appen må inkludere `ui/Settings.json`-filen som [forklart her](../../../../app/development/ux/pages/navigation/#rekkefølge).
-
-Teknisk er det veldlig likt hvordan man gjør det for validering.
-
-Eksempel nedenfor som skjuler et gitt felt basert på innhold. Komponentene er basert på ID som man finner i layout-filene til skjema.
-
-```C#
- public async Task FormatPdf(LayoutSettings layoutSettings, object data)
- {
- if (data is Skjema)
- {
- Skjema skjema = (Skjema)data;
-
- if (skjema?.Innledninggrp9342?.Kontaktinformasjongrp9344?.KontaktpersonNavndatadef2?.value.Contains("tulling") == true)
- {
- layoutSettings.Components = new Components();
- layoutSettings.Components.ExcludeFromPdf = new System.Collections.Generic.List();
- layoutSettings.Components.ExcludeFromPdf.Add("079f205b-c9ea-414d-9983-0d158e833e8a");
- }
- }
-
- return await Task.FromResult(layoutSettings);
- }
- ```
diff --git a/content/app/development/logic/dynamic/dynamics-example-config.png b/content/app/development/logic/dynamic/dynamics-example-config.png
deleted file mode 100644
index a81c33926e3..00000000000
Binary files a/content/app/development/logic/dynamic/dynamics-example-config.png and /dev/null differ
diff --git a/content/app/development/logic/dynamic/dynamics-test.gif b/content/app/development/logic/dynamic/dynamics-test.gif
deleted file mode 100644
index 7053e0baa3f..00000000000
Binary files a/content/app/development/logic/dynamic/dynamics-test.gif and /dev/null differ
diff --git a/content/app/development/logic/dynamic/rules-configure.png b/content/app/development/logic/dynamic/rules-configure.png
deleted file mode 100644
index b68e80a34dc..00000000000
Binary files a/content/app/development/logic/dynamic/rules-configure.png and /dev/null differ
diff --git a/content/app/development/logic/dynamic/rules-select-rule.png b/content/app/development/logic/dynamic/rules-select-rule.png
deleted file mode 100644
index 478f8b2afb4..00000000000
Binary files a/content/app/development/logic/dynamic/rules-select-rule.png and /dev/null differ
diff --git a/content/app/development/logic/dynamic/rules-show-hide.png b/content/app/development/logic/dynamic/rules-show-hide.png
deleted file mode 100644
index 88b9cdd50f8..00000000000
Binary files a/content/app/development/logic/dynamic/rules-show-hide.png and /dev/null differ
diff --git a/content/app/development/logic/events/_index.en.md b/content/app/development/logic/events/_index.en.md
deleted file mode 100644
index d2f894bfefa..00000000000
--- a/content/app/development/logic/events/_index.en.md
+++ /dev/null
@@ -1,68 +0,0 @@
----
-title: App Events
-description: Overview on app events - what it is and how to use it
-toc: false
-tags: []
-weight: 10
----
-
-## Introduction
-App Events is the support for [Altinn Events](/technology/solutions/altinn-platform/events/) within the application template, providing standard event functionality for the application developers.
-
-The functionality provided within the template is:
-
-1. __Pushing events__
- * Enabling of standard events through [configuration](/app/development/configuration/events#activate-generation-of-events-in-your-application)
- * Pushing custom events through [code](/app/development/configuration/events/#pushing-self-defined-events-into-your-application)
-2. __Receiving events__
- * Subscribing to events
- * Validate subscription
- * Run custom code when receiving events
-
-### Subscribing to events
-[Subscring to events is descibed here](subscribing)
-
-### Validate subscriptions
-Once the application successfully have created a subscription, the Event Service will send a ping event. It's a regular event with a specific type `platform.events.validatesubscription`. There is already a handler for this type registered and the validation should be done without further action required.
-
-### Run custom code when receiving events
-All inbound events are received through the EventsReceiverController on the route `/{org}/{app}/api/v1/eventsreceiver`. The controller uses `IEventHandlerResolver` interface to resolve the the class that should handle the event based on mapping the incoming event type to the EventType property on registered implementations of `IEventHandler`.
-
-In order to handle an inbound event, all you have to do is two things:
-
-1. Create an implementation of IEventHandler
-2. Register your implementation in _Program.cs_
-
-#### Create an implementation of IEventHandler
-In order to run your code when you receive an event, you need to create a class implementing the `IEventHandler` interface. `IEventHandler` is an interface that can have multiple implementations registered. The key to resolving the correct implementation is the event type which means you need to set the EventType property equal to the event type you want to handle. This is then matched against the event type of the incoming events, and the `ProcessEvent` method is invoked.
-
-Your implementation can of course have a constructor that takes in any registered service from the dependency injection container needed to handle the event.
-
-```csharp
- using Altinn.App.Core.Features;
- using Altinn.App.Core.Models;
-
- namespace Altinn.App.Core.Internal.Events
- {
- ///
- /// Implementation used to handled events that the Event system used to validate
- /// the events receiver endpoint.
- ///
- public class SubscriptionValidationHandler : IEventHandler
- {
- ///
- public string EventType => "platform.events.validatesubscription";
-
- ///
- public Task ProcessEvent(CloudEvent cloudEvent)
- {
- return Task.FromResult(true);
- }
- }
- }
-```
-#### Register your implementation in _Program.cs_
-Add your implementation of the IEventHandler interface in _Program.cs_ to allow the resolver to find it.
-```csharp
-services.AddTransient();
-```
\ No newline at end of file
diff --git a/content/app/development/logic/events/_index.nb.md b/content/app/development/logic/events/_index.nb.md
deleted file mode 100644
index d0e82ebe02f..00000000000
--- a/content/app/development/logic/events/_index.nb.md
+++ /dev/null
@@ -1,68 +0,0 @@
----
-title: App Events
-description: Overview on app events - what it is and how to use it
-toc: false
-tags: [translate-to-norwegian]
-weight: 10
----
-
-## Introduction
-App Events is the support for [Altinn Events](/technology/solutions/altinn-platform/events/) within the application template, providing standard event functionality for the application developers.
-
-The functionality provided within the template is:
-
-1. __Pushing events__
- * Enabling of standard events through [configuration](/app/development/configuration/events#activate-generation-of-events-in-your-application)
- * Pushing custom events through [code](/app/development/configuration/events/#pushing-self-defined-events-into-your-application)
-2. __Receiving events__
- * Subscribing to events
- * Validate subscription
- * Run custom code when receiving events
-
-### Subscribing to events
-[Subscring to events is descibed here](subscribing)
-
-### Validate subscriptions
-Once the application succesfully have created a subscription, the Event Service will sende a ping event. It's a regular event with a specific type `platform.events.validatesubscription`. There is already a handler for this type registered and the validation should be done without further action required.
-
-### Run custom code when receiving events
-All inbound events are received through the EventsReceiverController on the route `/{org}/{app}/api/v1/eventsreceiver`. The controller uses `IEventHandlerResolver` interface to resolve the the class that should handle the event based on mapping the incoming event type to the EventType property on registered implementations of `IEventHandler`.
-
-In order to handle an inbound event, all you have to do is two things:
-
-1. Create an implementation of IEventHandler
-2. Register your implementation in _Program.cs_
-
-#### Create an implementation of IEventHandler
-In order to run your code when you receive an event, you need to create a class implementing the `IEventHandler` interface. `IEventHandler` is an interface that can have multiple implementations registered. The key to resolving the correct implementation is the event type which means you need to set the EventType property equal to the event type you want to handle. This is then matched against the event type of the incoming events, and the `ProcessEvent` method is invoked.
-
-Your implementation can of course have a constructor that takes in any registred service from the dependency injection container needed to handle the event.
-
-```csharp
- using Altinn.App.Core.Features;
- using Altinn.App.Core.Models;
-
- namespace Altinn.App.Core.Internal.Events
- {
- ///
- /// Implementation used to handled events that the Event system used to validate
- /// the events receiver endpoint.
- ///
- public class SubscriptionValidationHandler : IEventHandler
- {
- ///
- public string EventType => "platform.events.validatesubscription";
-
- ///
- public Task ProcessEvent(CloudEvent cloudEvent)
- {
- return Task.FromResult(true);
- }
- }
- }
-```
-#### Register your implementation in _Program.cs_
-Add your implementation of the IEventHandler interface in _Program.cs_ to allow the resolver to find it.
-```csharp
-services.AddTransient();
-```
\ No newline at end of file
diff --git a/content/app/development/logic/events/subscribing/_index.en.md b/content/app/development/logic/events/subscribing/_index.en.md
deleted file mode 100644
index d91d69b5f81..00000000000
--- a/content/app/development/logic/events/subscribing/_index.en.md
+++ /dev/null
@@ -1,127 +0,0 @@
----
-title: Subscribing
-description: How to set up event subscription in an app
-toc: false
-tags: []
-weight: 10
----
-
-## Subscribing to events
-In order to receive events in the application you need create a subscription. While you can create a subscription authenticated as a user, most scenarios will probably be to authenticate as the organization owning the application, and to create the subscription as part of the startup process of the application. This example covers authenticating as an organization through Maskinporten.
-
-{{% notice warning %}}
-You should first make sure you have a client definition registered in Maskinporten for your application. See [Authenticating with Maskinporten](/api/authentication/maskinporten) on how register a client.
-
-Currently the localtest environment does not support generating inbound events for an app. In order to do this you need use tools like Postman or REST Client in VS Code to send a request to the applicaionts event endpoint.
-{{% /notice %}}
-
-
-## Configuring Maskinporten integration
-Even though we are authenticating through Maskinporten, we can't use the received token directly since Altinn Events only supports an Altinn token. To solve this we need to exchange the Maskinporten token into an Altinn token. The example below adds a message handler to the EventsSubscriptionClient used to communicate with Maskinporten. This handler automatically requests a token from Maskinporten, exchanges it to an Altinn token and adds the token to the request to the Event System when creating a subscription.
-
-This code should be added to _Program.cs_.
-
-```csharp
-services.AddMaskinportenHttpClient(
- config.GetSection("MaskinportenSettings"), clientDefinition =>
- {
- clientDefinition.ClientSettings.Scope = "altinn:serviceowner/instances.read";
- clientDefinition.ClientSettings.ExhangeToAltinnToken = true;
- }).AddTypedClient();
-```
-
-Scope and ExchangeToAltinnToken need to be configured in code and not in _AppSettings.json_ if you have multiple external dependencies that requires the use of Maskinporten. This is to avoid scopes belonging to one external api being sent to another api. Some api's accept this while others will reject the request due to unknown scopes. It's also best practice not to leak unnecessary scopes to other api's that don't require it to avoid token misuse.
-
-{{% notice info %}}
-The `MaskinportenClientDefinition` in the example above is a custom implementation of `IClientDefinition` from the nuget package [Altinn.ApiClients.Maskinporten](https://github.com/Altinn/altinn-apiclient-maskinporten) which is included as a part of the `Altinn.App.Core` package. If you don't need a custom implementation you can use one of the [built in client definitions](https://github.com/Altinn/altinn-apiclient-maskinporten).
-{{% /notice %}}
-
-Depending on what type of ClientDefinition you use you typically need to specify either a certificate file and password, encoded jwk, encoded x509 certificate or enterprise username/password in order to authenticate with Maskinporten in addition to the environment and client id. These can be shared between the various integrations.
-
-```json
- "MaskinportenSettings": {
- "Environment": "ver2",
- "ClientId": "",
- "CertificatePkcs12Path": "",
- "CertificatePkcs12Password": ""
- }
-```
-
-Here is a [C# class of the settings available](https://github.com/Altinn/altinn-apiclient-maskinporten/blob/main/src/Altinn.ApiClients.Maskinporten/Config/MaskinportenSettings.cs) for reference.
-
-### Protecting the event endpoint with a secret
-Receiving events in the application is based on exposing a webhook endpoint to which the Event Service posts the event. Upon receiving an event, the application validates if a secret is provided before accepting the event. The secret is provided by implementing the `IEventSecretCodeProvider` interface. By default there is an example implementation in place using a key from the key vault using a key with the name `EventSubscription--SecretCode` in the key vault the value of that key is used. You should hover not use the same key/value for multiple applications so it's recommended to create your own implementation.
-
-When developing locally you should set the secret as a dotnet user-secret by running the following command in the root folder of the application:
-
-```bash
-dotnet user-secrets set "EventSubscription--SecretCode" "your-secret-code"
-```
-
-{{% notice info %}}
-Note that the return url and the secret code is part of the subscription definition. This means that if you rotate the key, you should remove the existing subscription first, or else you will have two active subscriptions for the same events.
-{{% /notice %}}
-
-### Create subscription
-Once you have your client registered with Maskinporten, your config setup, your ClientDefinition in place and your webhook secret defined - you are ready to add the code required to make a subscription.
-
-The example below is using the `IHostedService` from Microsoft which, in this case, run once after the services are registered in the container, but before the application is configured.
-
-```csharp
-using Altinn.App.Core.Infrastructure.Clients.Events;
-using Altinn.App.Core.Internal.Events;
-using Altinn.App.Core.Models;
-using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.Logging;
-
-namespace Altinn.App.Core.EFormidling
-{
- ///
- /// Hosted service to set up prequisites for Eformidling integration.
- ///
- public class EformidlingStartup : IHostedService
- {
- private readonly AppIdentifier _appIdentifier;
- private readonly IEventsSubscription _eventsSubscriptionClient;
- private readonly ILogger _logger;
-
- ///
- /// Initializes a new instance of the class.
- ///
- public EformidlingStartup(AppIdentifier appId, IEventsSubscription eventsSubscriptionClient, ILogger logger)
- {
- _appIdentifier = appId;
- _eventsSubscriptionClient = eventsSubscriptionClient;
- _logger = logger;
- }
-
- ///
- public async Task StartAsync(CancellationToken cancellationToken)
- {
- var eventType = "app.eformidling.reminder.checkinstancestatus";
- try
- {
- Subscription subscription = await _eventsSubscriptionClient.AddSubscription(_appIdentifier.Org, _appIdentifier.App, eventType);
-
- _logger.LogInformation("Successfully subscribed to event {eventType} for app {appIdentifier}. Subscription {subscriptionId} is being used.", eventType, _appIdentifier, subscription.Id);
- }
-
- catch (Exception ex)
- {
- _logger.LogError("Unable to subscribe to event {eventType} for app {appIdentifier}. Received exception {exceptionMessage} with {stackTrace}", eventType, _appIdentifier, ex.Message, ex.StackTrace);
- throw;
- }
- }
-
- ///
- public Task StopAsync(CancellationToken cancellationToken)
- {
- return Task.CompletedTask;
- }
- }
-}
-
-```
-{{% notice theme="warning" %}}
-If the hosted service fail to run successfully, ie. throws an exception, the application will fail to start. If you don't won't this behavior you should catch any exception and don't rethrow it.
-{{% /notice %}}
diff --git a/content/app/development/logic/events/subscribing/_index.nb.md b/content/app/development/logic/events/subscribing/_index.nb.md
deleted file mode 100644
index 2ea9cc1bfa6..00000000000
--- a/content/app/development/logic/events/subscribing/_index.nb.md
+++ /dev/null
@@ -1,127 +0,0 @@
----
-title: Subscribing
-description: How to set up event subscription in an app
-toc: false
-tags: [translate-to-norwegian]
-weight: 10
----
-
-## Subscribing to events
-In order to receive events in the application you need create a subscription. While you can create a subscription authenticated as a user, most scenarios will probably be to authenticate as the organization owning the application, and to create the subscription as part of the startup process of the application. This example covers authenticating as an organization through maskinporten.
-
-{{% notice warning %}}
-You should first make sure you have a client definition registered in Maskinporten for your application. See [Authenticating with Maskinporten](/api/authentication/maskinporten) on how register a client.
-
-Currently the localtest environment does not support generating inbound events for an app. In order to do this you need use tools like Postman or REST Client in VS Code to send a request to the applicaionts event endpoint.
-{{% /notice %}}
-
-
-## Configuring Maskinporten integration
-Even though we are authenticating through maskinporten, we can't use the received token directly since Altinn Events only supports an Altinn token. To solve this we need to exchange the Maskinporten token into an Altinn token. The example below adds a message handler to the EventsSubscriptionClient used to communicate with Maskinporten. This handler automatically requests a token from Maskinporten, exchanges it to an Altinn token and adds the token to the request to the Event System when creating a subscription.
-
-This code should be added to _Program.cs_.
-
-```csharp
-services.AddMaskinportenHttpClient(
- config.GetSection("MaskinportenSettings"), clientDefinition =>
- {
- clientDefinition.ClientSettings.Scope = "altinn:serviceowner/instances.read";
- clientDefinition.ClientSettings.ExhangeToAltinnToken = true;
- }).AddTypedClient();
-```
-
-Scope and ExchangeToAltinnToken need to be configured in code and not in _AppSettings.json_ if you have multiple external dependencies that requires the use of Maskinporten. This is to avoid scopes belonging to one external api being sent to another api. Some api's accept this while others will reject the request due to unknown scopes. It's also best practice not to leak unnecessary scopes to other api's that don't require it to avoid token misuse.
-
-{{% notice info %}}
-The `MaskinportenClientDefinition` in the example above is a custom implementation of `IClientDefinition` from the nuget package [Altinn.ApiClients.Maskinporten](https://github.com/Altinn/altinn-apiclient-maskinporten) which is included as a part of the `Altinn.App.Core` package. If you don't need a custom implementation you can use one of the [built in client definitions](https://github.com/Altinn/altinn-apiclient-maskinporten).
-{{% /notice %}}
-
-Depending on what type of ClientDefintion you use you typically need to specify either a certificate file and password, encoded jwk, encoded x509 certificate or enterprise username/password in order to authenticate with Maskinporten in addition to the environment and client id. These can be shared between the various integrations.
-
-```json
- "MaskinportenSettings": {
- "Environment": "ver2",
- "ClientId": "",
- "CertificatePkcs12Path": "",
- "CertificatePkcs12Password": ""
- }
-```
-
-Here is a [C# class of the settings available](https://github.com/Altinn/altinn-apiclient-maskinporten/blob/main/src/Altinn.ApiClients.Maskinporten/Config/MaskinportenSettings.cs) for reference.
-
-### Protecting the event endpoint with a secret
-Receving events in the application is based on exposing a webhook endpoint to which the Event Service posts the event. Upon receiving an event, the application validates if a secret is provided before accepting the event. The secret is provided by implementing the `IEventSecretCodeProvider` interface. By default there is an example implementation in place using a key from the key vault using a key with the name `EventSubscription--SecretCode` in the key vault the value of that key is used. You should hover not use the same key/value for multiple applications so it's recomended to create your own implementation.
-
-When developing locally you should set the secret as a dotnet user-secret by running the following command in the root folder of the application:
-
-```bash
-dotnet user-secrets set "EventSubscription--SecretCode" "your-secret-code"
-```
-
-{{% notice info %}}
-Note that the return url and the secret code is part of the subscription definition. This means that if you rotate the key, you should remove the existing subscription first, or else you will have two active subscriptions for the same events.
-{{% /notice %}}
-
-### Create subscription
-Once you have your client registered with Maskinporten, your config setup, your ClientDefinition in place and your webhook secret defined - you are ready to add the code required to make a subscription.
-
-The example below is using the `IHostedService` from Microsoft which, in this case, run once after the services are registered in the container, but before the application is configured.
-
-```csharp
-using Altinn.App.Core.Infrastructure.Clients.Events;
-using Altinn.App.Core.Internal.Events;
-using Altinn.App.Core.Models;
-using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.Logging;
-
-namespace Altinn.App.Core.EFormidling
-{
- ///
- /// Hosted service to set up prequisites for Eformidling integration.
- ///
- public class EformidlingStartup : IHostedService
- {
- private readonly AppIdentifier _appIdentifier;
- private readonly IEventsSubscription _eventsSubscriptionClient;
- private readonly ILogger _logger;
-
- ///
- /// Initializes a new instance of the class.
- ///
- public EformidlingStartup(AppIdentifier appId, IEventsSubscription eventsSubscriptionClient, ILogger logger)
- {
- _appIdentifier = appId;
- _eventsSubscriptionClient = eventsSubscriptionClient;
- _logger = logger;
- }
-
- ///
- public async Task StartAsync(CancellationToken cancellationToken)
- {
- var eventType = "app.eformidling.reminder.checkinstancestatus";
- try
- {
- Subscription subscription = await _eventsSubscriptionClient.AddSubscription(_appIdentifier.Org, _appIdentifier.App, eventType);
-
- _logger.LogInformation("Successfully subscribed to event {eventType} for app {appIdentifier}. Subscription {subscriptionId} is being used.", eventType, _appIdentifier, subscription.Id);
- }
-
- catch (Exception ex)
- {
- _logger.LogError("Unable to subscribe to event {eventType} for app {appIdentifier}. Received exception {exceptionMessage} with {stackTrace}", eventType, _appIdentifier, ex.Message, ex.StackTrace);
- throw;
- }
- }
-
- ///
- public Task StopAsync(CancellationToken cancellationToken)
- {
- return Task.CompletedTask;
- }
- }
-}
-
-```
-{{% notice theme="warning" %}}
-If the hosted service fail to run succesfully, ie. throws an exception, the application will fail to start. If you don't won't this behavior you shold catch any exception and don't rethrow it.
-{{% /notice %}}
diff --git a/content/app/development/logic/expressions/_index.en.md b/content/app/development/logic/expressions/_index.en.md
deleted file mode 100644
index de5928e9900..00000000000
--- a/content/app/development/logic/expressions/_index.en.md
+++ /dev/null
@@ -1,983 +0,0 @@
----
-title: Dynamic expressions
-linktitle: Expressions
-description: Overview of dynamic expressions defined in JSON
-tags: [dynamics, translate-to-english]
-toc: true
----
-
-{{% panel theme="warning" %}}
-⚠️ Dynamic behaviour is an area under active development. This functionality is currently available as a beta feature in
-Altinn Studio and offers limited configuration options. The UI only allows to build expressions with one level of
-nesting, meaning an unlimited number of un-nested expressions can be combined using either the *OR* or *AND* operator.
-However, the tool allows to edit more complicated expressions by freestyle writing. Currently the tool is also limited
-to connecting expression to boolean component fields.
-See [Expressions in Altinn Studio](../../../../altinn-studio/designer/build-app/expressions) on how to use Altinn Studio
-to configure an expression.
-{{% /panel %}}
-
-## Introduction
-
-Dynamic expressions enable the definition of simple dynamic behavior in an Altinn 3 app, such as defining whether a form
-field should be shown or hidden, whether the field should be required or read-only.
-
-These expressions are available in all Altinn 3 apps that use frontend version
-[3.54.0](https://github.com/Altinn/app-frontend-react/releases/tag/v3.54.0) or later. By using this version or the
-latest major version, you can use dynamic expressions for [several use cases](#use-cases).
-
-Starting from version `7.2.0` of the [nuget packages](../../../maintainance/dependencies#nuget) the expressions are also
-supported in the backend. This means that the server will be able to evaluate the expressions and remove data upon
-submission that is potentially stored in the [data model](../../data/data-model) /*9+and is associated with
-fields/components that are later hidden. Note that this only applies to data in the data model that is associated with
-hidden components - data in the data model that is not associated with components (and is thus implicitly hidden from
-the user) will not be automatically removed.
-
-It also makes it possible to omit submitting data that is otherwise associated with required fields - if these required
-fields are hidden in the form using dynamic expressions. This also applies when submitting directly from the API.
-
-**Note:** Note that automatic removal of hidden data must currently be manually activated (opt-in) by adding the following
-line to `App/appsettings.json` after upgrading the [nuget packages](../../../maintainance/dependencies#nuget)
-to `7.2.0` or later:
-
-{{}}
-
-{{}}
-
-```json {linenos=false,hl_lines=[5]}
- "AppSettings": {
- "OpenIdWellKnownEndpoint": "http://localhost:5101/authentication/api/v1/openid/",
- "RuntimeCookieName": "AltinnStudioRuntime",
- "RegisterEventsWithEventsComponent": false,
- "RemoveHiddenData": true
- },
-```
-
-{{}}
-
-{{}}
-
-```json {linenos=false,hl_lines=[5]}
- "AppSettings": {
- "OpenIdWellKnownEndpoint": "http://localhost:5101/authentication/api/v1/openid/",
- "RuntimeCookieName": "AltinnStudioRuntime",
- "RegisterEventsWithEventsComponent": false,
- "RemoveHiddenDataPreview": true
- },
-```
-
-{{}}
-{{}}
-
-### Structure and syntax
-
-Structure and syntax:
-
-The expressions are built up as a kind of mini-programming language, where everything is defined in JSON. The
-expressions themselves are always a list (array) of values, where the first value in each list is always a
-[function name](#functions). The rest of the values are sent as input/arguments to the function.
-
-```json
-["equals", "foo", "bar"]
-```
-
-In the example above, the strings "foo" and "bar" are compared. They are different, so the result of this expression is
-a boolean value; false.
-
-This function, [equals](#func-equals), expects to receive two [strings](#strings) as input/arguments. It is also
-possible to give it another expression as the second argument. If you do this, the expression will be interpreted so that
-the innermost functions are executed first, and the outermost ones are executed last
-
-```json
-["equals", ["component", "firstName"], "John"]
-```
-
-In this example, the innermost expression/function call ["component", "firstName"] is executed first. If the value of
-the "firstName" component is equal to the string "John", the function returns the boolean value "true".
-
-If you then use this expression for the `hidden` property of a component, the component will be hidden if you enter "John"
-in the "firstName" component elsewhere in the application:
-
-```json
-{
- "id": "lastName",
- "type": "Input",
- ...
- "hidden": ["equals", ["component", "firstName"], "John"]
-}
-```json
-
-There are no limitations on how large/deep the expressions can be. As an exercise, see if you can read what this
-expression does, and what possible values it can return:
-```json
-[
- "if",
- ["greaterThanEq", ["component", "age"], 16],
- [
- "if",
- ["lessThan", ["component", "age"], 62],
- "Please consider applying for our open position!",
- "else",
- ["concat", "At ", ["component", "age"], ", you are eligible for retirement"]
- ],
- "else",
- ["concat", "At ", ["component", "age"], ", you should stay in (pre)school"]
-]
-```
-
-{{% expandlarge id="answer-expandable" header="Spoiler Alert: Click here for an interpretation of the above expression" %}}
-The expression checks the value of a hypothetical component with ID "age". If the person is 16 years
-or older, for example 45 years old, the text "Please consider applying for our open position!" is returned if the age is
-less than 62. Otherwise, the text "At 45, you are eligible for retirement" is returned. If the person is younger than
-16, the text "At 5, you should stay in (pre)school" is returned, assuming the age is 5.
-
-**Please consider applying for our open position!**
-
-For a person who is 62 years old, the text returned is:
-
-**At 62, your are eligible for retirement**
-
-And for a person who is 15 years old (or younger, such as a 4-year-old), the text returned is:
-
-**At 4, you should stay in (pre)school**
-{{% /expandlarge %}}
-
----
-### Use Cases
-
-Dynamic expressions are currently available for use in these properties, as defined in [layout files](../../ux/pages).
-
-| Components | Property | Expected Value | Frontend | Backend |
-| -------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | -------------------------- | -------- | ------- |
-| [Pages/layouts](#showhide-entire-pages) | `hidden` | [Boolean](#boolean-values) | ✅ | ✅ |
-| All | `hidden` | [Boolean](#boolean-values) | ✅ | ✅ |
-| Form components | `required` | [Boolean](#boolean-values) | ✅ | ✅ |
-| Form components | `readOnly` | [Boolean](#boolean-values) | ✅ | ❌ |
-| [Repeating groups](../../ux/fields/grouping/repeating) | `hiddenRow` | [Boolean](#boolean-values) | ✅ | ❌ |
-| [Repeating groups](../../ux/fields/grouping/repeating) | `edit.addButton` | [Boolean](#boolean-values) | ✅ | ❌ |
-| [Repeating groups](../../ux/fields/grouping/repeating) | `edit.saveButton` | [Boolean](#boolean-values) | ✅ | ❌ |
-| [Repeating groups](../../ux/fields/grouping/repeating) | `edit.deleteButton` | [Boolean](#boolean-values) | ✅ | ❌ |
-| [Repeating groups](../../ux/fields/grouping/repeating) | `edit.alertOnDelete` | [Boolean](#boolean-values) | ✅ | ❌ |
-| [Repeating groups](../../ux/fields/grouping/repeating) | `edit.saveAndNextButton` | [Boolean](#boolean-values) | ✅ | ❌ |
-| [RadioButtons](../../ux/components/radiobuttons), [Checkboxes](../../ux/components/checkbox), [Dropdown](../../ux/components/dropdown) | `source.label` | [String](#strings) | ✅ | ❌ |
-| [RadioButtons](../../ux/components/radiobuttons), [Checkboxes](../../ux/components/checkbox), [Dropdown](../../ux/components/dropdown) | `source.description` | [String](#strings) | ✅ | ❌ |
-| [RadioButtons](../../ux/components/radiobuttons), [Checkboxes](../../ux/components/checkbox), [Dropdown](../../ux/components/dropdown) | `source.helpText` | [String](#strings) | ✅ | ❌ |
-| All | `textResourceBindings.[*]` \* | [String](#strings) | ✅ | ❌ |
-
-\* = The values that can be overridden with textResourceBindings vary from component to component, but will work wherever
-used. For repeating groups, you can find [more information here](../../ux/fields/grouping/repeating#textresourcebindings)
-
-{{% expandlarge id="rep-group-edit-button-text" header="Example: Change repeating group edit button text" %}}
-
-Here we change the text of the edit button in a repeating group based on whether `IsPrefill` is set to `true` in a given
-address in the data model. If `IsPrefill` is `true` for an address, the row displaying that address will have an edit
-button with the text `"View"`. If `IsPrefill` is `false`, the button text will be `"Edit"` for that specific row.
-
-It is worth to mention that if a lookup on `IsPrefill` returns `null` (not found), the result is converted to `false`
-when used in an `if`. Read more about this in the sections on [if](#func-if) and [data types](#data-types)
-```json
-{
- "id": "repeatingAddressGroup",
- "type": "Group",
- "children": ["field-id-one", "field-id-two"],
- "dataModelBindings": {
- "group": "Citizen.FormerAdresses"
- },
- "maxCount": 10,
- "textResourceBindings": {
- "edit_button_open": [
- "if",
- ["dataModel", "Citizen.FormerAdresses.IsPrefill"],
- "View",
- "else",
- "Edit"
- ]
- }
-}
-```
-
-{{% /expandlarge %}}
-
-### Testing, feilsøking og utvikling av uttrykk
-
-### Testing, Debugging, and Developing Expressions
-
-When writing an expression, it's useful to have an idea of what the result will be and whether the expression is valid.
-Invalid expressions will give a warning in the JavaScript console in the browser when the page loads, so it's a good
-idea to have this console open when developing an application and testing expressions locally.
-
-It's also possible to test the execution of an expression directly in the developer tools. This is done by pressing
-`Ctrl + Shift + K` (or `Cmd + Shift + K` on Mac) and navigating to the expression tab. Expressions may behave differently
-depending on the component they are evaluated near. Therefore, you can also select a component to be used as context when
-evaluating the expression in the developer tools.
-
-{{% expandlarge id="rep-group-expandable" header="Example of IDs and Evaluation in Repeating Groups" %}}
-
-**Note:** This describes some implementation details in
-[app-frontend-react](https://github.com/Altinn/app-frontend-react/) and is only relevant when testing an expression in
-the developer tools that depends on a known position in a repeating group. This may change in the future, and such
-changes will not affect expressions defined in an application. The context is retrieved from where the expression is
-defined in the layout file.
-
-Imagine a [repeating group](../../ux/fields/grouping/repeating) for people with two fields: `name` and `age`. Given the
-following expression:
-
-`["component", "age"]`
-
-What will the age be? It may vary depending on which group evaluates the expression. If there are two groups/rows, both
-the `name` and `age` components will exist twice. These will have IDs `name-0` and `age-0` (for the first row) and
-`name-1` and `age-1` (for the second row).
-
-Imagine the following data is filled in a repeating group:
-
-| Name | Component ID | Age | Component ID |
-| ---- | ------------ | --- | ------------ |
-| Per | `name-0` | 24 | `age-0` |
-| Kari | `name-1` | 36 | `age-1` |
-| Ola | `name-2` | 18 | `age-2` |
-
-Given the following expression:
-
-```json
-["component", "age"]
-```
-
-And with these assumptions:
-
-1. No context has been given (or the expression is placed on a component that is not near an `age` component)
-2. The expression is evaluated in the context of `name-0`
-3. The expression is evaluated in the context of `name-1`
-
-What will the result be in the different examples? Here are the answers:
-
-1. This will find the "first and best" `age` component and thus find `age-0`. It therefore returns _24_, Per's age.
-2. Here, we try to search in the context of the `name` component on the first row, and again we find _24_, Per's age.
-3. In the last example, we have specified the second row in the repeating group by evaluating in the context of `name-1`.
-Here we find the closest `age` component `age-1`, which is _36_, Kari's age.
-
-{{% /expandlarge %}}
-
-## Functions
-
-These functions are available for use in expressions:
-
-| Function Name | Parameters | Return Value | Frontend | Backend |
-|----------------------------------------------|--------------------------------------------------------------------------------------------------| ------------------------------------ | -------- | ------- |
-| [`equals`](#func-equals) | [String](#strings), [String](#strings) | [Boolean](#boolean-values) | ✅ | ✅ |
-| [`notEquals`](#func-equals) | [String](#strings), [String](#strings) | [Boolean](#boolean-values) | ✅ | ✅ |
-| [`not`](#func-not) | [Boolean](#boolean-values) | [Boolean](#boolean-values) | ✅ | ✅ |
-| [`greaterThan`](#func-gt) | [Number](#numbers), [Number](#numbers) | [Boolean](#boolean-values) | ✅ | ✅ |
-| [`greaterThanEq`](#func-gt) | [Number](#numbers), [Number](#numbers) | [Boolean](#boolean-values) | ✅ | ✅ |
-| [`lessThan`](#func-gt) | [Number](#numbers), [Number](#numbers) | [Boolean](#boolean-values) | ✅ | ✅ |
-| [`lessThanEq`](#func-gt) | [Number](#numbers), [Number](#numbers) | [Boolean](#boolean-values) | ✅ | ✅ |
-| [`concat`](#func-concat) | None or multiple [strings](#strings) | [String](#strings) | ✅ | ✅ |
-| [`and`](#func-and) | One or more [boolean values](#boolean-values) | [Boolean](#boolean-values) | ✅ | ✅ |
-| [`or`](#func-and) | One or more [boolean values](#boolean-values) | [Boolean](#boolean-values) | ✅ | ✅ |
-| [`if`](#func-if) | [See detailed description](#func-if) | [See detailed description](#func-if) | ✅ | ✅ |
-| [`contains`](#func-contains-not-contains) | [String](#strings), [String](#strings) | [Boolean](#boolean-values) | ✅ | ✅ |
-| [`notContains`](#func-contains-not-contains) | [String](#strings), [String](#strings) | [Boolean](#boolean-values) | ✅ | ✅ |
-| [`commaContains`](#func-commaContains) | [String](#strings), [String](#strings) | [Boolean](#boolean-values) | ✅ | ✅ |
-| [`startsWith`](#func-starts-ends-with) | [String](#strings), [String](#strings) | [Boolean](#boolean-values) | ✅ | ✅ |
-| [`endsWith`](#func-starts-ends-with) | [String](#strings), [String](#strings) | [Boolean](#boolean-values) | ✅ | ✅ |
-| [`lowerCase`](#func-lowerCase-upperCase) | [String](#strings) | [String](#strings) | ✅ | ✅ |
-| [`upperCase`](#func-lowerCase-upperCase) | [String](#strings) | [String](#strings) | ✅ | ✅ |
-| [`stringLength`](#func-stringLength) | [String](#strings) | [Number](#numbers) | ✅ | ✅ |
-| [`text`](#func-text) | [String](#strings) | [String](#strings) | ✅ | ❌ |
-| [`language`](#func-language) | None | [String](#strings) | ✅ | ❌ |
-| [`displayValue`](#func-displayValue) | [String](#strings) | [String](#strings) | ✅ | ❌ |
-| [`round`](#func-round) | [Number](#numbers), optional [Number](#numbers) | [String](#strings) | ✅ | ✅ |
-| [`instanceContext`](#func-instancecontext) | [String](#strings) | [String](#strings) | ✅ | ✅ |
-| [`frontendSettings`](#func-frontendsettings) | [String](#strings) | [String](#strings) | ✅ | ✅ |
-| [`dataModel`](#func-datamodel) | [String](#strings) | [String](#strings) | ✅ | ✅ |
-| [`component`](#func-component) | [String](#strings) | [String](#strings) | ✅ | ✅ |
-| [`formatDate`](#func-formatDate) | [String](#strings), optional [String](#strings) | [String](#strings) | ✅ | ❌ |
-| [`linkToPage`](#func-linkToPage) | [String](#strings), [String](#strings) | [String](#strings) | ✅ | ❌ |
-| [`linkToComponent`](#func-linkToComponent) | [String](#strings), [String](#strings) | [String](#strings) | ✅ | ❌ |
-
-Detailed descriptions and examples
-
-{{% expandlarge id="func-equals" header="equals / notEquals" %}}
-These two functions compare two strings to check if they are equal (equals) or not equal (notEquals). If you send in
-values other than strings, the values are converted and compared as strings (read more about conversion here).
-
-Examples:
-
-```json
-{
- "id": "lastName",
- "type": "Input",
- ...
- "hidden": ["equals",
- ["dataModel", "My.Model.FirstName"],
- "Ola"
- ],
- "readOnly": ["notEquals",
- ["frontendSettings", "FormIsEditable"],
- true
- ]
-}
-```
-
-`notEquals` is essentially the same as, and a shortcut to, `["not", ["equals", ...]]`.
-
-See also tips and tricks under [_String or less string comparison?_](#string-or-smaller-string-comparison)
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-not" header="not" %}}
-This function takes in a [boolean value](#boolean-values) or something that can be converted to a boolean value and
-returns the opposite boolean value. True becomes false, false becomes true.
-
-
-The function can be useful if you want to _invert_ an expression. Instead of thinking about writing an expression that
-_hides_ a component given certain conditions, you can wrap the expression in `not` and write the expression based on what
-is needed to _show_ the component:
-
-
-```json
-{
- "id": "lastName",
- "type": "Input",
- "hidden": [
- "not",
- ["or", ["dataModel", "ShowLastName"], ["frontendSettings", "ShowAllFields"]]
- ]
-}
-```
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-gt" header="greaterThan / greaterThanEq / lessThan / lessThanEq" %}}
-These 4 functions expect two input numbers and compare whether _the first_ is compared with _the second_. That is, for
-the function `greaterThan`, the expression is true if the first number is _greater than_ the second.
-
-| Function | Description | Symbol |
-| --------------- | --------------------------------------------------------------- | ------ |
-| `greaterThan` | Is the first number _greater than_ the second number? | \> |
-| `greaterThanEq` | Is the first number _greater than or equal to_ the second number? | ≥ |
-| `lessThan` | Is the first number _less than_ the second number? | \< |
-| `lessThanEq` | Is the first number _less than or equal to_ the second number? | ≤ |
-
-If any of the arguments to these functions are [`null`](#null), the result will be `false` (regardless of whether it is
-the first or second argument).
-
-Example checking if age is over (or equal to) 18:
-
-```json
-["greaterThanEq", ["component", "alder"], 18]
-```
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-concat" header="concat" %}}
-This function takes 0 or more strings as arguments and returns a string where all the strings in the arguments are
-concatenated. If the function is called without any arguments, it returns an empty string.
-
-Note that the function doesn't automatically add spaces or commas when concatenating strings. To provide a more readable
-result, it's recommended to add dashes where necessary:
-
-```json
-["concat", "Congratulations on your ", ["component", "age"], "th birthday!"]
-```
-
-The expression above gives the text Congratulations on your 18th-birthday! if the value in the age component was 18.
-
-In the `concat`-function, [`null`](#null)-values are interpreted as empty strings. [Boolean values](#boolean-values)
-are output as the strings "true" and "false".
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-and" header="and / or" %}}
-The functions `and` and `or` expect 1 or more boolean values and produce a result based on whether **all** or
-**at least one** of the values were true (`true`).
-
-| Function | Description |
-| -------- | ------------------------------------------------ |
-| `and` | Are **all** the arguments true? (`true`) |
-| `or` | Is **at least one** of the arguments true? (`true`) |
-
-Providing [`null`](#null) values will interpret them as false (`false`). Examples of usage can be found under
-[_String or smaller string comparison?_](#string-or-smaller-string-comparison)
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-if" header="if" %}}
-The `if` function can be used to branch an expression so that the return value is controlled by the result of another
-boolean expression. The function can be called in two different ways: with 2 or 4 arguments:
-
-| Argument | Alternative 1 | Alternative 2 |
-| --------------- | ---------------------------- | ---------------------------- |
-| First argument | [Boolean](#boolean-values) | [Boolean](#boolean-values) |
-| Second argument | [Any type](#data-types) | [Any type](#data-types) |
-| Third argument | | The string `"else"` |
-| Fourth argument | | [Any type](#data-types) |
-
-
-In **alternative 1**, the return value of the function will be the value given as the second argument
-_if the first argument is true (`true`)_. If not, it returns the value `null`.
-
-In **alternative 2**, the return value of the function will be the value given as the second argument
-_if the first argument is true (`true`)_. If not, it returns the value given in the fourth argument. You **must always**
-provide the string `"else"` as the third argument if you want to call the function with 4 arguments. The third argument
-is only there to make the expression more readable and serves no other function.
-
-If you want more conditions and possible return values, you can nest multiple `if` calls inside the second or fourth argument:
-
-```json
-[
- "if",
- ["greaterThan", ["component", "birthYear"], 1945],
- "You were born after the World Wars",
- "else",
- [
- "if",
- ["greaterThanEq", ["component", "birthYear"], 1939],
- "You were born during World War II",
- "else",
- "You were born before World War II"
- ]
-]
-```
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-language" header="language" %}}
-The function `language` returns the user's selected language code.
-
-Example:
-
-```json
-{
- "id": "lastName",
- "type": "Input",
- ...
- "readOnly": ["equal", ["language"], "en"],
-}
-```
-
-If the current language is unknown, `nb` will be returned, which is the default language for Altinn 3 apps.
-Therefore, you can be confident that this function always returns a valid language.
-
-**Note:** This function is not yet available in backend code. Consequently, it will generate an error message if used in
-places [where expressions run on the backend](#use-cases), and if the functionality to automatically delete hidden data
-(`RemoveHiddenDataPreview`) has been enabled.
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-starts-ends-with" header="startsWith/endsWith" %}}
-The `startsWith` function checks if the string provided as the first argument starts with the string given in the second
-argument. Similarly, the `endsWith` function checks if the first string ends with the second string.
-
-
-```json
-["startsWith", ["dataModel", "My.Model.FirstName"], "Jo"]
-```
-
-```json
-["endsWith", ["dataModel", "My.Model.FirstName"], "hn"]
-```
-
-Some important details about these functions:
-
-- All functions start and end with an empty string, so `startsWith` and `endsWith` will always return `true` if using an
-expression like `["startsWith", "...", ""]`. This is crucial to consider when using the value of a component or a lookup
-in the data model as the second argument.
-- No strings start or end with a `null` value. If an expression like this is used:
- ```json
- [
- "startsWith",
- ["dataModel", "My.Model.FullName"],
- ["dataModel", "My.Model.FirstName"]
- ]
- ```
- the result will always be `false` as long as the first name is not provided. However, as mentioned earlier, if the first
- name is set to an empty string (for example, if the user has erased their first name), the expression will return `true`
- if a full name is set. To avoid some of this behavior, you can use the `if` function together with `equals` to check if
- something is set to an empty string.
-- `["startsWith", null, null]` always returns `false`.
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-stringLength" header="stringLength" %}}
-The function `stringLength` returns the length of a string (in number of letters/characters), including spaces.
-
-Example:
-
-```json
-["stringLength", ["dataModel", "My.Model.FirstName"]]
-```
-
-If the string is `null`, `stringLength` will return 0.
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-contains-not-contains" header="contains / notContains" %}}
-These two functions check whether string A includes or does not include string B.
-Both `contains` and `notContains` are case-sensitive. This means that the string "Hei" does not include "hei". If you
-want to compare regardless of case, you can use the functions [`lowerCase` or `upperCase`](#func-lowerCase-upperCase)
-along with `contains` or `notContains`.
-
-Example:
-
-```json
-{
- "id": "lastName",
- "type": "Input",
- ...
- "hidden": [
- "contains",
- ["dataModel", "My.Model.FirstName"],
- "J"
- ],
- "readOnly": [
- "notContains",
- ["dataModel", "My.Model.FirstName"],
- "D"
- ]
-}
-```
-
-If you want to check for values in a comma-separated list, you can use the function [`commaContains`](#func-commaContains).
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-commaContains" header="commaContains" %}}
-The function `commaContains` takes two arguments. The first argument is a comma-separated string, and the second argument
-is the string you want to check if it's among the comma-separated values in the first argument.
-
-Example:
-
-```json
-{
- "id": "addName",
- "type": "Input",
- ...
- "readOnly": ["commaContains", ["dataModel", "My.Model.Names"], "Ola"]
-}
-```
-
-Note that any spaces before/after commas or before/after the first value are ignored. This function is particularly
-useful in cases where you use a component that stores multiple values in a comma-separated string, such as `Checkboxes`
-and `MultipleSelect`.
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-lowerCase-upperCase" header="lowerCase/upperCase" %}}
-The functions `lowerCase` and `upperCase` take a string as input and return a new string where all characters are
-converted to lowercase or uppercase, respectively.
-
-```json
-["lowerCase", ["dataModel", "My.Model.LastName"]]
-```
-
-These functions provide a simple way to convert between lowercase and uppercase letters within a string.
-One use case could be combining one of these functions with other comparison functions so that the comparisons are done
-regardless of whether uppercase or lowercase letters were used in the input value.
-
-```json
-["equals", ["upperCase", ["dataModel", "My.Model.LastName"]], "SMITH"]
-```
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-round" header="round" %}}
-The function `round` rounds a number to an integer or, optionally, to a decimal number with a configurable number of
-decimal places.
-
-Example of rounding to 2 decimal places:
-
-```json
-["round", "122.99843", "2"]
-```
-
-Example of rounding to the nearest integer:
-
-```json
-["round", "3.4999"]
-```
-
-The return value from this function is a string, allowing it to be used for display purposes (note that the decimal
-separator is always a period). Even though the return value is a string, it can also be used further in expressions that
- expect numeric input.
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-text" header="text" %}}
-The function `text` takes a key as an argument and uses this key to retrieve the corresponding text from a text resource.
-The function returns the value associated with the specified key.
-
-Example:
-
-```json
-["text", "min-nøkkel-id"]
-```
-
-**Note:** Remember to manually test with text keys that contain variables. It's not guaranteed that these will work as
-expected.
-
-**Note:** This function is not yet available in backend code. Therefore, it will generate an error message if used in
-places [where expressions run on the backend](#use-cases), and if the functionality to automatically delete hidden data
-(`RemoveHiddenDataPreview`) has been enabled.
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-displayValue" header="displayValue" %}}
-The function `displayValue` looks up a component and returns a formatted text string representing the value in the data
-model. This differs from the [component](#func-component) function, which returns the raw value in the data model.
-This function is best suited for displaying a component's value to the user and less for further logic based on the
-returned value. This is particularly relevant for Input fields with [number formatting](/app/development/ux/styling/#formatting-numbers),
-date fields, radio buttons (and other components with code lists), etc.
-
-Example:
-
-```json
-["displayValue", "component-id"]
-```
-
-**Note:** This function is not yet available in backend code. Therefore, it will generate an error message if used in
-places [where expressions run on the backend](#use-cases), and if the functionality to automatically delete hidden data
-(`RemoveHiddenDataPreview`) has been enabled.
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-instancecontext" header="instanceContext (lookup)" %}}
-This function allows retrieving information about the current instance. The following keys can be used as the first argument:
-
-| Key | Value | Example Value |
-| ------------------------ | ------------------------------ | --------------------------------------------------- |
-| `instanceId` | Current instance ID | `512345/48c31ffc-dcdd-416d-8bc7-194bec3b7bf0` |
-| `instanceOwnerPartyId` | Current actor ID | `512345` |
-| `instanceOwnerPartyType` | Type of actor owning instance | `"org", "person", "selfIdentified", or "unknown"` |
-| `appId` | ID of the active app | `org/app-name` |
-
-All these lookups will return a value of `null` if working in a [stateless context](../../configuration/stateless).
-Using keys other than those listed above will result in an error message. This behavior is unique among lookup functions
- to ensure that information not (yet) exposed via a key here is not attempted to be retrieved from the instance.
- [Provide feedback](https://github.com/Altinn/app-frontend-react/issues/new?assignees=&labels=kind%2Ffeature-request%2Cstatus%2Ftriage&template=feature_request.yml) if you wish to retrieve instance data not available in this function.
-
-The lookup is performed in the same data source available for [language/texts](../../ux/texts#data-sources).
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-frontendsettings" header="frontendSettings (lookup)" %}}
-This post allows retrieving information from a data source that can be controlled differently for each runtime
-environment.
-
-The lookup is performed within the same data source available for [language/texts, and the setup is detailed there](../../ux/texts#data-sources).
-
-**Note**: The data source is named `applicationSettings` when used in language/texts, but the values must always be
-stored under the key `FrontEndSettings` in `appsettings.{environment}.json`. For this reason, the function has been named
-`frontendSettings` here to indicate that lookups cannot be performed in the rest of `appsettings.{environment}.json`.
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-datamodel" header="dataModel (lookup)" %}}
-This lookup function enables retrieving values directly from the current data model. The first and only argument must
-point to a location in the data model and uses the same dot-separated format as used in `dataModelBindings`. When used
-within [repeating groups](../../ux/fields/grouping/repeating), there's _no_ need to use placeholders for indexes within
-the group - the expression automatically finds the relative position within the context of a repeating group.
-
-Please note that lookups only function against [data types](#data-types) already supported in the expressions. If one looks up
-an object or a list/array in the data model using the `dataModel` function, the result will always be `null`.
-This functionality may change, as there are plans to support objects and lists in the expressions in the future.
-
-Example of lookup within a repeating group:
-
-```json {linenos=false,hl_lines=[11,21,23,24,25,34,36,37,38]}
-[
- {
- "id": "employees",
- "type": "Group",
- "textResourceBindings": {
- "title": "Employees in the company"
- },
- "maxCount": 99999,
- "children": ["employee-name", "employee-age"],
- "dataModelBindings": {
- "group": "Employees"
- }
- },
- {
- "id": "employee-name",
- "type": "Input",
- "textResourceBindings": {
- "title": "Full Name"
- },
- "dataModelBindings": {
- "simpleBinding": "Employees.Name"
- },
- "hidden": ["lessThan",
- ["dataModel", "Employees.Age"],
- 18]
- },
- {
- "id": "employee-age",
- "type": "Input",
- "textResourceBindings": {
- "title": "Age"
- },
- "dataModelBindings": {
- "simpleBinding": "Employees.Age"
- },
- "hidden": ["equals",
- ["dataModel", "Employees[0].Name"],
- "Ola Nordmann"]
- }
-]
-```
-The following observations can be made:
-
-1. The first lookup (to control `hidden` on the component `employee-name`) is governed by the age of each employee. If
-the employee is under 18 years old, `employee-name` is hidden. Note that the same path in the data model is used as
-`simpleBinding` on `employee-age`.
-
-2. The second lookup (to control `hidden` on the component `employee-age`) uses `[0]` in the data model lookup. This
-also works, but the behavior might be unexpected; here, all age components are hidden if the name of the _first_
-employee is _Ola Nordmann_.
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-component" header="component (lookup)" %}}
-Direct lookups on a component are, in many ways, similar to lookups in the data model using [`dataModel`](#func-datamodel).
-An expression that looks up the value of a component will search for the component and return the value stored in its
-`simpleBinding` in the data model. Currently, no other values are supported besides the one stored against
-`simpleBinding` (if other values are desired, one must directly access [`dataModel`](#func-datamodel)).
-
-However, a lookup on a component will return `null` if the component whose value is being looked up is hidden
-(even if the component otherwise has associated data in the data model). This, to some extent, allows controlling the
-display of a component based on whether another component is visible or not. If the component is found on a completely
-different (yet hidden) page, the lookup also yields `null`, even if the data model has a value associated with the component.
-
-Similar to [`dataModel`](#func-datamodel), lookups on a component ID will attempt to find the component in the vicinity
-of the expression within the context of [repeating groups](../../ux/fields/grouping/repeating). It will first search for the
-component in the current row before looking up through the page structure.
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-formatDate" header="formatDate" %}}
-
-The formatDate function takes a date as its first argument, and a format as its second argument. The date argument is a
-string, while the format argument is an optional string that supports some tokens in
-[Unicode Tokens](https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table).
-
-These are the tokens we support:
-
-| Unit | Token | Result |
-| ----------------- | -------- | --------------------------------------- |
-| Era | `G..GGG` | BC, AD |
-| Era | `GGGG` | Before Christ, Anno Domini |
-| Era | `GGGGG` | B, A |
-| Year | `y` | 44, 1, 1900, 2017 |
-| Year | `yy` | 44, 01, 00, 17 |
-| Year | `yyy` | 044, 001, 1900, 2017 |
-| Year | `yyyy` | 0044, 0001, 1900, 2017 |
-| Extended year | `u` | -43, 0, 1, 1900, 2017 |
-| Extended year | `uu` | -43, 01, 1900, 2017 |
-| Extended year | `uuu` | -043, 001, 1900, 2017 |
-| Extended year | `uuuu` | -0043, 0001, 1900, 2017 |
-| Month | `M` | 1, 2,..., 12 |
-| Month | `MM` | 01, 02,..., 12 |
-| Month | `MMM` | Jan, Feb, ..., Dec |
-| Month | `MMMM` | January, February, ..., December |
-| Day of month | `d` | 1, 2, ..., 31 |
-| Day of month | `dd` | 01, 02, ..., 31 |
-| Day of week | `E..EEE` | Mon, Tue, Wed, ..., Sun |
-| Day of week | `EEEE` | Monday, Tuesday, Wednesday, ..., Sunday |
-| Day of week | `EEEEE` | M, T, W, ..., S |
-| AM/PM | `a` | a.m., p.m. |
-| Hour [1-12] | `h` | 1, 2, ..., 11, 12 |
-| Hour [1-12] | `hh` | 01, 02, ..., 11, 12 |
-| Hour [0-23] | `H` | 1, 2, ..., 22, 23 |
-| Hour [0-23] | `HH` | 01, 02, ..., 22, 23 |
-| Minute | `m` | 1, 2, ..., 59 |
-| Minute | `mm` | 01, 02, ..., 59 |
-| Second | `s` | 1, 2, ..., 59 |
-| Second | `ss` | 01, 02, ..., 59 |
-| Fractional second | `S` | 0, 1, ..., 9 |
-| Fractional second | `SS` | 00, 01, ..., 99 |
-| Fractional second | `SSS` | 000, 001, ..., 999 |
-
-If the format argument is not provided, the function will use the format `MM/dd/yy` as default.
-Example:
-
-```json
-["formatDate", "2023-10-30T14:54:00.000Z", "HH:mm"]
-```
-Would result in `14:54`
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-linkToPage" header="linkToPage" %}}
-The `linkToPage` function can be used to create links that can be used inside text in a form. It is meant to create links
-that point to a specific page of the form. Clicking this link will navigate directly to the specified page.
-
-The function takes 2 arguments. The first argument is the link text which will be visible for the user. The second argument
-is the id of the page the link should point to.
-
-
-```json
-["linkToPage", "Specify your name", "page1"]
-```
-Would result in `Specify your name`
-When clicked, this link will take the user to the specified page.
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-linkToComponent" header="linkToComponent" %}}
-The `linkToComponent` function can be used to create links that can be used inside text in a form. It is meant to create links
-that point to a specific component of the form. Clicking this link will navigate directly to the component, giving it focus.
-
-The function takes 2 arguments. The first argument is the link text which will be visible for the user. The second argument
-is the id of the component the link should point to.
-
-
-```json
-["linkToComponent", "Specify your name", "inputMyName"]
-```
-Would result in `Specify your name`
-When clicked, this link will take the user to the page the component is on and focus on the specified component.
-
-{{% /expandlarge %}}
-
-## Data Types
-
-Expressions in the functions expect that the arguments sent in have a specific type. If an argument sent in has a
-different type than expected, the value is attempted to be converted to the correct type. For instance, the function
-`equals` expects two strings, but if you send in the boolean value `true` as either argument, it works fine too because
-the boolean value `true` is converted to the string `"true"`.
-
-
-```json
-["equals", true, "true"]
-```
-
-The expression above works and yields `true` as a result (because `true` and `"true"` are compared as the same value by
-converting `true` to `"true"` before comparison). This also allows calling a function that returns one datatype and,
-for example, comparing it with a completely different datatype. Read more about which datatypes can be converted to what
-below.
-
-All functions expecting a specific datatype as an argument will also function if you send in [`null`](#null).
-However, in some cases, using a `null` value may result in an error message – for instance, attempting to look up in the
-data model with `["dataModel", null]`. In the `concat` function, however, a `null` value is interpreted as an empty string.
-
-### Strings
-
-Strings contain arbitrary text and are a broad datatype that can be converted from numbers and boolean values.
-
-Some strings can also be converted to other datatypes:
-
-| String Value | Can Substitute | Examples |
-| -------------------------------------------------- | -------------------------- | -------------------------- |
-| Integers with or without negative signs | [Number](#numbers) | `3`, `-8`, `71254` |
-| Decimal numbers with or without negative signs | [Number](#numbers) | `3.14`, `-33.0`, `123.123` |
-| `true` or `false` with lowercase or uppercase | [Boolean](#boolean-values) | `true`, `True`, `FALSE` |
-| `null` with lowercase or uppercase | [Null](#null) | `null`, `Null`, `NULL` |
-
-All other strings not listed in the table above will result in an error if attempted to be converted to other types.
-
-### Numbers
-
-Numeric values refer to positive and negative integers and decimal numbers. Some strings are also automatically converted
-to a numeric value, as shown in the table for strings above. For a string to be successfully converted to a number, the
-string must meet the following criteria:
-
-- The string contains only a number, with no other text before or after it.
-- A negative sign (`-`) can be used, but a positive sign (`+`) is not supported.
-- Decimal numbers must be represented with a period, not a comma.
-- Thousands separators or other number formatting are not supported.
-
-All other strings will result in an error if attempted to be converted to a number. Attempting to convert a [boolean value](#boolean-values)
-to a number will also result in an error.
-
-Functions expecting a numeric input can also receive [`null`](#null). See more about its impact in the description of
-each function.
-
-### Boolean Values
-
-Boolean values include `true` (true) and `false` (false). When calling a function expecting a boolean value, certain
-other types can also be passed, which are converted to a boolean value:
-
-- The numbers `1` and `0` function as `true` and `false`, respectively.
-- The strings `"1"` and `"0"` function similarly to the numbers (and become `true` and `false`, respectively).
-- The strings `"true"` and `"false"` are also converted to a boolean value.
-- The value [`null`](#null) functions like `false`.
-
-All other values will result in an error if passed to a function expecting a boolean value. Note that these rules differ
-slightly from the rules for [strings](#strings). Thus, there is a difference between values that can be _interpreted_ as
-a boolean value for a function expecting a boolean argument and values that are _equal_ to a boolean value. The function
-[`equals`](#func-equals) compares values as strings, so the number `1` and the string `"1"` will be considered equal, but
-it will not recognize `1` and `true` as equal values.
-
-It might appear that the following expressions are similar:
-
-1. `"hidden": ["dataModel", "hideName"]`
-2. `"hidden": ["equals", ["dataModel", "hideName"], true]`
-3. `"hidden": ["if", ["dataModel", "hideName"], true, "else", false]`
-
-If the value (here obtained from the lookup `["dataModel", "hideName"]`) is `true` or `"true"`, the component will be hidden.
-However, if the value is `1` or `"1"`, the component will only be hidden with expressions in options 1 and 3. This is because
-the result in the `hidden` expression [is converted to a boolean value](#use-cases), and
-`if` [expects a boolean value as the first argument](#func-if). However, `equals` compares the values as strings, and
-`"1"` is not equal to `"true"`.
-
-Also, see tips and tricks under [_String or not a string comparison?_](#string-or-smaller-string-comparison)
-
-### Null
-
-Most places where a [string](#strings), [number](#numbers), or [boolean value](#boolean-values) is expected should also
-handle a `null` value. Null values indicate that a specific value is missing, and there is a difference between a `null`
-value, an empty [string](#strings), and the [number](#numbers) `0`.
-
-If you perform a lookup in a function like `dataModel`, and the value you are searching for is not found/set, usually
-`null` will be the result.
-
-## Tips and Tricks
-
-### Show/Hide Entire Pages
-
-Expressions can be used to show/hide entire pages. In the example below, the entire page will be hidden if a component
-(on one of the other pages) has the value _no_ or is not set.
-
-```json
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- "data": {
- "hidden": ["or",
- ["equals", ["component", "hasComplaints"], "no"],
- ["equals", ["component", "hasComplaints"], null]
- ],
- "layout": [
- ...
- ]
- }
-}
-```
-
-If the page you are on is hidden, the application will automatically move to the next available page in the [page order](../../ux/pages/navigation#order).
-If all the next pages are hidden, the first possible page in the order will be displayed instead.
-
-### String or smaller String Comparison?
-
-The way expressions are evaluated might seem strict (for example, `0` and `null` are considered different values when
-compared with `equals`). This is a design choice made in Altinn for two reasons:
-
-1. Strict rules are clear rules. The expressions are more likely to provide an error message if something is not as
-expected rather than leaving you wondering why things turned out the way they did.
-2. If the expressions treat many different values as equal, it takes away your ability to differentiate between them
-if you want to.
-
-If a less-strict comparison is desired, one can construct an expression using the [`or`](#func-and) function to recognize
-several different values:
-
-```json
-[
- "or",
- ["equals", ["dataModel", "My.Path"], 0],
- ["equals", ["dataModel", "My.Path"], false],
- ["equals", ["dataModel", "My.Path"], null],
- ["equals", ["dataModel", "My.Path"], ""]
-]
-```
-
-Additionally, note that conversion to [boolean value](#boolean-values) allows for more alternatives than strings
-(as expected by `equals`). Given that the `or` function expects boolean values as arguments, and the values `0`,
-`false`, and `null` are already accepted as boolean values, the following will function similarly to the expression above:
-
-
-```json
-["or", ["dataModel", "My.Path"], ["equals", ["dataModel", "My.Path"], ""]]
-```
diff --git a/content/app/development/logic/expressions/_index.nb.md b/content/app/development/logic/expressions/_index.nb.md
deleted file mode 100644
index f14b10abd10..00000000000
--- a/content/app/development/logic/expressions/_index.nb.md
+++ /dev/null
@@ -1,974 +0,0 @@
----
-title: Dynamiske uttrykk
-linktitle: Uttrykk
-description: Oversikt over dynamiske uttrykk definert i JSON
-tags: [dynamics]
-toc: true
----
-
-{{% panel theme="warning" %}}
-⚠️ Dynamikk er et område under aktiv utvikling. Denne funksjonaliteten er for øyeblikket tilgjengelig som en betaversjon
-i Altinn Studio og tilbyr begrensede konfigurasjonsalternativer. Grensesnittet tillater bare å bygge uttrykk med ett
-nivå av nøsting, noe som betyr at et ubegrenset antall ikke-nøstede uttrykk kan kombineres ved å bruke enten *ELLER*
-eller *OG*-operatoren. Imidlertid tillater verktøyet å redigere mer kompliserte uttrykk ved å skrive fritt. For
-øyeblikket er verktøyet også begrenset til å koble uttrykk til boolske komponentfelt.
-Les [Uttrykk i Altinn Studio](../../../../altinn-studio/designer/build-app/expressions) om hvordan uttrykk lages i
-Altinn Studio.
-{{% /panel %}}
-
-## Introduksjon
-
-Dynamikk via uttrykk gjør det mulig å definere enkel dynamisk oppførsel i en Altinn 3 app, som for eksempel ved å
-definere om et skjemafelt skal vises eller skjules, om feltet skal være påkrevd eller skrivebeskyttet.
-
-Uttrykkene er tilgjengelige i alle Altinn 3-apper som bruker frontend-versjon
-[3.54.0](https://github.com/Altinn/app-frontend-react/releases/tag/v3.54.0) eller nyere. Bruker man denne versjonen
-(eller siste hovedversjon) har man mulighet til å benytte dynamiske uttrykk til [flere bruksområder](#bruksområder).
-
-Fra versjon `7.2.0` av [nuget-pakkene](../../../maintainance/dependencies#nuget) er også uttrykkene støttet i backend.
-Det gjør at serveren vil kunne evaluere uttrykkene og fjerne data ved innsending som potensielt er lagret
-i [datamodellen](../../data/data-model) og er knyttet til felter/komponenter som i ettertid er skjult.
-Merk at dette bare gjelder data i datamodellen som er knyttet til skjulte komponenter - data i datamodellen som ikke
-er knyttet til komponenter (og dermed implisitt skjult for brukeren) vil ikke fjernes automatisk.
-
-Det gjør det også mulig å unnlate å sende inn data som ellers er tilknyttet påkrevde felter - dersom disse påkrevde
-feltene er skjult i skjemaet ved hjelp av dynamiske uttrykk. Dette gjelder også ved innsending direkte fra API.
-
-**NB:** Automatisk fjerning av skjult data må foreløpig aktiveres manuelt (_opt-in_) ved at man legger til følgende
-linje i `App/appsettings.json` etter at man har oppgradert [nuget-pakkene](../../../maintainance/dependencies#nuget)
-til `7.2.0` eller nyere:
-
-{{}}
-
-{{}}
-
-```json {linenos=false,hl_lines=[5]}
- "AppSettings": {
- "OpenIdWellKnownEndpoint": "http://localhost:5101/authentication/api/v1/openid/",
- "RuntimeCookieName": "AltinnStudioRuntime",
- "RegisterEventsWithEventsComponent": false,
- "RemoveHiddenData": true
- },
-```
-
-{{}}
-
-{{}}
-
-```json {linenos=false,hl_lines=[5]}
- "AppSettings": {
- "OpenIdWellKnownEndpoint": "http://localhost:5101/authentication/api/v1/openid/",
- "RuntimeCookieName": "AltinnStudioRuntime",
- "RegisterEventsWithEventsComponent": false,
- "RemoveHiddenDataPreview": true
- },
-```
-
-{{}}
-{{}}
-
-### Oppbygging og syntaks
-
-Uttrykkene er bygget opp som et slags mini-programmeringsspråk, hvor alt er definert i JSON. Selve uttrykkene er alltid
-en liste (array) med verdier, hvor den første verdien i hver liste alltid er et [funksjonsnavn](#funksjoner). Resten
-av verdiene sendes som inndata/argumenter til funksjonen.
-
-```json
-["equals", "foo", "bar"]
-```
-
-I eksempelet over blir strengene "foo" og "bar" sammenlignet. De er ulike, så resultatet av dette uttrykket blir en
-boolsk verdi; false.
-
-Denne funksjonen, [equals](#func-equals), forventer å få inn to [strenger](#strenger) som inndata/argumenter. Det
-er også mulig å gi den andre uttrykk. Gjør man dette vil uttrykket bli tolket slik at de innerste funksjonene blir kjørt
-først, og de ytterste kjørt sist.
-
-```json
-["equals", ["component", "firstName"], "John"]
-```
-
-I dette eksempelet blir det innerste uttrykket/funksjonskallet `["component", "firstName"]` kjørt først. Om verdien til
-komponenten "firstName" er lik strengen "John", gir funksjonen resultatet den boolske verdien "true".
-
-Dersom man da bruker dette uttrykket for `hidden`-egenskapen til en komponent, vil komponenten bli skjult dersom man
-skriver inn "John" i "firstName"-komponenten et annet sted i applikasjonen:
-
-```json
-{
- "id": "lastName",
- "type": "Input",
- ...
- "hidden": ["equals", ["component", "firstName"], "John"]
-}
-```
-
-Det er ingen begrensninger rundt hvor store/dype uttrykkene kan være. Som en øvelse, se om du klarer å lese hva dette
-uttrykket gjør, og hvilke mulige verdier det kan returnere:
-
-```json
-[
- "if",
- ["greaterThanEq", ["component", "age"], 16],
- [
- "if",
- ["lessThan", ["component", "age"], 62],
- "Please consider applying for our open position!",
- "else",
- ["concat", "At ", ["component", "age"], ", you are eligible for retirement"]
- ],
- "else",
- ["concat", "At ", ["component", "age"], ", you should stay in (pre)school"]
-]
-```
-
-{{% expandlarge id="answer-expandable" header="Røpealarm: Klikk her for en tolkning av uttrykket over" %}}
-Uttrykket sjekker verdien til en tenkt komponent med ID "alder". Dersom personen er 16 år eller mer,
-for eksempel 45 år gammel, returneres teksten:
-
-**Please consider applying for our open position!**
-
-For en person som er 62 år returneres teksten:
-
-**At 62, your are eligible for retirement**
-
-Og for en person som er 15 år (eller yngre, som f.eks. en 4-åring), returneres teksten:
-
-**At 4, you should stay in (pre)school**
-{{% /expandlarge %}}
-
-### Bruksområder
-
-Dynamiske uttrykk er foreløpig tilgjengelig for bruk i disse egenskapene, som definert i [layout-filer](../../ux/pages).
-
-| Komponenter | Egenskap | Forventet verdi | Frontend | Backend |
-| --------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | -------------------------- | -------- | ------- |
-| [Sider/layouts](#viseskjule-hele-sider) | `hidden` | [Boolsk](#boolske-verdier) | ✅ | ✅ |
-| Alle | `hidden` | [Boolsk](#boolske-verdier) | ✅ | ✅ |
-| Skjemakomponenter | `required` | [Boolsk](#boolske-verdier) | ✅ | ✅ |
-| Skjemakomponenter | `readOnly` | [Boolsk](#boolske-verdier) | ✅ | ❌ |
-| [Repeterende grupper](../../ux/fields/grouping/repeating) | `hiddenRow` | [Boolsk](#boolske-verdier) | ✅ | ❌ |
-| [Repeterende grupper](../../ux/fields/grouping/repeating) | `edit.addButton` | [Boolsk](#boolske-verdier) | ✅ | ❌ |
-| [Repeterende grupper](../../ux/fields/grouping/repeating) | `edit.saveButton` | [Boolsk](#boolske-verdier) | ✅ | ❌ |
-| [Repeterende grupper](../../ux/fields/grouping/repeating) | `edit.deleteButton` | [Boolsk](#boolske-verdier) | ✅ | ❌ |
-| [Repeterende grupper](../../ux/fields/grouping/repeating) | `edit.alertOnDelete` | [Boolsk](#boolske-verdier) | ✅ | ❌ |
-| [Repeterende grupper](../../ux/fields/grouping/repeating) | `edit.saveAndNextButton` | [Boolsk](#boolske-verdier) | ✅ | ❌ |
-| [Radioknapper](../../ux/components/radiobuttons), [Avkrysningsbokser](../../ux/components/checkbox), [Nedtrekksliste](../../ux/components/dropdown) | `source.label` | [Streng](#strenger) | ✅ | ❌ |
-| [Radioknapper](../../ux/components/radiobuttons), [Avkrysningsbokser](../../ux/components/checkbox), [Nedtrekksliste](../../ux/components/dropdown) | `source.description` | [Streng](#strenger) | ✅ | ❌ |
-| [Radioknapper](../../ux/components/radiobuttons), [Avkrysningsbokser](../../ux/components/checkbox), [Nedtrekksliste](../../ux/components/dropdown) | `source.helpText` | [Streng](#strenger) | ✅ | ❌ |
-| Alle | `textResourceBindings.[*]` \* | [Streng](#strenger) | ✅ | ❌ |
-
-\* = Hvilke verdier man kan overstyre med textResourceBindings varierer fra komponent til komponent, men vil fungere på
-alle steder der det brukes. TextResourceBindings for repeterende grupper finner
-du [mer informasjon om her](../../ux/fields/grouping/repeating#textresourcebindings)
-
-{{% expandlarge id="rep-group-edit-button-text" header="Eksempel: Styre redigeringsknapp-tekst i repeterende gruppe" %}}
-
-Her endrer vi teksten til redigeringsknappen i en repeterende gruppe basert på om `IsPrefill` er satt til `true` i
-en gitt adresse i datamodellen. Dersom `IsPrefill` er `true` for en adresse, vil raden som viser frem den adressen ha en
-redigerings-knapp med teksten `"View"`. Hvis `IsPrefill` er `false` blir teksten på knappen til den spesifikke raden
-`"Edit"`.
-
-Det er verdt å merke seg at dersom et oppslag på `IsPrefill` gir resultatet `null`(ikke funnet) så konverteres
-resultatet til `false` når det blir brukt i en `if`. Les mer detaljert om dette i seksjonene [if](#func-if) og [datatyper](#datatyper)
-
-```json
-{
- "id": "repeatingAddressGroup",
- "type": "Group",
- "children": ["field-id-one", "field-id-two"],
- "dataModelBindings": {
- "group": "Citizen.FormerAdresses"
- },
- "maxCount": 10,
- "textResourceBindings": {
- "edit_button_open": [
- "if",
- ["dataModel", "Citizen.FormerAdresses.IsPrefill"],
- "View",
- "else",
- "Edit"
- ]
- }
-}
-```
-
-{{% /expandlarge %}}
-
-### Testing, feilsøking og utvikling av uttrykk
-
-Når man skal skrive et uttrykk er det greit å vite noenlunde hva resultatet kommer til å bli, og om uttrykket er gyldig.
-Ugyldige uttrykk gir en advarsel i JavaScript-konsollet i nettleseren når siden lastes, så det kan være lurt å ha
-dette konsollet åpent når man utvikler en applikasjon og tester uttrykkene lokalt.
-
-Det er også mulig å teste ut kjøring av et uttrykk rett i utviklerverktøyene. Det gjøres ved å trykke `Ctrl + Shift + K`
-(eller `Cmd + Shift + K` på Mac) og navigere til fanen for uttrykk. Uttrykk vil kunne oppføre seg annerledes alt etter
-hvilken komponent de evalueres i nærheten av. Derfor kan man også velge en komponent som skal brukes som kontekst når
-uttrykket evalueres i utviklerverktøyene.
-
-{{% expandlarge id="rep-group-expandable" header="Eksempel på ID-er og evaluering i repterende grupper" %}}
-
-**NB:** Her beskrives noen implementasjonsdetaljer i [app-frontend-react](https://github.com/Altinn/app-frontend-react/),
-og er kun relevant når du skal prøve et uttrykk i utviklerverktøyene som er avhengig av en kjent posisjon i en
-repeterende gruppe. Dette kan endres i fremtiden, og slike endringer vil ikke påvirke uttrykk som man har definert i en
-applikasjon. Der hentes konteksten ut fra hvor uttrykket er definert i layout-filen.
-
-Se for deg en [repeterende gruppe](../../ux/fields/grouping/repeating) for personer med to felt; `navn` og `alder`.
-Gitt dette uttrykket:
-
-`["component", "alder"]`
-
-Hva vil alderen være? Det vil kunne variere etter hvilken gruppe som evaluerer
-uttrykket. Har man har to grupper/rader vil både `navn`- og `alder`-komponentene finnes to ganger hver. Disse vil få
-ID-ene `navn-0` og `alder-0` (for den første raden) og `navn-1` og `alder-1` (for den andre raden).
-
-Tenk deg at følgende data er fyllt inn i en repeterende gruppe:
-
-| Navn | Komponent-ID | Alder | Komponent-ID |
-| ---- | ------------ | ----- | ------------ |
-| Per | `navn-0` | 24 | `alder-0` |
-| Kari | `navn-1` | 36 | `alder-1` |
-| Ola | `navn-2` | 18 | `alder-2` |
-
-Gitt følgende uttrykk:
-
-```json
-["component", "alder"]
-```
-
-Og med disse forutsetningene:
-
-1. Man har ikke gitt noen kontekst (eventuelt, uttrykket plasseres på en komponent som ikke er i nærheten av
- en `alder`-komponent)
-2. Man evaluerer uttrykket i kontekst av `navn-0`
-3. Man evaluerer uttrykket i kontekst av `navn-1`
-
-Hva vil resultatet bli i de forskjellige eksemplene? Her er svarene:
-
-1. Denne vil finne "første og beste" `alder`-komponent, og finner dermed `alder-0`. Den returnerer
- derfor _24_, Per sin alder.
-2. Her prøver vi å lete i kontekst av `navn`-komponenten på første rad, og igjen finner vi _24_, Per sin alder.
-3. siste eksempel har vi spesifisert andre rad i den repeterende gruppen ved å evaluere i kontekst av `navn-1`.
- Her finner vi den nærmeste `alder`-komponenten `alder-1`, som er _36_, Kari sin alder.
-
-{{% /expandlarge %}}
-
-## Funksjoner
-
-Disse funksjonene er tilgjengelige for bruk i uttrykk:
-
-| Funksjonsnavn | Parametre | Returverdi | Frontend | Backend |
-| -------------------------------------------- | -------------------------------------------------- | ------------------------------------ | -------- | ------- |
-| [`equals`](#func-equals) | [Streng](#strenger), [Streng](#strenger) | [Boolsk](#boolske-verdier) | ✅ | ✅ |
-| [`notEquals`](#func-equals) | [Streng](#strenger), [Streng](#strenger) | [Boolsk](#boolske-verdier) | ✅ | ✅ |
-| [`not`](#func-not) | [Boolsk](#boolske-verdier) | [Boolsk](#boolske-verdier) | ✅ | ✅ |
-| [`greaterThan`](#func-gt) | [Tall](#tall), [Tall](#tall) | [Boolsk](#boolske-verdier) | ✅ | ✅ |
-| [`greaterThanEq`](#func-gt) | [Tall](#tall), [Tall](#tall) | [Boolsk](#boolske-verdier) | ✅ | ✅ |
-| [`lessThan`](#func-gt) | [Tall](#tall), [Tall](#tall) | [Boolsk](#boolske-verdier) | ✅ | ✅ |
-| [`lessThanEq`](#func-gt) | [Tall](#tall), [Tall](#tall) | [Boolsk](#boolske-verdier) | ✅ | ✅ |
-| [`concat`](#func-concat) | Ingen eller flere [strenger](#strenger) | [Streng](#strenger) | ✅ | ✅ |
-| [`and`](#func-and) | En eller flere [boolske verdier](#boolske-verdier) | [Boolsk](#boolske-verdier) | ✅ | ✅ |
-| [`or`](#func-and) | En eller flere [boolske verdier](#boolske-verdier) | [Boolsk](#boolske-verdier) | ✅ | ✅ |
-| [`if`](#func-if) | [Se detaljert beskrivelse](#func-if) | [Se detaljert beskrivelse](#func-if) | ✅ | ✅ |
-| [`contains`](#func-contains-not-contains) | [Streng](#strenger), [Streng](#strenger) | [Boolsk](#boolske-verdier) | ✅ | ✅ |
-| [`notContains`](#func-contains-not-contains) | [Streng](#strenger), [Streng](#strenger) | [Boolsk](#boolske-verdier) | ✅ | ✅ |
-| [`commaContains`](#func-commaContains) | [Streng](#strenger), [Streng](#strenger) | [Boolsk](#boolske-verdier) | ✅ | ✅ |
-| [`startsWith`](#func-starts-ends-with) | [Streng](#strenger), [Streng](#strenger) | [Boolsk](#boolske-verdier) | ✅ | ✅ |
-| [`endsWith`](#func-starts-ends-with) | [Streng](#strenger), [Streng](#strenger) | [Boolsk](#boolske-verdier) | ✅ | ✅ |
-| [`lowerCase`](#func-lowerCase-upperCase) | [Streng](#strenger) | [Streng](#strenger) | ✅ | ✅ |
-| [`upperCase`](#func-lowerCase-upperCase) | [Streng](#strenger) | [Streng](#strenger) | ✅ | ✅ |
-| [`stringLength`](#func-stringLength) | [Streng](#strenger) | [Tall](#tall) | ✅ | ✅ |
-| [`text`](#func-text) | [Streng](#strenger) | [Streng](#strenger) | ✅ | ❌ |
-| [`language`](#func-language) | Ingenting | [Streng](#strenger) | ✅ | ❌ |
-| [`displayValue`](#func-displayValue) | [Streng](#strenger) | [Streng](#strenger) | ✅ | ❌ |
-| [`round`](#func-round) | [Tall](#tall), valgfritt [Tall](#tall) | [Streng](#strenger) | ✅ | ✅ |
-| [`instanceContext`](#func-instancecontext) | [Streng](#strenger) | [Streng](#strenger) | ✅ | ✅ |
-| [`frontendSettings`](#func-frontendsettings) | [Streng](#strenger) | [Streng](#strenger) | ✅ | ✅ |
-| [`dataModel`](#func-datamodel) | [Streng](#strenger) | [Streng](#strenger) | ✅ | ✅ |
-| [`component`](#func-component) | [Streng](#strenger) | [Streng](#strenger) | ✅ | ✅ |
-| [`formatDate`](#func-formatDate) | [Streng](#strenger), valgfri [Streng](#strenger) | [Streng](#strenger) | ✅ | ❌ |
-| [`linkToPage`](#func-linkToPage) | [Streng](#strenger), [Streng](#strenger) | [Streng](#strenger) | ✅ | ❌ |
-| [`linkToComponent`](#func-linkToComponent) | [Streng](#strenger), [Streng](#strenger) | [Streng](#strenger) | ✅ | ❌ |
-
-Detaljerte beskrivelser og eksempler
-
-{{% expandlarge id="func-equals" header="equals / notEquals" %}}
-Disse to funksjonene sammenligner to strenger for å sjekke om de er like (`equals`) eller ulike (`notEquals`). Om
-du sender inn andre verdier enn strenger, blir verdiene konvertert og sammenlignet som strenger
-([les mer om konvertering her](#strenger)).
-
-Eksempler:
-
-```json
-{
- "id": "lastName",
- "type": "Input",
- ...
- "hidden": ["equals",
- ["dataModel", "My.Model.FirstName"],
- "John"
- ],
- "readOnly": ["notEquals",
- ["frontendSettings", "FormIsEditable"],
- true
- ]
-}
-```
-
-`notEquals` er i prinsippet det samme som, og en snarvei til, `["not", ["equals", ...]]`.
-
-Se også tips og triks under [_Streng eller mindre streng sammenligning?_](#streng-eller-mindre-streng-sammenligning)
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-not" header="not" %}}
-Denne funksjonen tar inn en [boolsk verdi](#boolske-verdier) eller noe som kan konverteres til en boolsk verdi, og
-returnerer den motsatte boolske verdien. Sann blir til usann, usann blir til sann.
-
-Funksjonen kan være nyttig om du ønsker å _snu_ et uttrykk. Istedenfor å tenke at du skal skrive et uttrykk som
-_skjuler_ en komponent gitt noen forutsetninger, kan du pakke uttrykket inn i `not` og skrive uttrykket ut fra
-hva som skal til for å _vise_ komponenten:
-
-```json
-{
- "id": "lastName",
- "type": "Input",
- "hidden": [
- "not",
- ["or", ["dataModel", "ShowLastName"], ["frontendSettings", "ShowAllFields"]]
- ]
-}
-```
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-gt" header="greaterThan / greaterThanEq / lessThan / lessThanEq" %}}
-Disse 4 funksjonene forventer to tall inn, og sammenligner om _det første_ med _det andre_. Det vil si, for funksjonen
-`greaterThan` er uttrykket sant dersom det første tallet er _større enn_ det andre.
-
-| Funksjon | Beskrivelse | Symbol |
-| --------------- | ------------------------------------------------------------- | ------ |
-| `greaterThan` | Er det første tallet _større enn_ det andre tallet? | \> |
-| `greaterThanEq` | Er det første tallet _større enn eller lik_ det andre tallet? | ≥ |
-| `lessThan` | Er det første tallet _mindre enn_ det andre tallet? | \< |
-| `lessThanEq` | Er det første tallet _mindre enn eller lik_ det andre tallet? | ≤ |
-
-Dersom noen av argumentene til disse funksjonene er [`null`](#null) blir resultatet `false` (uavhengig av om det er det
-første eller andre argumentet).
-
-Eksempel som sjekker om alder er over (eller lik) 18:
-
-```json
-["greaterThanEq", ["component", "alder"], 18]
-```
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-concat" header="concat" %}}
-Denne funksjonen tar inn 0 eller flere strenger som argumenter, og returnerer en streng hvor alle strengene i
-argumentene er slått sammen. Kalles funksjonen uten noen argumenter gis det en tom streng.
-
-Legg merke til at funksjonen ikke automatisk legger til mellomrom eller komma når den slår sammen strenger. For å gi
-et mer lesbart resultat anbefales det å legge inn bindetegn hvor nødvendig:
-
-```json
-["concat", "Gratulerer med ", ["component", "alder"], "-årsdagen!"]
-```
-
-Uttrykket over gir teksten `Gratulerer med 18-årsdagen!` dersom verdien i alder-komponenten var `18`.
-
-I `concat`-funksjonen tolkes [`null`](#null)-verdier som tomme strenger. [Boolske verdier](#boolske-verdier) skrives
-ut som strengene `"true"` og `"false"`.
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-and" header="and / or" %}}
-Funksjonene `and` og `or` forventer 1 eller flere boolske verdier, og gir et resultat ut fra om henholdsvis _alle_ eller
-_minst en_ av verdiene var sanne (`true`).
-
-| Funksjon | Beskrivelse |
-| -------- | ----------------------------------------------- |
-| `and` | Er **alle** argumentene sanne? (`true`) |
-| `or` | Er **minst ett** av argumentene sanne? (`true`) |
-
-Gir man [`null`](#null)-verdier tolkes disse som usann (`false`). Eksempler på bruk finnes
-under [_Streng eller mindre streng sammenligning?_](#streng-eller-mindre-streng-sammenligning)
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-if" header="if" %}}
-`if`-funksjonen kan brukes for å forgrene et uttrykk slik at returverdien styres av resultatet av et annet
-boolsk uttrykk. Funksjonen kan kalles på to forskjellige måter; med 2 eller 4 argumenter:
-
-| Argument | Alternativ 1 | Alternativ 2 |
-| --------------- | ---------------------------- | ---------------------------- |
-| Første argument | [Boolsk](#boolske-verdier) | [Boolsk](#boolske-verdier) |
-| Andre argument | [Vilkårlig type](#datatyper) | [Vilkårlig type](#datatyper) |
-| Tredje argument | | Strengen `"else"` |
-| Fjerde argument | | [Vilkårlig type](#datatyper) |
-
-I **alternativ 1** vil returverdien til funksjonen bli verdien gitt som andre argument _dersom første argument er sant
-(`true`)_. Om ikke returneres verdien `null`.
-
-I **alternativ 2** vil returverdien til funksjonen bli verdien gitt som andre argument _dersom første argument er sant
-(`true`)_. Om ikke returneres verdien gitt i fjerde argument. Man må _alltid_ gi strengen `"else"` som tredje argument
-om man vil kalle funksjonen med 4 argumenter. Det tredje argumentet er bare til for å gjøre uttrykket mer lesbart, og
-har ingen funksjon ellers.
-
-Om man ønsker flere betingelser og mulige returverdier kan man nøste flere kall til `if` inne i andre eller fjerde
-argument:
-
-```json
-[
- "if",
- ["greaterThan", ["component", "birthYear"], 1945],
- "Du ble født etter verdenskrigene",
- "else",
- [
- "if",
- ["greaterThanEq", ["component", "birthYear"], 1939],
- "Du ble født under andre verdenskrig",
- "else",
- "Du ble født før andre verdenskrig"
- ]
-]
-```
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-language" header="language" %}}
-Funksjonen `language` returnerer brukerens valgte språkkode.
-
-Eksempel:
-
-```json
-{
- "id": "lastName",
- "type": "Input",
- ...
- "readOnly": ["equal", ["language"], "en"],
-}
-```
-
-Om gjeldende språk er ukjent, vil `nb` returneres, som er standardspråket for Altinn 3-apper. Dermed kan man være trygg
-på at denne funksjonen alltid returnerer et gyldig språk.
-
-**Bemerk:** Denne funksjonen er ikke tigjengelig i backend-kode enda, og vil derfor gi en feilmelding dersom den blir
-brukt noen steder [hvor uttrykk kjøres på backend](#bruksområder), og om man har slått på funksjonaliteten for å
-automatisk slette skjulte data (`RemoveHiddenDataPreview`).
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-starts-ends-with" header="startsWith/endsWith" %}}
-Funksjonen `startsWith` sjekker om strengen gitt som første argument starter med strengen gitt i andre argument, og
-på samme vis vil funksjonen `endsWith` sjekke om første streng slutter med den andre strengen.
-
-```json
-["startsWith", ["dataModel", "My.Model.FirstName"], "Jo"]
-```
-
-```json
-["endsWith", ["dataModel", "My.Model.FirstName"], "hn"]
-```
-
-Noen detaljer som er verdt å nevne om disse funksjonene:
-
-- Alle funksjoner starter og slutter med en tom streng, så `startsWith` og `endsWith` vil alltid returnere `true`
- dersom man bruker et uttrykk `["startsWith", "...", ""]`. Dette er viktig å passe på om man bruker verdien til
- en komponent eller et oppslag i datamodellen som andre argument.
-- Ingen strenger starter eller slutter med en `null`-verdi. Bruker man et uttrykk som dette:
- ```json
- [
- "startsWith",
- ["dataModel", "My.Model.FullName"],
- ["dataModel", "My.Model.FirstName"]
- ]
- ```
- vil alltid resultatet bli
- `false` så lenge fornavnet ikke er gitt. Men som nevnt over, dersom fornavnet er satt til en tom streng (for eksempel
- dersom brukeren har visket ut fornavnet sitt), vil uttrykket gi `true` dersom et fullt navn er satt. Dersom man vil
- unngå noe av denne oppførselen kan man bruke `if`-funksjonen sammen med `equals` til å sjekke om noe er satt til
- en tom streng.
-- `["startsWith", null, null]` gir alltid `false`.
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-stringLength" header="stringLength" %}}
-Funksjonen `stringLength` returnerer lengden på en streng (gitt i antall bokstaver/tegn), inkludert mellomrom.
-
-Eksempel:
-
-```json
-["stringLength", ["dataModel", "My.Model.FirstName"]]
-```
-
-Dersom strengen er `null` vil `stringLength` returnere `0`.
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-contains-not-contains" header="contains / notContains" %}}
-Disse to funksjonene sjekker om streng A inkluderer eller ikke inkluderer streng B.
-Både `contains` og `notContains` skiller mellom store og små bokstaver.
-Det betyr at strengen "Hei" ikke inkluderer "hei". Ønsker du å sammenligne uavhengig av store og små bokstaver kan du
-bruke funksjonene [`lowerCase` eller `upperCase`](#func-lowerCase-upperCase) sammen med `contains` eller `notContains`.
-
-Eksempel:
-
-```json
-{
- "id": "lastName",
- "type": "Input",
- ...
- "hidden": [
- "contains",
- ["dataModel", "My.Model.FirstName"],
- "J"
- ],
- "readOnly": [
- "notContains",
- ["dataModel", "My.Model.FirstName"],
- "D"
- ]
-}
-```
-
-Ønsker du å sjekke om verdier finnes i en kommaseparert liste kan du bruke funksjonen [`commaContains`](#func-commaContains).
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-commaContains" header="commaContains" %}}
-Funksjonen commaContains tar imot to argumenter. Det første argumentet er en kommaseparert streng, og det andre
-argumentet er strengen du ønsker å sjekke om er blant de kommaseparerte verdiene i første argument.
-
-Eksempel:
-
-```json
-{
- "id": "addName",
- "type": "Input",
- ...
- "readOnly": ["commaContains", ["dataModel", "My.Model.Names"], "John"]
-}
-```
-
-Legg merke til at eventuelle mellomrom før/etter komma, eller før/etter første verdi blir ignorert. Denne funksjonen
-er spesielt nyttig i tilfeller hvor man bruker en komponent som lagrer flere verdier i en kommaseparert streng, som
-`Checkboxes` og `MultipleSelect`.
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-lowerCase-upperCase" header="lowerCase/upperCase" %}}
-Funksjonene `lowerCase` og `upperCase` tar imot en streng som input og returnerer en ny streng der alle tegnene er
-konvertert til henholdsvis små eller store bokstaver.
-
-```json
-["lowerCase", ["dataModel", "My.Model.LastName"]]
-```
-
-Disse funksjonene gir deg en enkel måte å konvertere mellom små og store bokstaver i en streng.
-Et bruksområde kan være å kombinere en av disse funksjonene med andre sammenligningsfunksjoner slik at sammenligningene
-gjøres uavhengig av om det ble brukt store eller små bokstaver i input-verdien.
-
-```json
-["equals", ["upperCase", ["dataModel", "My.Model.LastName"]], "SMITH"]
-```
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-round" header="round" %}}
-Funksjonen `round` avrunder et tall til et heltall, eller valgfritt til et desimaltall med et konfigurerbart antall desimalpunkter.
-
-Eksempel med avrunding med 2 desimalpunkter:
-
-```json
-["round", "122.99843", "2"]
-```
-
-Eksempel med avrunding til nærmeste heltall:
-
-```json
-["round", "3.4999"]
-```
-
-Returverdien fra denne funksjonen er en streng, slik at returverdien kan brukes for
-fremvisning (merk at desimalskilletegnet alltid er punktum). Selv om returverdien er en streng kan denne også brukes
-videre i uttrykk som forventer tall som inn-verdi.
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-text" header="text" %}}
-Funksjonen `text` tar imot en nøkkel som argument og bruker denne nøkkelen til å hente ut den tilsvarende teksten fra en tekst-ressurs. Funksjonen returnerer verdien som er knyttet til den angitte nøkkelen.
-Eksempel:
-
-```json
-["text", "min-nøkkel-id"]
-```
-
-**Bemerk:** Husk å teste manuelt med tekstnøkler som inneholder variabler. Det er ikke sikkert disse vil fungere som
-forventet.
-
-**Bemerk:** Denne funksjonen er ikke tilgjengelig i backend-kode enda, og vil derfor gi en feilmelding dersom den blir
-brukt noen steder [hvor uttrykk kjøres på backend](#bruksområder), og om man har slått på funksjonaliteten for å
-automatisk slette skjulte data (`RemoveHiddenDataPreview`).
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-displayValue" header="displayValue" %}}
-Funksjonen `displayValue` gjør et oppslag på en komponent og returnerer en formattert tekststreng som representerer verdien i datamodellen.
-Dette er til forskjell fra [component](#func-component)-funksjonen som returnerer rå-verdien som ligger i datamodellen.
-Denne funksjonen egner seg best til visning av en komponent sin verdi for brukeren, og mindre til videre logikk basert på verdien som returneres.
-Dette er spesielt relevant for Input-felter med [tallformattering](/nb/app/development/ux/styling/#formatering-av-tall), datofelter, radioknapper (og andre komponenter med kodelister), osv.
-
-Eksempel:
-
-```json
-["displayValue", "component-id"]
-```
-
-**Bemerk:** Denne funksjonen er ikke tilgjengelig i backend-kode enda, og vil derfor gi en feilmelding dersom den blir
-brukt noen steder [hvor uttrykk kjøres på backend](#bruksområder), og om man har slått på funksjonaliteten for å
-automatisk slette skjulte data (`RemoveHiddenDataPreview`).
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-instancecontext" header="instanceContext (oppslag)" %}}
-Denne funksjonen gjør det mulig å hente ut informasjon om gjeldende instans. Følgende nøkler kan brukes fom første
-argument:
-
-| Nøkkel | Verdi | Eksempelverdi |
-| ------------------------ | ------------------------------ | --------------------------------------------------- |
-| `instanceId` | Gjeldende instans-ID | `512345/48c31ffc-dcdd-416d-8bc7-194bec3b7bf0` |
-| `instanceOwnerPartyId` | Gjeldende aktør-ID | `512345` |
-| `instanceOwnerPartyType` | Hva slags aktør eier instansen | `"org", "person", "selfIdentified" eller "unknown"` |
-| `appId` | Den aktive appen sin ID | `org/app-name` |
-
-Alle disse oppslagene vil gi verdien `null` om man jobber i en [tiltandsløs kontekst](../../configuration/stateless).
-Om man gir andre nøkler enn de over, vil oppslaget resultere i en feilmelding. Denne oppførselen er unik blant
-oppslagsfunksjonene, og gjøres for å sikre at man ikke prøver å hente informasjon som finnes i instansen men som ikke
-(enda) er eksponert via en nøkkel her. [Gi oss en tilbakemelding](https://github.com/Altinn/app-frontend-react/issues/new?assignees=&labels=kind%2Ffeature-request%2Cstatus%2Ftriage&template=feature_request.yml) om du har ønsker om å hente ut
-instansdata som ikke er tilgjengelig i denne funksjonen.
-
-Oppslaget gjøres i samme datakilde som er tilgjengelig for [språk/tekster](../../ux/texts#datakilder).
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-frontendsettings" header="frontendSettings (oppslag)" %}}
-Dette oppslaget gjør det mulig å hente informasjon fra en datakilde som kan styres ulikt for hvert kjøretidsmiljø.
-
-Oppslaget gjøres i samme datakilde som er tilgjengelig for [språk/tekster, og oppsettet er beskrevet
-i detalj der](../../ux/texts#datakilder).
-
-**Merk**: Datakilden heter `applicationSettings` når brukt i språk/tekster, men verdiene må alltid lagres under
-nøkkelen `FrontEndSettings` i `appsettings.{miljø}.json`). Av den grunn har funksjonen fått navnet `frontendSettings`
-her, for å indikere at oppslag ikke kan gjøres i resten av `appsettings.{miljø}.json`.
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-datamodel" header="dataModel (oppslag)" %}}
-Denne oppslagsfunksjonen gjør det mulig å hente verdier direkte fra gjeldende datamodell. Første og eneste argument
-må peke et sted i datamodellen, og bruker det samme punktum-separerte formatet som brukt i `dataModelBindings`. Ved
-bruk inne i [repeterende grupper](../../ux/fields/grouping/repeating) trenger man _ikke_ bruke plassholdere for
-indekser til gruppen - uttrykket finner selv den relative plasseringen i kontekst av en repeterende gruppe.
-
-Legg merke til at oppslag bare fungerer mot [datatyper](#datatyper) som allerede er støttet i uttrykkene. Dersom man
-slår opp et objekt eller en liste/array i datamodellen med `dataModel`-funksjonen får man alltid resultatet `null`.
-Denne funksjonaliteten kan endres, da det er planlagt støtte for objekter og lister i uttrykkene i fremtiden.
-
-Eksempel på oppslag i repeterende gruppe:
-
-```json {linenos=false,hl_lines=[11,21,23,24,25,34,36,37,38]}
-[
- {
- "id": "ansatte",
- "type": "Group",
- "textResourceBindings": {
- "title": "Ansatte i selskapet"
- },
- "maxCount": 99999,
- "children": ["ansatt-navn", "ansatt-alder"],
- "dataModelBindings": {
- "group": "Ansatte"
- }
- },
- {
- "id": "ansatt-navn",
- "type": "Input",
- "textResourceBindings": {
- "title": "Fullt navn"
- },
- "dataModelBindings": {
- "simpleBinding": "Ansatte.Navn"
- },
- "hidden": ["lessThan",
- ["dataModel", "Ansatte.Alder"],
- 18]
- },
- {
- "id": "ansatt-alder",
- "type": "Input",
- "textResourceBindings": {
- "title": "Alder"
- },
- "dataModelBindings": {
- "simpleBinding": "Ansatte.Alder"
- }
- "hidden": ["equals",
- ["dataModel", "Ansatte[0].Navn"],
- "Ola Nordmann"]
- }
-]
-```
-
-Følgende kan observeres:
-
-1. Det første oppslaget (for å styre `hidden` på komponenten `ansatt-navn`) styres ut fra alderen til hver ansatt. Om
- den ansatte er under 18 år skjules `ansatt-navn`. Legg merke til at samme sti i datamodellen blir brukt som
- `simpleBinding` på `ansatt-alder`.
-2. Det andre oppslaget (for å styre `hidden` på komponenten `ansatt-alder`) bruker `[0]` på oppslaget i datamodellen.
- Dette fungerer også, men oppførselen er kanskje uventet; her skjules alle alder-komponenter dersom navnet på den _første_
- ansatte har navnet _Ola Nordmann_.
- {{% /expandlarge %}}
-
-{{% expandlarge id="func-component" header="component (oppslag)" %}}
-Oppslag direkte på komponent tilsvarer på mange måter et oppslag mot datamodell med [`dataModel`](#func-datamodel).
-Et uttrykk som slår opp verdien til en komponent kommer til å lete etter komponenten og returnere verdien lagret på
-komponenten sin `simpleBinding` i datamodellen. For øyeblikket støttes ingen andre verdier enn den lagret mot
-`simpleBinding` (om andre verdier ønskes må man gå direkte mot [`dataModel`](#func-datamodel)).
-
-Oppslag mot en komponent vil derimot returnere `null` dersom komponenten man slår opp verdien til er skjult (selv om
-komponenten ellers har tilknyttet data i datamodellen). Dette gjør det til en viss grad mulig å styre visning av en
-komponent basert på om en annen komponent er vist eller ikke. Dersom komponenten ble funnet på en helt annen (men skjult)
-side gir også oppslaget verdien `null` selv om datamodellen har en verdi tilknyttet komponenten.
-
-I likhet med [`dataModel`](#func-datamodel) vil oppslag mot en komponent-id forsøke å finne komponenten i nærheten av
-uttrykket i kontekst av [repeterende grupper](../../ux/fields/grouping/repeating). Det vil først søkes etter komponenten
-i gjeldende rad, før det letes oppover i sidestrukturen.
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-formatDate" header="formatDate" %}}
-Funksjonen `formatDate` tar imot en dato som første argument, og et format som andre argument. Datoargumentet er en streng,
-mens formatargumentet er en valgfri streng som støtter _noen_ tokens i
-[Unicode Tokens](https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table).
-
-Dette er de tokenene vi støtter:
-
-| Enhet | Token | Resultat |
-| --------------- | -------- | ------------------------------------ |
-| Era | `G..GGG` | f.Kr., e.Kr. |
-| Era | `GGGG` | før Kristus, etter Kristus |
-| Era | `GGGGG` | f.Kr., e.Kr. |
-| År | `y` | 44, 1, 1900, 2017 |
-| År | `yy` | 44, 01, 00, 17 |
-| År | `yyy` | 044, 001, 1900, 2017 |
-| År | `yyyy` | 0044, 0001, 1900, 2017 |
-| Forlenget år | `u` | -43, 0, 1, 1900, 2017 |
-| Forlenget år | `uu` | -43, 01, 1900, 2017 |
-| Forlenget år | `uuu` | -043, 001, 1900, 2017 |
-| Forlenget år | `uuuu` | -0043, 0001, 1900, 2017 |
-| Måned | `M` | 1, 2,..., 12 |
-| Måned | `MM` | 01, 02,..., 12 |
-| Måned | `MMM` | jan, feb, ..., des |
-| Måned | `MMMM` | januar, februar, ..., desember |
-| Dag i måned | `d` | 1, 2, ..., 31 |
-| Dag i måned | `dd` | 01, 02, ..., 31 |
-| Ukedag | `E..EEE` | man, tir, ons, ..., søn |
-| Ukedag | `EEEE` | mandag, tirsdag, onsdag, ..., søndag |
-| Ukedag | `EEEEE` | M, T, O, ..., S |
-| AM/PM | `a` | a.m., p.m. |
-| Time [1-12] | `h` | 1, 2, ..., 11, 12 |
-| Time [1-12] | `hh` | 01, 02, ..., 11, 12 |
-| Time [0-23] | `H` | 1, 2, ..., 22, 23 |
-| Time [0-23] | `HH` | 01, 02, ..., 22, 23 |
-| Minutt | `m` | 1, 2, ..., 59 |
-| Minutt | `mm` | 01, 02, ..., 59 |
-| Sekund | `s` | 1, 2, ..., 59 |
-| Sekund | `ss` | 01, 02, ..., 59 |
-| Brøkdels sekund | `S` | 0, 1, ..., 9 |
-| Brøkdels sekund | `SS` | 00, 01, ..., 99 |
-| Brøkdels sekund | `SSS` | 000, 001, ..., 999 |
-
-Dersom man ikke gir et format som andre argument, vil funksjonen bruke formatet `dd.MM.yyyy` som standard.
-
-Eksempel:
-
-```json
-["formatDate", "2023-10-30T14:54:00.000Z", "HH:mm"]
-```
-Vil resultere i `14:54`
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-linkToPage" header="linkToPage" %}}
-`linkToPage`-funksjonen kan brukes for å lage lenker som kan brukes inne i tekst i et skjema.
-Den er ment for å lage lenker som peker til en spesifikk side av skjemaet. Å klikke på denne linken vil navigere
-direkte til den spesifiserte siden.
-
-Funksjonen tar 2 argumenter. Det første argumentet er lenketeksten som vil være synlig for
-brukeren. Det andre argumentet er id-en til siden linken skal peke til.
-
-
-```json
-["linkToPage", "Specify your name", "page1"]
-```
-Resultatet vil bli `Oppgi navnet ditt`
-Denne lenken vil ta brukeren til den spesifiserte siden når den blir klikket på.
-
-{{% /expandlarge %}}
-
-{{% expandlarge id="func-linkToComponent" header="linkToComponent" %}}
-`linkToComponent`-funksjonen kan brukes for å lage lenker som kan brukes inne i tekst i et skjema. Den er ment for å lage lenker
-som peker til en spesifikk komponent i skjemaet. Å klikke på denne lenken vil navigere direkte til komponenten og gi den fokus.
-
-Funksjonen tar 2 argumenter. Det første argumentet er lenketeksten som vil være synlig for brukeren.
-Det andre argumentet er id-en til komponenten lenken skal peke til.
-
-
-```json
-["linkToComponent", "Specify your name", "inputMyName"]
-```
-Resultatet vil bli `Oppgi navnet ditt`
-Denne lenken vil ta brukeren til siden komponenten er på og fokusere på den spesifiserte komponenten, når brukeren klikker på lenken.
-{{% /expandlarge %}}
-
-## Datatyper
-
-Funksjoner i uttrykkene har en forventning om at argumentene som blir sendt inn har en spefikk type. Dersom et argument
-blir sendt inn har en annen type enn forventet, blir verdien forsøkt konvertert til riktig type. Som et eksempel
-forventer funksjonen `equals` to strenger, men om du sender inn den boolske verdien `true` som det ene eller andre
-argumentet fungerer det også fint, siden den boolske verdien `true` blir konvertert til strengen `"true"`.
-
-```json
-["equals", true, "true"]
-```
-
-Uttrykket over fungerer, og gir `true` som resultat (fordi `true` og `"true"` sammenlignes som samme verdi ved at
-`true` konverteres til `"true"` før sammenligningen). Dette gjør også at du kan kalle en funksjon som returnerer en
-datatype og f.eks. sammenligne med en helt annen datatype. Les mer om hvilke datatyper som kan konverteres til hva
-under.
-
-Alle funksjoner som forventer en spesifikk datatype som argument vil også kunne fungere om man sender
-inn [`null`](#null), men noen steder vil en `null`-verdi gi en feilmelding - for eksempel om man prøver å slå opp i
-datamodellen med `["dataModel", null]`. I `concat`-funksjonen vil derimot en `null`-verdi bli tolket som en tom streng.
-
-### Strenger
-
-Strenger inneholder vilkårlig tekst, og er en bred datatype som tall og boolske verdier kan konverteres til.
-
-Noen strenger kan også konverteres til andre datatyper:
-
-| Strengverdi | Kan erstatte | Eksempler |
-| -------------------------------------------------- | -------------------------- | -------------------------- |
-| Heltall med eller uten negativt fortegn | [Tall](#tall) | `3`, `-8`, `71254` |
-| Desimaltall med eller uten negativt fortegn | [Tall](#tall) | `3.14`, `-33.0`, `123.123` |
-| `true` eller `false` med små eller store bokstaver | [Boolsk](#boolske-verdier) | `true`, `True`, `FALSE` |
-| `null` med små eller store bokstaver | [Null](#null) | `null`, `Null`, `NULL` |
-
-Alle andre strenger enn de i tabellen over vil gi feilmelding om de blir forsøkt konvertert til andre typer.
-
-### Tall
-
-Tallverdier gjelder positive og negative heltall og desimaltall. Noen strenger blir også konvertert
-automatisk til en tallverdi, som vist i tabellen til strenger over. For at konvertering av en streng til et tall
-skal fungere, må strengen oppfylle følgende:
-
-- Strengen inneholder bare et tall, ingen annen tekst foran/bak tallet
-- Negativt fortegn (`-`) kan brukes, men positivt fortegn (`+`) støttes ikke.
-- Desimaltall må representeres med punktum, ikke komma.
-- Tusenskilletegn eller annen tallformattering støttes ikke.
-
-Alle andre strenger vil gi en feilmelding om de blir forsøkt konvertert til et tall. Forsøker man å konvertere en
-[boolsk verdi](#boolske-verdier) til et tall, gir det også en feilmelding.
-
-Funksjoner som forventer å få inn et tall kan også få inn [`null`](#null). Se mer om hvilken effekt det har under
-beskrivelsen til hver funksjon.
-
-### Boolske verdier
-
-Boolske verdier omfatter `true` (sann) og `false` (usann). Når man kaller en funksjon som forventer å få inn en boolsk
-verdi, kan man også sende inn enkelte andre typer, som blir konvertert til en boolsk verdi:
-
-- Tallene `1` og `0` fungerer som henholdsvis `true` og `false`
-- Strengene `"1"` og `"0"` fungerer likt som tallene (og blir henholdsvis `true` og `false`)
-- Strengene `"true"` og `"false"` konverteres også til en boolsk verdi
-- Verdien [`null`](#null) fungerer likt som `false`
-
-Alle andre verdier gir en feilmelding om de blir sendt til en funksjon som forventer en boolsk verdi. Legg merke til
-at disse reglene er litt forskjellige fra reglene til [strenger](#strenger). Det er dermed forskjell på hvilke verdier
-som kan _tolkes_ som en boolsk verdi for en funksjon som forventer et boolsk argument - og hvilke verdier som er _like_
-en boolsk verdi. Funksjonen [`equals`](#func-equals) sammenligner verdier som strenger, og dermed vil tallet `1` og
-strengen `"1"` sammenlignes som like, men den vil ikke gjenkjenne `1` og `true` som like verdier.
-
-Det kan kanskje se ut som følgende uttrykk er like:
-
-1. `"hidden": ["dataModel", "hideName"]`
-2. `"hidden": ["equals", ["dataModel", "hideName"], true]`
-3. `"hidden": ["if", ["dataModel", "hideName"], true, "else", false]`
-
-Hvis verdien (her gitt fra oppslaget `["dataModel", "hideName"]`) er `true` eller `"true"` vil
-komponenten skjules, men dersom verdien er `1` eller `"1"` vil komponenten bare skjules med uttrykkene i alternativ
-1 og 3. Dette fordi resultatet i uttrykket for `hidden` [konverteres til en boolsk verdi](#bruksområder), og
-`if` [forventer en boolsk verdi som første argument](#func-if). Derimot vil `equals` sammenligne verdiene som strenger,
-og `"1"` er ikke lik `"true"`.
-
-Se også tips og triks under [_Streng eller mindre streng sammenligning?_](#streng-eller-mindre-streng-sammenligning)
-
-### Null
-
-De fleste steder hvor man forventer å få inn en [streng](#strenger), [tall](#tall) eller
-[boolske verdier](#boolske-verdier) skal også tåle en `null`-verdi. Null-verdier indikerer at en spesifikk verdi
-mangler, og det er forskjell på f.eks. en `null`-verdi, en tom [streng](#strenger) og [tallet](#tall) `0`.
-
-Dersom man gjør et oppslag i en funksjon som `dataModel`, og verdien man leter etter ikke finnes/er satt, vil som regel
-`null` bli resultatet.
-
-## Tips og triks
-
-### Vise/skjule hele sider
-
-Uttrykk kan brukes til å vise/skjule hele sider. I eksempelet under vil hele siden skjules dersom en komponent
-(på en av de andre sidene) har verdien _no_ eller ikke er satt.
-
-```json
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- "data": {
- "hidden": ["or",
- ["equals", ["component", "hasComplaints"], "no"],
- ["equals", ["component", "hasComplaints"], null]
- ],
- "layout": [
- ...
- ]
- }
-}
-```
-
-Dersom siden man stod på blir skjult, vil applikasjonen automatisk gå videre til neste tilgjengelige side
-i [side-rekkefølgen](../../ux/pages/navigation#rekkefølge). Om alle de neste sidene er skjult, vises den første mulige
-siden i rekkefølgen istedenfor.
-
-### Streng eller mindre streng sammenligning?
-
-Måten uttrykkene kjøres på gjør at de kan virke litt strenge (ved at f.eks. `0` og `null` er ulike verdier når man
-sammenligner med `equals`). Det er et designvalg gjort i Altinn av to grunner:
-
-1. Strenge regler er tydelige regler. Uttrykkene vil heller gi en feilmelding om noe ikke er som forventet, enn å la deg
- lure på hvorfor det ble slikt det ble.
-2. Hvis uttrykkene behandler mange ulike verdier som like, fratar vi deg muligheten til å skille mellom dem om du skulle
- ønske det.
-
-Om man ønsker mindre streng sammenligning, kan man f.eks. konstruere et uttrykk som bruker [`or`](#func-and)-funksjonen
-til å gjenkjenne flere forskjellige verdier:
-
-```json
-[
- "or",
- ["equals", ["dataModel", "My.Path"], 0],
- ["equals", ["dataModel", "My.Path"], false],
- ["equals", ["dataModel", "My.Path"], null],
- ["equals", ["dataModel", "My.Path"], ""]
-]
-```
-
-Husk også at konvertering til [boolsk verdi](#boolske-verdier) tillater flere alternativer enn strenger
-(som `equals` forventer). Siden funksjonen `or` forventer boolske verdier som argumenter, og verdiene
-`0`, `false` og `null` allerede tillates som boolske verdier vil følgende fungere likt som uttrykket over:
-
-```json
-["or", ["dataModel", "My.Path"], ["equals", ["dataModel", "My.Path"], ""]]
-```
diff --git a/content/app/development/logic/generic/_index.en.md b/content/app/development/logic/generic/_index.en.md
deleted file mode 100644
index fa712666ee5..00000000000
--- a/content/app/development/logic/generic/_index.en.md
+++ /dev/null
@@ -1,41 +0,0 @@
----
-title: Generic
-description: Overview of logic files and how they can be used.
-toc: true
-weight: 10
----
-
-## Introduction
-
-The various files that are used to define logic on the frontend can be found in the logic menu
-that is available in the UI editor through the _f(x)_-icon at the top right corner.
-
-{{% panel theme="warning" %}}
-⚠️ Dynamics/logic are under active development. These rules will in the future be replaced by
-[dynamic expressions](../expressions). Currently only show/hide dynamics are supported using expressions, but
-calculation and validation will be supported in the future.
-{{% /panel %}}
-
-![Logic menu](ui-editor-logic-menu.png?height=300px "Logic menu")
-
-For backend the logic is done by implementing various interfaces. These are described in separate chapters for example
-in [data processing](../dataprocessing/).
-A complete project with examples on server-side application logic can be
-found [in our training course application](https://altinn.studio/repos/ttd/tilflytter-sogndal-lf/src/branch/master).
-
-{{%panel info%}}
-**NOTE:** The way you reference elements in the data model is different between OR and SERES type XSD's.
-For OR XSD's, `.value` is a necessary suffix in the reference. The example code below uses a mixture of the two types of
-data models.
-{{% /panel%}}
-
-
-## Auto-complete/intellisense
-
-By editing the source code in the apps locally, e.g. in Visual Studio Code, you get intellisense and autocomplete automatically.
-For the C#-files, it's easiest working on these locally.
-
-For the javascript-files, intellisense/autocomplete is also available if you wish to edit the files directly in Altinn Studio.
-This appears automatically when writing, and you can also force it to appear by pressing `CTRL + SPACE`
-
-![Logic menu - auto-complete/intellisense](datamodel-intellisense.gif "Logic menu - auto-complete/intellisense")
diff --git a/content/app/development/logic/generic/_index.nb.md b/content/app/development/logic/generic/_index.nb.md
deleted file mode 100644
index 9377137a633..00000000000
--- a/content/app/development/logic/generic/_index.nb.md
+++ /dev/null
@@ -1,37 +0,0 @@
----
-title: Generelt
-description: Oversikt over logikkfiler og hvordan de kan brukes.
-toc: true
-weight: 10
----
-
-## Introduksjon
-
-De forskjellige filene som brukes til å definere logikk på frontend, finner man i logikk-menyen,
-som er tilgjengelig i UI-editoren via _f(x)_-ikonet øverst til høyre.
-
-{{% panel theme="warning" %}}
-⚠️ Dynamikk er et område under aktiv utvikling. Logikk-filer skrevet i JavaScript fases etterhvert ut og blir erstattet
-av [dynamiske uttrykk](../expressions).
-{{% /panel %}}
-
-![Logikkmeny](ui-editor-logic-menu.png?height=300px "Logikkmeny")
-
-For backend så håndteres logikk gjennom forskjellige grensesnitt. Disse er beskrevet på de forskjellige sidene under dette området som f. eks. [data prosessering](../dataprocessing/).
-Et komplett prosjekt med eksempler på serverside applikasjonslogikk ligger [i vår kursapplikasjon](https://altinn.studio/repos/ttd/tilflytter-sogndal-lf/src/branch/master).
-
-{{%panel info%}}
-**MERK:** Måten man refererer til elementer i datamodellen er ulik mellom OR og SERES typer XSDer.
-For OR XSDer er `.value` et nødvendig suffiks i referansen. Eksempelkoden under bruker en blanding av de to typene datamodeller.
-{{% /panel%}}
-
-
-## Auto-complete/intellisense
-
-Ved å redigere kildekoden i appene lokalt, i f.eks. Visual Studio Code, får man intellisense og autocomplete med på kjøpet.
-For C#-filene er det enkleste å jobbe med disse lokalt.
-
-For javascript-filene er det også intellisense/autocomplete tilgjengelig om man ønsker å redigere filene direkte i Altinn Studio.
-Dette kommer automatisk mens man skriver, og man kan også tvinge det frem ved å trykke `CTRL + SPACE`
-
-![Logic menu - auto-complete/intellisense](datamodel-intellisense.gif "Logic menu - auto-complete/intellisense")
diff --git a/content/app/development/logic/generic/datamodel-intellisense.gif b/content/app/development/logic/generic/datamodel-intellisense.gif
deleted file mode 100644
index b45823b548f..00000000000
Binary files a/content/app/development/logic/generic/datamodel-intellisense.gif and /dev/null differ
diff --git a/content/app/development/logic/generic/ui-editor-logic-menu.png b/content/app/development/logic/generic/ui-editor-logic-menu.png
deleted file mode 100644
index 2cc620bc205..00000000000
Binary files a/content/app/development/logic/generic/ui-editor-logic-menu.png and /dev/null differ
diff --git a/content/app/development/logic/instantiation/_index.en.md b/content/app/development/logic/instantiation/_index.en.md
deleted file mode 100644
index 904f272b0b2..00000000000
--- a/content/app/development/logic/instantiation/_index.en.md
+++ /dev/null
@@ -1,193 +0,0 @@
----
-title: Instantiation
-description: How to add logic to be run when a new instance is created?
-toc: true
----
-
-## Introduction
-
-Application logic connected to instantiation can be defined by implementing an interface and registrering them in `Program.cs`
-
- - `IInstantiationValidator` - create your own tests for determining whether a user/submitter is allowed to instantiate.
- - `IInstantiationProcessor` - create customized prefill data, this is described in the [prefill chapter](/app/development/data/prefill/custom/).
-
-## Custom validation rules for instantiation
-Validation rules for instantiation can include validating a time to specific user instructions and complex tests that
-require external API calls.
-
-
-### Example 1 - Instantiation only allowed before 3 pm on any given day
-
-```C# {hl_lines=[12]}
-namespace Altinn.App.Logic;
-
-using Altinn.App.Core.Features;
-using Altinn.App.Core.Models.Validation;
-using Altinn.Platform.Storage.Interface.Models;
-
-public class InstantiationValidatorExample1 : IInstantiationValidator
-{
- public Task Validate(Instance instance)
- {
- DateTime now = DateTime.Now;
- if (now.Hour < 15)
- {
- return new InstantiationValidationResult()
- {
- Valid = false,
- Message = "ERROR: Instantiation not possible before 3PM."
- };
- }
-
- return null;
- }
-}
-```
-In `Program.cs` the service must be registrered by
-```C#
-services.AddTransient()
-```
-
-### Example 2 - Instantiation only allowed for application owner
-To limit instantiation to a given entity, in this case the application owner, you need to inject extra services for usage in the validation implementation.
-
-To validate the instantiation, you can check one of two claims in the context.
-Either the organization's three-letter abbreviation or the organization number.
-The example below uses the organization abbreviation.
-
-To validate based on organization number you can follow the example below,
-and replace *AltinnCoreClaimTypes.Org* with *AltinnCoreClaimTypes.OrgNumber*.
-
-```C#
-namespace Altinn.App.Logic;
-
-using System.Security.Claims;
-using Altinn.App.Core.Features;
-using Altinn.App.Core.Models.Validation;
-using Altinn.Platform.Storage.Interface.Models;
-using AltinnCore.Authentication.Constants;
-using Microsoft.AspNetCore.Http;
-
-public class InstantiationValidatorExample2 : IInstantiationValidator
-{
- private readonly ClaimsPrincipal _user;
-
- public InstantiationValidatorExample2(IHttpContextAccessor contextAccessor)
- {
- _user = contextAccessor.HttpContext!.User;
- }
-
- public async Task Validate(Instance instance)
- {
- var result = new InstantiationValidationResult();
- string org = string.Empty;
-
- if (_user.HasClaim(c => c.Type == AltinnCoreClaimTypes.Org))
- {
- Claim? orgClaim =
- _user.FindFirst(c => c.Type == AltinnCoreClaimTypes.Org);
-
- if (orgClaim != null)
- {
- org = orgClaim.Value;
- }
- }
-
- if (!string.IsNullOrWhiteSpace(org) && org.Equals("ttd"))
- {
- result.Valid = true;
- }
- else
- {
- result.Valid = false;
- result.Message =
- "Only ttd is allowed to instantiate this application.";
- }
-
- return result;
- }
-}
-```
-
-I `Program.cs` må tjenesten registreres med
-```C#
-services.AddTransient()
-```
-
-
-### Example 3 - Instantiation only allowed between certain dates
-
-To limit instantiation to a certain time frame, in this example January 2021, you can take some inspration from the following example.
-
-```cs
-namespace Altinn.App.Logic;
-
-using Altinn.App.Core.Features;
-using Altinn.App.Core.Models.Validation;
-using Altinn.Platform.Storage.Interface.Models;
-
-public class InstantiationValidatorExample3 : IInstantiationValidator
-{
- public async Task Validate(Instance instance)
- {
- DateTime now = TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"));
- if (now < new DateTime(2021, 01, 01))
- {
- return new InstantiationValidationResult
- {
- Valid = false,
- Message = "Application cannot be instantiated before 1.1.2021"
- };
- }
- else if (now > new DateTime(2021, 01, 31))
- {
- return new InstantiationValidationResult
- {
- Valid = false,
- Message = "Application cannot be instantiated after 25.1.2021"
- };
- }
-
- return null;
- }
-}
-```
-
-Logic connected to date handling has been added to ensure the Norwegian time zone
-is being used in the validation.
-
-```cs
-DateTime now = TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"));
-```
-
-Furthermore, a simple test is run to see if the current time is within the given time frame
-
-```cs
-(now < new DateTime(2021, 01, 01)
-```
-
-If the requirements are not met, the return object is populated with an _InstantiationValidationResult_ object that contains two fields:
-_Valid_: a boolean that says if the instantiation is valid or not.
-_Message_: a string that can contain an error message if it is not valid.
-
-
-```cs
- result = new InstantiationValidationResult
- {
- Valid = false,
- Message = "Application cannot be instantiated before 1.1.2021"
- };
-```
-
-In addition you have the opportunity to use property
-_ValidParties_: a list of the parties that are allowed to instantiate the application.
-
-The result of a failed validation is shown below:
-
-![Instantiation pre allowed time frame](instantiation-validation-before-date.png "Instantiation pre allowed time frame")
-
-![Instantiation post allowed time frame](instantiation-validation-after-date.png "Instantiation post allowed time frame")
-
-
-
-
diff --git a/content/app/development/logic/instantiation/_index.nb.md b/content/app/development/logic/instantiation/_index.nb.md
deleted file mode 100644
index cd5425c9338..00000000000
--- a/content/app/development/logic/instantiation/_index.nb.md
+++ /dev/null
@@ -1,194 +0,0 @@
----
-title: Instansiering
-description: Hvordan legge til logikk som skal kjøres ved instansiering?
-toc: true
----
-
-## Introduksjon
-
-Applikasjonslogikk knyttet til instansiering kan defineres ved å implmentere interfaces og registrere dem i `Program.cs`
-
- - `IInstantiationValidator` - lag egne sjekker for å avgjøre om en bruker/avgiver får lov til å instansiere.
- - `IInstantiationProcessor` - lag tilpasset prefill data, dette er beskrevet i [prefill kapitlet](/nb/app/development/data/prefill/custom/).
-
-## Egendefinerte valideringsregler for instansiering
-Valideringsregler for instansiering kan innebære å validere tidspunkt til spesifikke brukerrestriksjoner og komplekse sjekker som krever eksterne API-kall.
-
-
-### Eksempel 1 - Insansiering kun tillatt før kl 15:00 på en gitt dag
-
-```C# {hl_lines=[12]}
-namespace Altinn.App.Logic;
-
-using Altinn.App.Core.Features;
-using Altinn.App.Core.Models.Validation;
-using Altinn.Platform.Storage.Interface.Models;
-
-public class InstantiationValidatorExample1 : IInstantiationValidator
-{
- public Task Validate(Instance instance)
- {
- DateTime now = DateTime.Now;
- if (now.Hour < 15)
- {
- return new InstantiationValidationResult()
- {
- Valid = false,
- Message = "ERROR: Instantiation not possible before 3PM."
- };
- }
-
- return null;
- }
-}
-```
-I `Program.cs` må tjenesten registreres med
-```C#
-services.AddTransient()
-```
-
-### Eksempel 2 - Instansiering kun tillatt for applikasjonseier
-For å kunne begrense instansiering til en gitt entitet, i dette tilfellet applikasjonseier,
-må det hentes inn ekstra tjensester for å brukes ved valideringen.
-
-For å validere instansieringen kan man sjekke ett av to claims i konteksten.
-Enten organisasjonsen trebokstavsforkortelse eller organisasjonsnummeret.
-Eksempelet nedenfor bruker organisasjonsforkortelsen.
-
-For å validere basert på organisasjonsnummer kan du følge eksempelet nedenfor,
-og bytte ut *AltinnCoreClaimTypes.Org* med *AltinnCoreClaimTypes.OrgNumber*.
-om må gjøres i denne file ser du nedenfor.
-
-
-```C#
-namespace Altinn.App.Logic;
-
-using System.Security.Claims;
-using Altinn.App.Core.Features;
-using Altinn.App.Core.Models.Validation;
-using Altinn.Platform.Storage.Interface.Models;
-using AltinnCore.Authentication.Constants;
-using Microsoft.AspNetCore.Http;
-
-public class InstantiationValidatorExample2 : IInstantiationValidator
-{
- private readonly ClaimsPrincipal _user;
-
- public InstantiationValidatorExample2(IHttpContextAccessor contextAccessor)
- {
- _user = contextAccessor.HttpContext!.User;
- }
-
- public async Task Validate(Instance instance)
- {
- var result = new InstantiationValidationResult();
- string org = string.Empty;
-
- if (_user.HasClaim(c => c.Type == AltinnCoreClaimTypes.Org))
- {
- Claim? orgClaim =
- _user.FindFirst(c => c.Type == AltinnCoreClaimTypes.Org);
-
- if (orgClaim != null)
- {
- org = orgClaim.Value;
- }
- }
-
- if (!string.IsNullOrWhiteSpace(org) && org.Equals("ttd"))
- {
- result.Valid = true;
- }
- else
- {
- result.Valid = false;
- result.Message =
- "Only ttd is allowed to instantiate this application.";
- }
-
- return result;
- }
-}
-```
-
-I `Program.cs` må tjenesten registreres med
-```C#
-services.AddTransient()
-```
-
-### Eksempel 3 - Instansiering kun tillatt mellom gitte datoer
-
-For å kunne begrense instansiering til en gitt tidsrom, i dette eksempelet januar 2021, kan man ta inspirasjon fra det følgende eksempelet.
-
-```cs
-namespace Altinn.App.Logic;
-
-using Altinn.App.Core.Features;
-using Altinn.App.Core.Models.Validation;
-using Altinn.Platform.Storage.Interface.Models;
-
-public class InstantiationValidatorExample3 : IInstantiationValidator
-{
- public async Task Validate(Instance instance)
- {
- DateTime now = TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"));
- if (now < new DateTime(2021, 01, 01))
- {
- return new InstantiationValidationResult
- {
- Valid = false,
- Message = "Application cannot be instantiated before 1.1.2021"
- };
- }
- else if (now > new DateTime(2021, 01, 31))
- {
- return new InstantiationValidationResult
- {
- Valid = false,
- Message = "Application cannot be instantiated after 25.1.2021"
- };
- }
-
- return null;
- }
-}
-```
-
-Det er lagt inn logikk knyttet til datohåndtering for å forsikre oss om at det er norsk tid som gjelder
-og som blir brukt i valideringen.
-
-```cs
-DateTime now = TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"));
-```
-
-Videre gjøres det en enkel sjekk for å se om nåværende tidspunkt er innenfor rammene
-
-```cs
-(now < new DateTime(2021, 01, 01)
-```
-
-Dersom man ikke oppfyller kravene blir returobjektet populert med et _InstantiationValidationResult_ objekt som inneholder to felter:
-_Valid_: en boolean som benyttes for å si om instansieringen er gyldig eller ikke
-_Message_: en string som kan inneholde en feilmelding dersom det ikke er gyldig
-
-
-```cs
- result = new InstantiationValidationResult
- {
- Valid = false,
- Message = "Application cannot be instantiated before 1.1.2021"
- };
-```
-
-I tillegg har man muligheten til å legge benytte property
-_ValidParties_: en liste med de partiene som kan instansiere applikasjonen.
-
-Resultatet av en feilet validering er vist nedenfor:
-
-![Instansiering før tillatt dato](instantiation-validation-before-date.png "Instansiering før tillatt dato")
-
-![Instansiering etter tillatt dato](instantiation-validation-after-date.png "Instansiering etter tillatt dato")
-
-
-
-
diff --git a/content/app/development/logic/instantiation/instantiation-validation-after-date.png b/content/app/development/logic/instantiation/instantiation-validation-after-date.png
deleted file mode 100644
index ce3575e0781..00000000000
Binary files a/content/app/development/logic/instantiation/instantiation-validation-after-date.png and /dev/null differ
diff --git a/content/app/development/logic/instantiation/instantiation-validation-before-date.png b/content/app/development/logic/instantiation/instantiation-validation-before-date.png
deleted file mode 100644
index 51d3b11575d..00000000000
Binary files a/content/app/development/logic/instantiation/instantiation-validation-before-date.png and /dev/null differ
diff --git a/content/app/development/logic/notifications/_index.en.md b/content/app/development/logic/notifications/_index.en.md
deleted file mode 100644
index f99f2993f92..00000000000
--- a/content/app/development/logic/notifications/_index.en.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: Publish notifications
-linktitle: Notifications
-description: How to publish notifications for an app.
-weight: 200
----
-
-An application can publish notifications to users using the [Altinn Notifications API](/notifications).
-`Altinn.App.Core` has built-in interfaces and support for this.
-
-{{}}
\ No newline at end of file
diff --git a/content/app/development/logic/notifications/email/_index.en.md b/content/app/development/logic/notifications/email/_index.en.md
deleted file mode 100644
index bd2efa05905..00000000000
--- a/content/app/development/logic/notifications/email/_index.en.md
+++ /dev/null
@@ -1,76 +0,0 @@
----
-title: Email
-description: How to create custom email notifications for apps.
-weight: 400
----
-
-## Activate generation of email notifications in your application
-
-The email client is automatically added to the application. To use it, inject the `IEmailNotificationClient`-interface.
-The interface defines a method used to order an email notification from the [Altinn Notifications](https://github.com/Altinn/altinn-notifications) API.
-
-### Code example
-
-Below we see an example of trying to send an email notification when a user starts to fill out a form, by using the `IProcessTaskStart` interface.
-
-```csharp file=EmailOnStart.cs
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-using Altinn.App.Core.Features;
-using Altinn.App.Core.Internal.Notifications.Email;
-using Altinn.App.Core.Models.Notifications.Email;
-using Altinn.Platform.Storage.Interface.Models;
-using Microsoft.Extensions.Logging;
-
-namespace Altinn.App.Core;
-
-public class EmailOnStart(ILogger logger, IEmailNotificationClient emailNotificationClient)
- : IProcessTaskStart
-{
- public async Task Start(string taskId, Instance instance, Dictionary prefill)
- {
- // "Task_1" is the name of the schema step in the bpmn process
- if (taskId != "Task_1")
- return;
-
- try
- {
- var order = new EmailNotification
- {
- Subject = "Form started",
- Body = "You started filling out a form",
- SendersReference = "",
- Recipients = [new("firstname.lastname@email.com")],
- };
- using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
- var orderResult = await emailNotificationClient.Order(order, cts.Token);
- logger.LogInformation(
- "Task started, email sent to {EmailAddress} - OrderId={OrderId}",
- order.Recipients[0].EmailAddress,
- orderResult.OrderId
- );
- }
- catch (EmailNotificationException e)
- {
- logger.LogError(e, "Error sending email on task start");
- }
- }
-}
-```
-
-Then we have to register the `EmailOnStart` class as `IProcessTaskStart` in `Program.cs`.
-
-```csharp file=Program.cs
-using Altinn.App.Core;
-using Altinn.App.Core.Features;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.Extensions.Configuration;
-using Microsoft.Extensions.DependencyInjection;
-
-void RegisterCustomAppServices(IServiceCollection services, IConfiguration config, IWebHostEnvironment env)
-{
- services.AddSingleton();
-}
-```
diff --git a/content/app/development/logic/notifications/email/_index.nb.md b/content/app/development/logic/notifications/email/_index.nb.md
deleted file mode 100644
index 9e67fe94d5e..00000000000
--- a/content/app/development/logic/notifications/email/_index.nb.md
+++ /dev/null
@@ -1,76 +0,0 @@
----
-title: E-post
-description: Hvordan opprette egendefinerte e-postvarslinger for apper.
-weight: 400
----
-
-## Aktiver generering av e-postvarslinger i applikasjonen din
-
-E-postklienten legges automatisk til i applikasjonen. For å bruke den, injiser `IEmailNotificationClient`-interface.
-Interfacet definerer en metode som brukes til å bestille en e-postvarsling fra [Altinn Notifications](https://github.com/Altinn/altinn-notifications) API.
-
-### Kodeeksempel
-
-Under ser vi et eksempel hvor vi prøver å sende e-postvarsling når en bruker har startet utfylling av skjema, ved hjelp av `IProcessTaskStart`.
-
-```csharp file=EmailOnStart.cs
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-using Altinn.App.Core.Features;
-using Altinn.App.Core.Internal.Notifications.Email;
-using Altinn.App.Core.Models.Notifications.Email;
-using Altinn.Platform.Storage.Interface.Models;
-using Microsoft.Extensions.Logging;
-
-namespace Altinn.App.Core;
-
-public class EmailOnStart(ILogger logger, IEmailNotificationClient emailNotificationClient)
- : IProcessTaskStart
-{
- public async Task Start(string taskId, Instance instance, Dictionary prefill)
- {
- // "Task_1" er navnet på skjema-steget i bpmn-prosessen
- if (taskId != "Task_1")
- return;
-
- try
- {
- var order = new EmailNotification
- {
- Subject = "Skjema startet",
- Body = "Du har startet innfylling av skjema",
- SendersReference = "",
- Recipients = [new("navn.navnesen@epost.no")],
- };
- using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
- var orderResult = await emailNotificationClient.Order(order, cts.Token);
- logger.LogInformation(
- "Task started, email sent to {EmailAddress} - OrderId={OrderId}",
- order.Recipients[0].EmailAddress,
- orderResult.OrderId
- );
- }
- catch (EmailNotificationException e)
- {
- logger.LogError(e, "Error sending email on task start");
- }
- }
-}
-```
-
-Deretter må vi registrere klassen `EmailOnStart` som `IProcessTaskStart` i `Program.cs`.
-
-```csharp file=Program.cs
-using Altinn.App.Core;
-using Altinn.App.Core.Features;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.Extensions.Configuration;
-using Microsoft.Extensions.DependencyInjection;
-
-void RegisterCustomAppServices(IServiceCollection services, IConfiguration config, IWebHostEnvironment env)
-{
- services.AddSingleton();
-}
-```
diff --git a/content/app/development/logic/notifications/index.nb.md b/content/app/development/logic/notifications/index.nb.md
deleted file mode 100644
index de928707b5a..00000000000
--- a/content/app/development/logic/notifications/index.nb.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: Publiser varsler
-linktitle: Varsler
-description: Hvordan publisere varsler for en app.
-weight: 200
----
-
-En applikasjon kan publisere varsler til brukere ved hjelp av [Altinn Notifications API](/notifications).
-`Altinn.App.Core` har ferdigbygget interfaces for å støtte dette.
-
-{{}}
\ No newline at end of file
diff --git a/content/app/development/logic/notifications/sms/_index.en.md b/content/app/development/logic/notifications/sms/_index.en.md
deleted file mode 100644
index c1ef4c95ad5..00000000000
--- a/content/app/development/logic/notifications/sms/_index.en.md
+++ /dev/null
@@ -1,76 +0,0 @@
----
-title: SMS
-description: How to create custom SMS notifications for apps.
-weight: 400
----
-
-## Activate generation of SMS notifications in your application
-
-The SMS client is automatically added to the application. To use it, inject the `IEmailNotificationClient`-interface.
-The interface defines a method used to order an email notification from the [Altinn Notifications](https://github.com/Altinn/altinn-notifications) API.
-
-### Code example
-
-Below we see an example of trying to send a SMS notification when a user starts to fill out a form, by using the `IProcessTaskStart` interface.
-
-```csharp file=SmsOnStart.cs
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-using Altinn.App.Core.Features;
-using Altinn.App.Core.Internal.Notifications.Sms;
-using Altinn.App.Core.Models.Notifications.Sms;
-using Altinn.Platform.Storage.Interface.Models;
-using Microsoft.Extensions.Logging;
-
-namespace Altinn.App.Core;
-
-public class SmsOnStart(ILogger logger, ISmsNotificationClient smsNotificationClient)
- : IProcessTaskStart
-{
- public async Task Start(string taskId, Instance instance, Dictionary prefill)
- {
- // "Task_1" is the name of the schema step in the bpmn process
- if (taskId != "Task_1")
- return;
-
- try
- {
- var order = new SmsNotification
- {
- SenderNumber = "",
- Body = "You started filling out a form",
- SendersReference = "",
- Recipients = [new("0047XXXXXXXX")],
- };
- using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
- var orderResult = await smsNotificationClient.Order(order, default);
- logger.LogInformation(
- "Task started, SMS sent to {MobileNumber} - OrderId={OrderId}",
- order.Recipients[0].MobileNumber,
- orderResult.OrderId
- );
- }
- catch (SmsNotificationException e)
- {
- logger.LogError(e, "Error sending SMS on task start");
- }
- }
-}
-```
-
-Then we have to register the `SmsOnStart` class as `IProcessTaskStart` in `Program.cs`.
-
-```csharp file=Program.cs
-using Altinn.App.Core;
-using Altinn.App.Core.Features;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.Extensions.Configuration;
-using Microsoft.Extensions.DependencyInjection;
-
-void RegisterCustomAppServices(IServiceCollection services, IConfiguration config, IWebHostEnvironment env)
-{
- services.AddSingleton();
-}
-```
diff --git a/content/app/development/logic/notifications/sms/_index.nb.md b/content/app/development/logic/notifications/sms/_index.nb.md
deleted file mode 100644
index 16d93aedc30..00000000000
--- a/content/app/development/logic/notifications/sms/_index.nb.md
+++ /dev/null
@@ -1,76 +0,0 @@
----
-title: SMS
-description: Hvordan opprette egendefinerte SMS-varslinger for apper.
-weight: 400
----
-
-## Aktiver generering av SMS-varslinger i applikasjonen din
-
-SMS-klienten legges automatisk til i applikasjonen. For å bruke den, injiser `ISmsNotificationClient`-interface.
-Interfacet definerer en metode som brukes til å bestille en SMS-varsling fra [Altinn Notifications](https://github.com/Altinn/altinn-notifications) API.
-
-### Kodeeksempel
-
-Under ser vi et eksempel hvor vi prøver å sende SMS-varsling når en bruker har startet utfylling av skjema, ved hjelp av `IProcessTaskStart`.
-
-```csharp file=SmsOnStart.cs
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-using Altinn.App.Core.Features;
-using Altinn.App.Core.Internal.Notifications.Sms;
-using Altinn.App.Core.Models.Notifications.Sms;
-using Altinn.Platform.Storage.Interface.Models;
-using Microsoft.Extensions.Logging;
-
-namespace Altinn.App.Core;
-
-public class SmsOnStart(ILogger logger, ISmsNotificationClient smsNotificationClient)
- : IProcessTaskStart
-{
- public async Task Start(string taskId, Instance instance, Dictionary prefill)
- {
- // "Task_1" er navnet på skjema-steget i bpmn-prosessen
- if (taskId != "Task_1")
- return;
-
- try
- {
- var order = new SmsNotification
- {
- SenderNumber = "",
- Body = "Du har startet innfylling av skjema",
- SendersReference = "",
- Recipients = [new("0047XXXXXXXX")],
- };
- using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
- var orderResult = await smsNotificationClient.Order(order, default);
- logger.LogInformation(
- "Task started, SMS sent to {MobileNumber} - OrderId={OrderId}",
- order.Recipients[0].MobileNumber,
- orderResult.OrderId
- );
- }
- catch (SmsNotificationException e)
- {
- logger.LogError(e, "Error sending SMS on task start");
- }
- }
-}
-```
-
-Deretter må vi registrere klassen `SmsOnStart` som `IProcessTaskStart` i `Program.cs`.
-
-```csharp file=Program.cs
-using Altinn.App.Core;
-using Altinn.App.Core.Features;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.Extensions.Configuration;
-using Microsoft.Extensions.DependencyInjection;
-
-void RegisterCustomAppServices(IServiceCollection services, IConfiguration config, IWebHostEnvironment env)
-{
- services.AddSingleton();
-}
-```
diff --git a/content/app/development/logic/services/_index.en.md b/content/app/development/logic/services/_index.en.md
deleted file mode 100644
index 4323bbfdb95..00000000000
--- a/content/app/development/logic/services/_index.en.md
+++ /dev/null
@@ -1,160 +0,0 @@
----
-title: Services
-linktitle: Services
-description: How to use a few different services hidden away in the app template library.
-toc: true
----
-
-## Person lookup
-The person lookup service can be use to verify a national identity number and to retrieve person information about the identified person. The user will need to provide the national identity number and the last name of the person. The service will then verify the input by comparing it with stored data. Both input are required and the last name is used to prevent cleaning of random identity numbers. If the user inputs invalid data too many times the service will block the user for some time.
-
-The returned person data can be used to populate additional fields in the model.
-
-{{% notice warning %}}
-The use of this service requires that end user is authenticated with a level 2 or higher authentication mechanism.
-Hence your application must also require minimum authentication level 2.
-{{% /notice %}}
-
-{{}}
-
-{{}}
-### Person lookup example
-The service can be used in any of the handlers in the logic namespace. Below we've created an example using the `ProcessDataWrite` method in `DataProcessor`.
-
-```C#
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-using Altinn.App.Core.Features;
-using Altinn.App.Core.Interface;
-using Altinn.App.Models;
-using Altinn.Platform.Register.Models;
-using Altinn.Platform.Storage.Interface.Models;
-using Microsoft.Extensions.Logging;
-
-namespace Altinn.App.AppLogic.DataProcessing;
-
-public class DataProcessor : IDataProcessor
-
-public async Task ProcessDataWrite(
- Instance instance, Guid? dataId, object data)
-{
- if (data is MessageV1 message)
- {
- Person person = await _personLookup.GetPerson(
- message.Personnummer,
- message.Etternavn,
- CancellationToken.None);
-
- message.Fornavn = person.FirstName;
- return true;
- }
-
- return false;
-}
-```
-
-For this to work we'll need to do a few other changes in `DataProcessor`.
-
-Add a private field `_personLookup` for the lookup service and change the constructor to take an instance of the service. Initialize the field in the body of the constructor.
-
-```C#
-private readonly IPersonLookup _personLookup;
-
-public DataProcessingHandler(IPersonLookup personLookup)
-{
- _personLookup = personLookup;
-}
-```
-
-Register you custom implementation in the Program.cs class
-
-```C# {hl_lines=[3]}
-void RegisterCustomAppServices(IServiceCollection services, IConfiguration config)
-{
- services.AddTransient();
- services.AddTransient();
- // Other custom services
-}
-
-{{}}
-{{}}
-### Person lookup example
-The service can be used in any of the handlers in the logic namespace. Below we've created an example using the `ProcessDataWrite` method in `DataProcessingHandler`.
-
-```C#
-public async Task ProcessDataWrite(
- Instance instance, Guid? dataId, object data)
-{
- if (data is MessageV1 message)
- {
- Person person = await _personLookup.GetPerson(
- message.Personnummer,
- message.Etternavn,
- CancellationToken.None);
-
- message.Fornavn = person.FirstName;
- return true;
- }
-
- return false;
-}
-```
-
-For this to work we'll need to do a few other changes in `DataProcessingHandler`.
-
-Add a private field for the lookup service and change the constructor to take an instance of the service. Initialize the field in the body of the constructor.
-
-```C#
-private readonly IPersonLookup _personLookup;
-
-public DataProcessingHandler(IPersonLookup personLookup)
-{
- _personLookup = personLookup;
-}
-```
-
-The changes to the `DataProcessingHandler` constructor also force us to update the constructor call from the `App` class constructor. Add `IPersonLookup` as an input parameter and use the parameter value as input to the constructor of `DataProcessingHandler`.
-
-```C# {hl_lines=[4,9]}
-public App(
- ...
- IText textService,
- IPersonLookup personLookup,
- IHttpContextAccessor httpContextAccessor) : base(...)
-{
- _logger = logger;
- _validationHandler = new ValidationHandler(httpContextAccessor);
- _dataProcessingHandler = new DataProcessingHandler(personLookup);
- _instantiationHandler = new InstantiationHandler(profileService, registerService);
- _pdfHandler = new PdfHandler();
-}
-```
-{{}}
-
-{{}}
-
-### A note on exception handling
-
-With no other changes than those above, the app backend will return response code `429 - TooManyRequests` if the user has been typing in invalid data too many times. This response code is currently not handled by the frontend react application which results in an "unknown error". This can be avoided with exception handling that singles out any `PlatformHttpException` with a response with status code 429, but there are currently no built in mechanism to convey to the user why a request failed. A workaround for this limitation is to use a property on the data model.
-
-```C#
-try
-{
- ...
- return true;
-}
-catch (PlatformHttpException phex)
-{
- switch (phex.Response.StatusCode)
- {
- case HttpStatusCode.TooManyRequests:
- // Add corrective messures
- break;
- case HttpStatusCode.NotFound:
- // Add corrective messures
- break;
- }
- throw;
-}
-```
diff --git a/content/app/development/logic/services/_index.nb.md b/content/app/development/logic/services/_index.nb.md
deleted file mode 100644
index a8bdd22484e..00000000000
--- a/content/app/development/logic/services/_index.nb.md
+++ /dev/null
@@ -1,161 +0,0 @@
----
-title: Tjenester
-linktitle: Tjenester
-description: Hvordan benytte enkelte bortgjemte tjenester og klienter i app template bibliotekene.
-toc: false
-weight: 30
----
-
-## Personoppslag
-Tjenesten for personoppslag kan brukes til å verifisere et personnummer og til å hente informasjon om den identifiserte personen. Brukeren vil måtte oppgi både et personnummer og etternavnet til personen. Tjenesten vil da gjøre et oppslag på personnummeret og sjekke at etternavnet stemmer. Begge verdiene er obligatoriske og etternavnet brukes til å forhindre vasking av personnummer. Hvis brukeren oppgir feil informasjon for mange ganger vil brukeren bli sperret fra å gjøre flere oppslag i en liten periode.
-
-De returnete persondataene kan brukes til å fylle ut andre felter i datamodellen.
-
-{{% notice warning %}}
-Bruken av denne tjenesten krever autentiseringsnivå 2 eller høyere.^
-Applikasjoner som bruker denne tjenesten må derfor kreve minimum nivå 2 eller høyere.
-{{% /notice %}}
-
-{{}}
-
-{{}}
-### Personoppslag eksempel
-Tjenesten kan benyttes fra alle "handlers" i logikk klassene i en app. Nedenfor har vi laget et eksempel som gjør oppslag i `ProcessDataWrite` metoden i `DataProcessor`.
-
-```C#
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-using Altinn.App.Core.Features;
-using Altinn.App.Core.Interface;
-using Altinn.App.Models;
-using Altinn.Platform.Register.Models;
-using Altinn.Platform.Storage.Interface.Models;
-using Microsoft.Extensions.Logging;
-
-namespace Altinn.App.AppLogic.DataProcessing;
-
-public class DataProcessor : IDataProcessor
-
-public async Task ProcessDataWrite(
- Instance instance, Guid? dataId, object data)
-{
- if (data is MessageV1 message)
- {
- Person person = await _personLookup.GetPerson(
- message.Personnummer,
- message.Etternavn,
- CancellationToken.None);
-
- message.Fornavn = person.FirstName;
- return true;
- }
-
- return false;
-}
-```
-
-For at dette skal fungere må vi gjøre et par andre endringer i `DataProcessor`.
-
-Legg til et privat felt `_personLookup` for tjenesten og oppdater klassens konstruktør til å ta inn en instanse av tjenesten som input. Set det private feltet i konstruktøren.
-
-```C#
-private readonly IPersonLookup _personLookup;
-
- public DataProcessor(IPersonLookup personLookup)
- {
- _personLookup = personLookup;
- }
-```
-
-Registrer din implementering i Program.cs klassen.
-
-```C# {hl_lines=[3]}
-void RegisterCustomAppServices(IServiceCollection services, IConfiguration config)
-{
- services.AddTransient();
- services.AddTransient();
- // Other custom services
-}
-```
-{{}}
-{{}}
-### Personoppslag eksempel
-Tjenesten kan benyttes fra alle "handlers" i logikk klassene i en app. Nedenfor har vi laget et eksempel som gjør oppslag i `ProcessDataWrite` metoden i `DataProcessingHandler`.
-
-```C#
-public async Task ProcessDataWrite(
- Instance instance, Guid? dataId, object data)
-{
- if (data is MessageV1 message)
- {
- Person person = await _personLookup.GetPerson(
- message.Personnummer,
- message.Etternavn,
- CancellationToken.None);
-
- message.Fornavn = person.FirstName;
- return true;
- }
-
- return false;
-}
-```
-
-For at dette skal fungere må vi gjøre et par andre endringer i `DataProcessingHandler`.
-
-Legg til et privat felt `_personLookup` for tjenesten og oppdater klassens konstruktør til å ta inn en instanse av tjenesten som input. Set det private feltet i konstruktøren.
-
-```C#
-private readonly IPersonLookup _personLookup;
-
-public DataProcessingHandler(IPersonLookup personLookup)
-{
- _personLookup = personLookup;
-}
-```
-
-Endringene i `DataProcessingHandler` konstruktøren medfører at man også må gjøre endringer i konstruktøren til `App` klassen. Legg til `IPersonLookup` som input parameter og bruk verdien som input i konstruktøren til `DataProcessingHandler`.
-
-```C# {hl_lines=[4,9]}
-public App(
- ...
- IText textService,
- IPersonLookup personLookup,
- IHttpContextAccessor httpContextAccessor) : base(...)
-{
- _logger = logger;
- _validationHandler = new ValidationHandler(httpContextAccessor);
- _dataProcessingHandler = new DataProcessingHandler(personLookup);
- _instantiationHandler = new InstantiationHandler(profileService, registerService);
- _pdfHandler = new PdfHandler();
-}
-```
-{{}}
-
-{{}}
-
-### Håndtering av feil
-
-Uten flere endringer enn de som er beskrevet over, vil app backend begynne å svare med statuskode `429 - TooManyRequests` hvis brukeren har oppgitt feil data for mange ganger. Denne statuskoden er for øyeblikket ikke håndtert av frontend delen av app koden. Dette vil i utganspunktet resultere i "ukjent feil" som kan unngås ved å legge inn håndtering av exceptions. Det kan legges inn kode som fanger opp PlatformHttpException med en response med statuskode 429, men det er i dag ingen god innebygget mekanisme som kan brukes til å informere brukeren om hvorfor noe gikk galt. Det man eventuelt kan gjøre er å benytte et felt i datamodellen.
-
-```C#
-try
-{
- ...
- return true;
-}
-catch (PlatformHttpException phex)
-{
- switch (phex.Response.StatusCode)
- {
- case HttpStatusCode.TooManyRequests:
- // Add corrective messures
- break;
- case HttpStatusCode.NotFound:
- // Add corrective messures
- break;
- }
- throw;
-}
-```
diff --git a/content/app/development/logic/validation/_index.en.md b/content/app/development/logic/validation/_index.en.md
deleted file mode 100644
index a7bfe24a304..00000000000
--- a/content/app/development/logic/validation/_index.en.md
+++ /dev/null
@@ -1,637 +0,0 @@
----
-title: Validation
-description: How to add logic to validate form data?
-toc: true
----
-
-## Introduction
-
-Validations ensures that the user's input is valid with regard to the data model,
-in addition to all custom rules that are set up for the application.
-Validations can be run either on the client- (the browser) or the server-side.
-
-Validations can also be set up to [trigger on page navigation](/app/development/ux/pages/navigation/#validation-on-page-navigation).
-
-## Client-side validation
-
-This validation is run in the browser before data is sent to server for saving. This makes it possible to give quick feedback to
-the user during the process of filling out the form.
-
-Client-side validation is based on the data model of the form, and uses this to determine what is valid input in a
-field.
-Specifically, the JSON schema version of the data model is used for validation. This is automatically generated when
-uploading an XSD.
-It is possible to make changes in the JSON schema file directly to adapt the validation when needed.
-
-**Note that if you make changes in the JSON schema manually, and then update the XSD and re-upload it, a new
-JSON schema will also be generated and all manual adaptations will have to be remade. It is therefore recommended to
-make changes in the XSD and/or the data modeling tool
-for these changes to be reflected in the JSON schema.**
-
-An example of how a field can be defined in the JSON schema data model is:
-
-```json
-"someField": {
- "type": "string",
- "maxLength": "4"
-}
-```
-
-Input in this field will be validated towards the limits that are set, and an error message will appear if these are not met - in this case, if
-input is a text longer than four characters.
-
-### Default error messages
-Default error messages has been set up for all validations done on the client-side. See the overview below.
-
-| Rule | Error message bokmål | Error message nynorsk | Error message english |
-| --------- | ----------------------------- | ----------------------------- | ------------------------------------- |
-| minimum | 'Minste gyldig verdi er {0}' | 'Minste gyldig verdi er {0}' | 'Minimum valid value is {0}' |
-| maximum | 'Største gyldig verdi er {0}' | 'Største gyldig verdi er {0}' | 'Maximum valid value is {0}' |
-| minLength | 'Bruk {0} eller flere tegn' | 'Bruk {0} eller flere tegn' | 'Use {0} or more characters' |
-| maxLength | 'Bruk {0} eller færre tegn' | 'Bruk {0} eller færre tegn' | 'Use {0} or fewer characters' |
-| length | 'Antall tillatte tegn er {0}' | 'Antall tillatte tegn er {0}' | 'Number of characters allowed is {0}' |
-| pattern | 'Feil format eller verdi' | 'Feil format eller verdi' | 'Wrong format or value' |
-| required | 'Du må fylle ut {0}' | 'Du må fylle ut {0}' | 'You have to fill out {0}' |
-| enum | 'Kun verdiene {0} er tillatt' | 'Kun verdiene {0} er tillatt' | 'Only the values {0} are permitted' |
-
-### More about error messages for required fields
-For a smoother user experience, error messages for missing data in required fields won't be displayed automatically
-while filling out a form, unless validation is triggered [for a single field](#single-field-validation), when saving
-a [row in a repeating group](#group-validation) or
-[when navigating to another page](/app/development/ux/pages/navigation/#validation-on-page-navigation).
-
-The error message for required fields is as defined above, _"You have to fill out {0}"_. The `{0}` symbol is replaced with the field that
-the error message is shown for. This is done in the following way:
-- If `shortName` text is defined for the component, this is used. _This is a new text that is currently used only for this specific error message._
-- If the `shortName` text is not defined, the `title` text for the component is used - this is the components label text. The text will be converted to use a lowercase letter first, unless the text looks like an acronym.
-- In some special cases (Address component) where there are multiple fields within the component, the default labels for the fields is used.
-
-#### Example: Component with only `title`
-```json
-{
- "id": "firstName",
- "type": "Input",
- "textResourceBindings": {
- "title": "text-firstName"
- },
- ... //etc
-}
-```
-With resource texts:
-
-```json
-...
-{
- "id": "text-firstName",
- "value": "First name"
-}
-```
-
-The error message would then be `"You have to fill out First name"`.
-
-#### Example: Component with `shortName`
-If the field's prompt is long or not suitable for use in the validation message, you can add a `shortName` text that can be used instead.
-_Note that this only applies to this specific validation message - the `shortName` text is not used otherwise in the solution as of now._
-```json
-{
- "id": "firstName",
- "type": "Input",
- "textResourceBindings": {
- "title": "text-firstName",
- "shortName": "firstName-short",
- },
- ... //etc
-}
-```
-With resource texts:
-
-```json
-...
-{
- "id": "text-firstName",
- "value": "Please type your first name in the field below:"
-},
-{
- "id": "firstName-short",
- "value": "your first name"
-}
-```
-
-The error message would then be `"You have to fill out your first name"`.
-
-### Replacing the required validation message completely
-
-If you want to replace the default error message for required fields completely, you can do this by adding the text key
-`requiredValidation` to the components `textResourceBindings` object. This will replace the default error message for
-required fields. The text can be a text key for a [text defined in the resource files](../../ux/texts) for multilingual
-support.
-
-```json
-{
- "id": "firstName",
- "type": "Input",
- "textResourceBindings": {
- "title": "text-firstName",
- "requiredValidation": "myCustomRequiredValidation"
- },
- ...
-}
-```
-
-### Custom error messages
-It is possible to define custom error messages that will be displayed when a field doesn't pass the validation check. This is done by including a parameter `errorMessage` where the field is defined in the JSON schema.
-The JSON schema file is in the folder `App/models` and has a naming patterns as follows; `*.schema.json`,
-
-An example of how to extend the example previously presented with a custom error message:
-
-```json {hl_lines=[4]}
-"someField": {
- "type": "string",
- "maxLength": "4",
- "errorMessage": "myCustomError"
-}
-```
-
-The error text can be included directly. To enable language support, add a text key for a [text defined in the resource files](../../ux/texts).
-
-Notice that if you have a reference to a definition the error message must be added to the `property`-field and not the reference/definition.
-Example:
-```json {hl_lines=[5]}
-{
- "properties": {
- "person": {
- "$ref" : "#/definitions/personDefinition",
- "errorMessage": "myCustomError",
- }
- },
- "definitions": {
- "personDefinition" : {
- "age": {
- "type": "number"
- },
- ...
- }
-}
-```
-
-{{% notice warning %}}
-Note that when the XSD is changed, the custom error messages will de removed from the JSON schema.
-In the future, there will be support for setting custom error messages in the data modelling tool in Altinn Studio. But for now, this is a manual job.
-{{% /notice %}}
-
-## Server-side validation
-
-Server-side validation can be split into two categories:
-
-- **Validations against data model** - These run automatically whenever the user attempts to submit form data.
-- **Custom validations** - these are written by the application developer,
-and run when the user attempts to submit form data or move the process to a new step.
-
-## How to add custom validation
-Custom validation can also be split into two categories; task-validation and data-validation.
-- Task-validation will run each time validation is triggered either manually from the application or when you attempt to move forward in the process.
-- Data-validation will run if you're on a step that has defined data elements associated with it.
-
-Validations are written i C# and depending on the version of the application template and Nuget packages you are using,
-the way the implementation is done varies slightly. In the earlier versions it's a pre-created file where you put your
-logic, while from version 7 and onwards you implement an interface in whatever class you like. The interface happens to
-be equal to the pre-defined class in the earlier versions. The examples below which referrers to the methods to add your
-validation logic to is the same.
-
-{{}}
-
-{{}}
-In version 7 the way to do custom code instantiation has changed. We now use an dependency injection based approach
-instead of overriding methods. If you previously used to place your custom code in the _ValidateData_ and _ValidateTask_
-methods in the _ValidationHandler.cs_ class you will see that it's mostly the same.
-
-1. Create a class that implements the `IInstanceValidator` interface found in the `Altinn.App.Core.Features.Validation` namespace.
- You can name and place the file in any folder you like within your project, but we suggest you use meaningful namespaces like in any other .Net project.
-2. Register you custom implementation in the _Program.cs_ class
- ```C#
- services.AddTransient();
- ```
- This ensures your custom code is known to the application and that it will be executed.
-
-{{}}
-
-{{}}
-Validations should be added to the `ValidationHandler.cs`-file in the application template.
-The file can be accessed and edited in Altinn Studio through the logic menu, by selecting _Rediger valideringer_,
-or directly in the application repo where the file is under the `logic/Validation`-folder.
-
-{{}}
-
-{{}}
-
-From here on the examples should be valid for all versions:)
-
-Custom logic are added to the `ValidateData` and `ValidateTask`-methods.
-The former takes in a data object and the latter takes in the instance and taskId.
-To add a validation error, the `AddModelError`-method of the `validationResult`-object, which is a parameter in both methods, is used.
-
-An example of a simple data validation that tests that the field _FirstName_ does not contain the value _1337_, when the root element of the model is `Skjema` is shown below:
-
-```C# {hl_lines=[12]}
-public void ValidateData(object data, ModelStateDictionary validationResults)
-{
- if (data.GetType() == typeof(Skjema))
- {
- // Cast instance data to model type
- Skjema model = (Skjema)data;
-
- // Get value to test - FirstName
- string firstName = Skjema?.Person?.FirstName;
-
- // Check if FirstName exists, and contains the value "1337"
- if (firstName != null && firstName.Contains("1337"))
- {
- // Add validation error, with error message and list
- // of affected fields (in this case Person.FirstName)
- validationResults.AddModelError(
- "Person.FirstName",
- "Error: First name cannot contain the value '1337'."
- );
- }
- }
-}
-```
-
-See comments in code above for an explanation of what the different parts do.
-
-In the other parameter of the method `AddModelError`, where it says "_Error: First name cannot contain the value '
-1337'_", you can use a text key for a [text defined in the resource files](../../ux/texts) for multilingual support.
-
-An example of a simple task validation that checks how long the user spent on Task_1 and returns an error if there has gone more than three days:
-
-```C# {hl_lines=["5-6"]}
-public async Task ValidateTask(Instance instance, string taskId, ModelStateDictionary validationResults)
-{
- if (taskId.Equals("Task_1"))
- {
- DateTime deadline = ((DateTime)instance.Created).AddDays(3);
- if (DateTime.UtcNow < deadline)
- {
- validationResults.AddModelError("Task_1", $"Completion of Task_1 has taken too long. Please start over.");
- }
- }
-}
-```
-
-## Single field validation
-
-Single field validations are shown immediately when the user fills out a field.
-
-{{}}
-{{}}
-
-Setting the `showValidations` property on a component will cause validations to become visible immediately when they occur.
-
-```json {hl_lines=[6]}
-{
- "id": "some-input-field",
- "type": "Input",
- "textResourceBindings": {...},
- "dataModelBindings": {...},
- "showValidations": ["AllExceptRequired"]
-}
-```
-
-Where `showValidations` contains a set of validation types to check; this can be one or more of:
-
-- `Schema`
-- `Component`
-- `Expression`
-- `CustomBackend`
-- `Required`
-- `AllExceptRequired`
-- `All`
-
-**Note**: `"showValidations": ["AllExceptRequired"]` is the default value if the property is not set.
-To avoid showing any validations immediately, set `showValidations` to an empty array `[]`.
-{{}}
-{{}}
-
-{{%notice warning%}}
-**NOTE**: Trigger for validation on single fields in Stateless apps is not currently supported.
-{{%/notice%}}
-
-Note that in version 3 of app frontend, JSON schema and component specific validation is run automatically by default, adding the validation trigger causes custom backend validation to be run as well.
-
-```json {hl_lines=[6]}
-{
- "id": "some-input-field",
- "type": "Input",
- "textResourceBindings": {...},
- "dataModelBindings": {...},
- "triggers": ["validation"]
-}
-```
-
-The configuration above will result in your own custom validation in `ValidationHandler.cs`
-being triggered each time the field is updated. If you need to know which field
-triggered the validation, this is available in the http-context as a header of the request named _ValidationTriggerField_.
-
-An example of a custom validation where the header value is retrieved is shown below.
-
-```csharp
- public async Task ValidateData(object data, ModelStateDictionary validationResults)
- {
- _httpContextAccessor.HttpContext
- .Request.Headers
- .TryGetValue("ValidationTriggerField", out StringValues triggerValues);
-
- string triggerField = triggerValues.FirstOrDefault(string.Empty);
-
- if (triggerField.Equals("kommune"))
- {
- // Cast instance data to model type
- flyttemelding model = (flyttemelding)data;
-
- // Get value to test - Kommune
- string kommune = model.kommune;
-
- if (!kommune.Equals("Oslo"))
- {
- validationResults.AddModelError(triggerField, "This is not a valid municipality.");
- }
- }
-
- await Task.CompletedTask;
- }
-```
-
-**NOTE** validation of single fields should be implemented in a way where it is both run on triggers and during general validation.
-The example that revolves multiple complex validations show how this can be implemented.
-
-Several things has been done to get this code to run
-
-1. In _ValidationHandler.cs_ `using Microsoft.Extensions.Primitives;` is included at the top of the file to be able to use `StringValues`.
-2. In _App.cs_ `using Microsoft.AspNetCore.Http;` is included at the top of the file to be able to use `IHttpContextAccessor`.
-3. In _App.cs_ `IHttpContextAccessor` is dependency injected in the constructor and passed along to ValidationHandler.
-
-```cs {hl_lines=[10, 14]}
-public App(
- IAppResources appResourcesService,
- ILogger logger,
- IData dataService,
- IProcess processService,
- IPDF pdfService,
- IProfile profileService,
- IRegister registerService,
- IPrefill prefillService,
- IHttpContextAccessor httpContextAccessor // <--- Add this line
- ) : base(appResourcesService, logger, dataService, processService, pdfService, prefillService)
- {
- _logger = logger;
- _validationHandler = new ValidationHandler(httpContextAccessor); // <--- Include the new property here
- _calculationHandler = new CalculationHandler();
- _instantiationHandler = new InstantiationHandler(profileService, registerService);
- }
-```
-
-If there are multiple complex validations that are time consuming, it is recommended to implement several private methods
-to validate these and use ValidationTriggerField to determine which private method is to be run.
-You can e.g. use a _switch statement_ to accomplish this.
-
-```cs
-public async Task ValidateData(object data, ModelStateDictionary validationResults)
-{
- if (data is flyttemelding model)
- {
- _httpContextAccessor.HttpContext
- .Request.Headers
- .TryGetValue("ValidationTriggerField", out StringValues triggerValues);
-
- string triggerField = triggerValues.FirstOrDefault(string.Empty);
-
- switch (triggerField)
- {
- case "kommune":
- ValidateKommune(model, validationResults);
- break;
- case "boaddresse":
- ValidateBoAdresse(model, validationResults);
- break;
- default:
- ValidateKommune(model, validationResults);
- ValidateBoAdresse(model, validationResults);
- break;
- }
- }
-}
-
-private void ValidateKommune(flyttemelding model, ModelStateDictionary validationResults)
-{
- if (model.kommune != null && !model.kommune.Equals("Oslo"))
- {
- validationResults.AddModelError(
- nameof(model.kommune),
- "This is not a valid municipality.");
- }
-}
-private void ValidateBoAdresse(flyttemelding model, ModelStateDictionary validationResults)
-{
- if (model.boaddresse != null && model.boaddresse.Length > 150)
- {
- validationResults.AddModelError(
- nameof(model.boaddresse),
- "Address can not be longer than 150 characters.");
- }
-}
-```
-
-### Specify that validation errors are fixed
-When validation is triggered by a single field, all former validations on this field will be removed pending a response from the last validation.
-If a field triggers validation that updates/adds an error message to multiple fields at once, these will not be removed even when there no longer are any
-errors in these fields. This is because there is no way to know which fields may have been validated through a single field validation.
-
-For example, if you have two fields; first name and last name. Both fields trigger single field validation, and if both fields have a value, you can validate that
-the full name can not be longer than 50 characters. An error message is then set on both fields. If you correct this by changing the first name, the error message from first name will
-disappear, but the error message on the last name field will still be displayed even though the validation does not set any error messages on the fields.
-
-```C#
-private void ValidateFullName(Datamodell model, ModelStateDictionary validationResults)
-{
- if (!string.isNullOrEmpty(model.fornavn) && !string.isNullOrEmpty(model.etternavn)
- && model.fornavn.Length + model.etternavn.Length > 50)
- {
- validationResults.addModelError(nameof(model.fornavn),
- "Full name can not be longer than 50 characters.");
- validationResults.addModelError(nameof(model.etternavn),
- "Full name can not be longer than 50 characters.");
- }
-}
-```
-
-To be able to remove old error messages in a case like this, there has been added support to be able to specify that a validation error has been **fixed**.
-Then, the field in question will be able to be notified that a specific error message that it is displaying has been fixed and can now be hidden.
-
-This is done by adding a validation error in the code in the case where there are no errors in the validation,
-and set `*FIXED*` in front of the error message itself. This corresponds to the setup for [soft validation](#soft-validations).
-This prefix causes the error message that is set to be removed from the field in question, or ignored (if there is no error message on the field already).
-
-You can now expand the example above to support this:
-
-```C# {hl_lines=[14,16]}
-private void ValidateFullName(Datamodell model, ModelStateDictionary validationResults)
-{
- if (!string.isNullOrEmpty(model.fornavn) && !string.isNullOrEmpty(model.etternavn)
- && model.fornavn.Length + model.etternavn.Length > 50)
- {
- validationResults.addModelError(nameof(model.fornavn),
- "Full name can not be longer than 50 characters.");
- validationResults.addModelError(nameof(model.etternavn),
- "Full name can not be longer than 50 characters.");
- }
- else
- {
- validationResults.addModelError(nameof(model.fornavn),
- "*FIXED*Full name can not be longer than 50 characters.");
- validationResults.addModelError(nameof(model.etternavn),
- "*FIXED*Full name can not be longer than 50 characters.");
- }
-}
-```
-
-If you are having trouble with getting this to work, and you are instead seeing validation messages that include the `*FIXED*`-prefix,
-double check that you have `"FixedValidationPrefix": "*FIXED*"` set under `GeneralSettings` in `appsettings.json`.
-{{}}
-{{}}
-
-
-## Soft validations
-
-Soft validations are validation messages that does not stop the user from submitting or move onto the next step of the process, but that are used to give the user different forms of information.
-These types of validations can for example be used to ask the user to verify input that seems wrong or strange, but which strictly speaking is not invalid, or give useful information for further filling out the form.
-
-Messages based on soft validation will be displayed once, but the user can choose to move on without making any changes.
-
-Soft validations are added from the server-side the application logic, in the same way as regular validation errors. The difference is that the validation message
-must be prefixed with the type of validation you want to give, e.g. `*WARNING*`. This will be interpreted as a soft validation. The prefix `*WARNING*` will not be displayed for the user.
-
-The different types of soft validations are `WARNING`, `INFO` and `SUCCESS`.
-
-**Code example**
-
-```csharp
-public async Task ValidateData(object data, ModelStateDictionary modelState)
-{
- if (data is TestModel testModel)
- {
- string firstName = testModel?.Person?.FirstName;
- if (firstName != null && firstName.Contains("1337"))
- {
- validationResults.AddModelError(
- "Person.FirstName",
- "*WARNING*Are you sure your first name contains 1337?");
- }
-
- if (firstName != null && firstname.Contains("Altinn"))
- {
- validationResults.AddModelError(
- "Person.FirstName",
- "*SUCCESS*Altinn is a great name!");
- }
- }
-
- await Task.CompletedTask;
-}
-```
-
-Examples on display of different validations below:
-
-!["Information message"](info-message.jpeg "Example of a information message (*INFO* - prefix)")
-
-!["Success message"](success-message.jpeg "Example of a success message (*SUCCESS* - prefix)")
-
-!["Warning message"](warning-message.jpeg "Example of a warning message (*WARNING* - prefix)")
-
-## Group validation
-
-It is possible to check validations in a repeating group when the user saves a row in the group. If there are validations errors in the row, the user is prevented from closing that row until the errors are fixed.
-
-{{}}
-{{}}
-```json {hl_lines=[7]}
-{
- "id": "demo-gruppe",
- "type": "Group",
- "children": [...],
- "maxCount": 9,
- "dataModelBindings": {...},
- "validateOnSaveRow": ["All"],
-}
-```
-
-Where `validateOnSaveRow` contains a set of validation types to check; this can be one or more of:
-
-- `Schema`
-- `Component`
-- `Expression`
-- `CustomBackend`
-- `Required`
-- `AllExceptRequired`
-- `All`
-{{}}
-{{}}
-```json {hl_lines=[7]}
-{
- "id": "demo-gruppe",
- "type": "Group",
- "children": [...],
- "maxCount": 9,
- "dataModelBindings": {...},
- "triggers": ["validateRow"]
-}
-```
-
-If you add validation trigger on the group component, a call will be made towards the validation back-end with a header specifying which component triggered the validation: `ComponentId`.
-Additionally, the row index of the row being saved is available in the header `RowIndex`. If the group is a nested group, a comma separated list of row indices is returned, otherwise it is a single number.
-Validations are written in C# in the `ValidationHandler.cs`-file in the application template. In the validation, you can retrieve component id and tailor possible validations to run in the back-end, example:
-
-```cs
-public async Task ValidateData(object data, ModelStateDictionary validationResults)
-{
- if (data is flyttemelding model)
- {
- _httpContextAccessor.HttpContext
- .Request.Headers
- .TryGetValue("ComponentId", out StringValues compIdValues);
-
- _httpContextAccessor.HttpContext
- .Request.Headers
- .TryGetValue("RowIndex", out StringValues rowIndexValues);
-
- string componentId = compIdValues.FirstOrDefault(string.Empty);
-
- switch (componentId)
- {
- case "top-level-group":
- // run validations specific to the group
-
- // Get row index for a non-nested group
- int rowIndex = int.Parse(rowIndexValues.FirstOrDefault(string.Empty));
-
- break;
- case "nested-group":
- // Get all row indices for a nested group
- int[] rowIndices = rowIndexValues
- .FirstOrDefault(string.Empty)
- .Split(",", StringSplitOptions.RemoveEmptyEntries)
- .Select(s => int.Parse(s))
- .ToArray();
-
- break;
- default:
- // run the validations in their entirety
- break;
- }
- }
-}
-```
-{{}}
-{{}}
-
-
-For tips on how you solve complex validations, see the examples under [single field validation](#single-field-validation).
diff --git a/content/app/development/logic/validation/_index.nb.md b/content/app/development/logic/validation/_index.nb.md
deleted file mode 100644
index f3ed7546396..00000000000
--- a/content/app/development/logic/validation/_index.nb.md
+++ /dev/null
@@ -1,629 +0,0 @@
----
-title: Validering
-description: Hvordan legge til logikk for å validere skjemadata?
-toc: true
----
-
-## Introduksjon
-
-Valideringer sørger for at brukerens input er gyldig med tanke på datamodellen,
-i tillegg til alle egendefinerte regler som settes opp for applikasjonen.
-Valideringer kan kjøres enten på klient (dvs. browseren) eller serversiden.
-
-Man kan også sette opp validering til å [kjøre ved sidebytte](/nb/app/development/ux/pages/navigation/#validering-ved-sidebytte).
-
-## Klientside-validering
-
-Dette er validering som kjøres i browseren, FØR data er sendt til server for lagring. Dette gjør det mulig å gi raske tilbakemeldinger til
-sluttbruker underveis i utfylling.
-
-Klientside-validering baserer seg på datamodellen som hører til skjemaet, og bruker denne til å bestemme hva som er gyldig input i et felt.
-Helt konkret brukes JSON Schema utgaven av datamodellen for valideringen. Denne genereres automatisk når man laster opp XSD.
-Det går an å gjøre endringer i JSON schema direkte for å tilpasse valideringen ved behov.
-
-**Merk at dersom man gjør tilpasninger i JSON schema manuelt, for å så oppdatere XSD og laste inn på nytt, vil nytt
-JSON schema også genereres, og alle manuelle tilpasninger må gjøres på nytt. Derfor er det anbefalt å gjøre endringer i XSD og/eller datamodelleringsverktøyet
-for at disse endringene skal reflekteres i JSON schema.**
-
-Et eksempel på hvordan et felt kan defineres i JSON schema datamodellen er:
-
-```json
-"someField": {
- "type": "string",
- "maxLength": "4"
-}
-```
-
-Input i dette feltet vil valideres mot begrensningene som er satt opp, og en feilmelding vil vises dersom disse ikke møtes - i dette tilfellet, dersom
-input er en tekst med lengde mer enn 4 karakterer.
-
-### Standard feilmeldinger
-Det er satt opp standard feilmeldinger for alle valideringene som gjøres på klientsiden. Se oversikten under.
-
-| Regel | Feilmelding bokmål | Feilmelding nynorsk | Feilmelding engelsk |
-| --------- | ----------------------------- | ----------------------------- | ------------------------------------- |
-| minimum | 'Minste gyldig verdi er {0}' | 'Minste gyldig verdi er {0}' | 'Minimum valid value is {0}' |
-| maximum | 'Største gyldig verdi er {0}' | 'Største gyldig verdi er {0}' | 'Maximum valid value is {0}' |
-| minLength | 'Bruk {0} eller flere tegn' | 'Bruk {0} eller flere tegn' | 'Use {0} or more characters' |
-| maxLength | 'Bruk {0} eller færre tegn' | 'Bruk {0} eller færre tegn' | 'Use {0} or fewer characters' |
-| length | 'Antall tillatte tegn er {0}' | 'Antall tillatte tegn er {0}' | 'Number of characters allowed is {0}' |
-| pattern | 'Feil format eller verdi' | 'Feil format eller verdi' | 'Wrong format or value' |
-| required | 'Du må fylle ut {0}' | 'Du må fylle ut {0}' | 'You have to fill out {0}' |
-| enum | 'Kun verdiene {0} er tillatt' | 'Kun verdiene {0} er tillatt' | 'Only the values {0} are permitted' |
-
-### Spesielt om standard feilmelding for påkrevde felter
-For en smidigere brukeropplevelse vises ikke feilmeldinger for manglende utfylling av påkrevde felter under
-utfylling av et skjema, med mindre validering trigges [på et enkeltfelt](#enkeltfeltvalidering), ved lagring
-av [en rad i en repeterende gruppe](#gruppevalidering) eller
-[ved navigering til en annen side](/nb/app/development/ux/pages/navigation/#validering-ved-sidebytte).
-
-Feilmeldingen for påkrevde felter er _"Du må fylle ut {0}"_. Her blir `{0}` erstattet med det feltet som feilmeldingen gjelder for.
-Dette gjøres på følgende måte:
-- Bruker feltets `shortName` tekst. Dette er en ny tekst som kan settes opp pr. komponent på samme måte som ledetekst (`title`) settes i dag. _Denne teksten brukes pr nå KUN i forbindelse med feilmeldingen for påkrevde felter._
-- Om `shortName` ikke er definert brukes feltets `title` tekst (det som er definert som ledetekst for feltet), og teksten vil bli forsøkt gjort om til en tekst med liten forbokstav (med mindre teksten ser ut som en forkortelse).
-- I noen spesialtilfeller (Adresse-komponenten) der det er flere felter i ett brukes de standard-tekstene som er definert for feltene i komponenten.
-
-#### Eksempel: Felt med kun `title`
-```json
-{
- "id": "fornavn",
- "type": "Input",
- "textResourceBindings": {
- "title": "tekst-fornavn"
- },
- ... //osv
-}
-```
-Og tekster i ressurs-fil:
-
-```json
-...
-{
- "id": "tekst-fornavn",
- "value": "Fornavn"
-}
-```
-
-Da vil valideringmeldingen bli `"Du må fylle ut Fornavn"`.
-
-#### Eksempel: Felt med `shortName`
-Dersom feltets ledetekst er lang eller ikke egner seg til bruk i valideringsmeldingen, kan man legge til en `shortName` tekst som brukes i stedet.
-_Merk at dette kun gjelder for denne spesifikke valideringsmeldingen - `shortName` teksten er ikke i bruk ellers i løsningen pr nå._
-```json
-{
- "id": "fornavn",
- "type": "Input",
- "textResourceBindings": {
- "title": "tekst-fornavn",
- "shortName": "fornavn-kort"
- },
- ... //osv
-}
-```
-Og tekster i ressurs-fil:
-
-```json
-...
-{
- "id": "tekst-fornavn",
- "value": "Her kan du skrive ditt fornavn",
-},
-{
- "id": "fornavn-kort",
- "value": "fornavnet ditt",
-}
-```
-
-Da vil valideringmeldingen bli `"Du må fylle ut fornavnet ditt"`.
-
-### Erstatte feilmelding for påkrevde felter helt
-
-Hvis du ønsker å erstatte standardfeilmeldingen for obligatoriske felt fullstendig, kan du gjøre dette ved å legge til
-tekstnøkkelen `requiredValidation` i komponentens `textResourceBindings`-objekt. Dette vil erstatte standardfeilmeldingen
-for obligatoriske felt. Teksten kan være en [tekstnøkkel for en tekst som er definert i ressursfilene](../../ux/texts)
-for flerspråklig støtte.
-
-```json
-{
- "id": "firstName",
- "type": "Input",
- "textResourceBindings": {
- "title": "text-firstName",
- "requiredValidation": "myCustomRequiredValidation"
- },
- ...
-}
-```
-
-### Egendefinerte feilmeldinger
-Det er mulig å definere egne feilmeldinger som skal vises når et felt får valideringsfeil. Dette gjøres ved å legge på en parameter `errorMessage` der
-hvor feltet er definert i JSON schema. JSON schema filen ligger i mappen `App/models` og følger navnestandard `*.schema.json`.
-
-F.eks., man kan utvide eksempelet over:
-
-```json {hl_lines=[4]}
-"someField": {
- "type": "string",
- "maxLength": "4",
- "errorMessage": "myCustomError"
-}
-```
-
-Man kan skrive ønsket tekst direkte inn her, eller bruke en tekstnøkkel for en [tekst definert i ressursfilene](../../ux/texts) for språkstøtte.
-
-Legg merke til at om man har en referanse til en definisjon så må feilmeldingen ligge på `property`-feltet, og ikke på referansen/definisjonen.
-Eksempel:
-```json {hl_lines=[5]}
-{
- "properties": {
- "person": {
- "$ref" : "#/definitions/personDefinition",
- "errorMessage": "myCustomError",
- }
- },
- "definitions": {
- "personDefinition" : {
- "age": {
- "type": "number"
- },
- ...
- }
-}
-```
-
-{{% notice warning %}}
-Merk at ved XSD-endringer, så vil ev. egendefinerte feilmeldinger forsvinne da JSON schema filen genereres på nytt fra XSD. På sikt er det tenkt at
-det å sette opp egendefinerte feilmeldinger skal være mulig å gjøre via datamodelleringsverktøyet i Altinn Studio. Per nå må dette gjøres manelt.
-{{% /notice %}}
-
-## Serverside-validering
-
-Serverside-validering kan deles opp i to kategorier:
-
-- **Valideringer mot datamodell** - Disse kjører automatisk når brukeren prøver å sende inn skjemadata.
-- **Egendefinerte valideringer** - Disse skrives av applikasjonsutvikleren,
-og kjører når brukeren prøver å sende inn skjemadata eller flytte prosessen til et nytt steg.
-
-## Hvordan legge til egendefinert validering
-Egendefinerte validering kan igjen deles opp i to kategorier; task-validering og data-validering.
- - Task-validering vil kjøres hver gang validering trigges enten manuelt fra applikasjonen eller når man prøver å flytte seg framover i prosessen.
- - Data-validering vil kjøre dersom man står på et steg som har definerte dataelementer knyttet til seg.
-
-Valideringer skrives i C# og avhengig av hvilken versjon av applikasjonsmalen og Nuget pakkene du er på, så vil implementeringen variere litt. I tidligere versjon så er det en pre-definert fil med metoder du kan legge inn logikken, mens fra versjon 7 og fremover så implementerer du et grensesnitt i den klassen du selv vil. Grensesnittet er tilfeldigvis likt den pre-definerte filen. Eksemplene som refererer til metoder vil derfor være de samme for alle versjoner.
-
-{{}}
-
-
-{{}}
-I versjon 7 har vi endret måten preutfylling med egendefinert kode gjøres på. Vi benytter nå _dependency injection_ i stedet for overstyring av metoder. Hvis du tidligere plasserte koden din i _ValidationHandler og _ValidateTask_ metodene in _ValidationHandler.cs_ klassen så vil du erfare at det er mer eller mindre det samme som nå gjøres.
-1. Opprett en klasse som implementerer `IInstanceValidator` grensesnittet som ligger i `Altinn.App.Core.Features.Validation` navnerommet.
- Du kan navngi og plassere filene i den mappestrukturen du selv ønsker i prosjektet ditt. Men vi anbefaler at du benytter meningsfulle navnerom som i et hvilket som helst annet .Net prosjekt.
-2. Registrer din implementering i _Program.cs_ klassen
- ```C#
- services.AddTransient();
- ```
- Dette sørger for at din kode er kjent for applikasjonen og at koden blir kjørt når den skal.
-{{}}
-
-{{}}
-Valideringer legges til i `ValidationHandler.cs` -filen i applikasjonsmalen.
-Filen kan aksesseres og endres i Altinn Studio via logikkmenyen, ved å velge _Rediger valideringer_,
-eller direkte i applikasjonsrepoet der ligger filen i `logic/Validation`-mappen.
-{{}}
-
-{{}}
-
-Fra dette punktet og videre skal eksemplene være de samme for alle versjoner :)
-
-Endringer gjøres i `ValidateData` og `ValidateTask`-metodene.
-Førstnevnte får inn et dataobjekt og sistnevnte får inn instansen og taskId.
-For å legge til en valideringsfeil brukes `AddModelError`-metoden til `validationResults` object som sendes med i begge metodene.
-
-Et eksempel på en enkel data-validering som sjekker at feltet _FirstName_ ikke inneholder verdien _1337_, når rotelementet til modellen er `Skjema` er vist nedenfor:
-
-```C# {hl_lines=[12]}
-public void ValidateData(object data, ModelStateDictionary validationResults)
-{
- if (data.GetType() == typeof(Skjema))
- {
- // Cast instance data to model type
- Skjema model = (Skjema)data;
-
- // Get value to test - FirstName
- string firstName = Skjema?.Person?.FirstName;
-
- // Check if FirstName exists, and contains the value "1337"
- if (firstName != null && firstName.Contains("1337"))
- {
- // Add validation error, with error message and list
- // of affected fields (in this case Person.FirstName)
- validationResults.AddModelError(
- "Person.FirstName",
- "Error: First name cannot contain the value '1337'."
- );
- }
- }
-}
-```
-
-Se kommentarer i koden over for en forklaring på hva de ulike delene gjør.
-
-I det andre parameteret til metoden `AddModelError`, der det står "_Error: First name cannot contain the value '1337'_", kan man bruke en tekstnøkkel for en [tekst definert i ressursfilene](../../ux/texts) for språkstøtte.
-
-Et eksempel på en enkel task-validering som sjekker hvor lang tid brukeren har brukt på Task_1 og returnerer en feil dersom det har tatt lenger enn 3 dager.
-
-```C# {hl_lines=["5-6"]}
-public async Task ValidateTask(Instance instance, string taskId, ModelStateDictionary validationResults)
-{
- if (taskId.Equals("Task_1"))
- {
- DateTime deadline = ((DateTime)instance.Created).AddDays(3);
- if (DateTime.UtcNow < deadline)
- {
- validationResults.AddModelError("Task_1", $"Ferdigstilling av Task_1 har tatt for lang tid. Vennligst start på nytt.");
- }
- }
-}
-```
-
-## Enkeltfeltvalidering
-
-Enkeltfeltvalidering vises umiddelbart når brukeren har fylt ut et felt.
-
-{{}}
-{{}}
-
-Ved å sette `showValidations`-egenskapen på en komponent vil valideringsfeil gjøres synlig umiddelbart når de oppstår.
-
-```json {hl_lines=[6]}
-{
- "id": "some-input-field",
- "type": "Input",
- "textResourceBindings": {...},
- "dataModelBindings": {...},
- "showValidations": ["AllExceptRequired"]
-}
-```
-
-Hvor `showValidations` inneholder et sett med validerings-typer som skal sjekkes; dette kan være én eller flere av:
-
-- `Schema`
-- `Component`
-- `Expression`
-- `CustomBackend`
-- `Required`
-- `AllExceptRequired`
-- `All`
-
-**NB**: `"showValidations": ["AllExceptRequired"]` brukes som standard dersom egenskapen ikke er satt.
-For å unngå å vise noen valideringer umiddelbart kan `showValidations` settes til en tom liste `[]`.
-{{}}
-{{}}
-
-{{%notice warning%}}
-**MERK**: Det er foreløpig ikke støtte for å sette opp trigger for validering av enkeltfelter for Stateless apps.
-{{%/notice%}}
-
-Merk at i versjon 3 av app frontend, kjøres JSON schema og komponent-spesifikk validering automatisk som standard, å legge til en validerings-trigger fører til at custom backend validering kjøres i tillegg.
-
-```json {hl_lines=[6]}
-{
- "id": "some-input-field",
- "type": "Input",
- "textResourceBindings": {...},
- "dataModelBindings": {...},
- "triggers": ["validation"]
-}
-```
-
-Konfigurasjonen overfor vil resultere i at din egendefinerte validering i `ValidationHandler.cs`
-vil trigges hver gang feltet oppdaterer seg. Dersom du har behov for å vite hvilket
-felt som trigget valideringen er denne tilgjengelig i http-konteksten som en header på requesten ved navn _ValidationTriggerField_.
-
-Et eksempel på en egendefinert validering der headerverdien hentes ut er vist nedenfor.
-
-```csharp
- public async Task ValidateData(object data, ModelStateDictionary validationResults)
- {
- _httpContextAccessor.HttpContext
- .Request.Headers
- .TryGetValue("ValidationTriggerField", out StringValues triggerValues);
-
- string triggerField = triggerValues.FirstOrDefault(string.Empty);
-
- if (triggerField.Equals("kommune"))
- {
- // Cast instance data to model type
- flyttemelding model = (flyttemelding)data;
-
- // Get value to test - Kommune
- string kommune = model.kommune;
-
- if (!kommune.Equals("Oslo"))
- {
- validationResults.AddModelError(triggerField, "Dette er ikke en gyldig kommune.");
- }
- }
-
- await Task.CompletedTask;
- }
-```
-
-**OBS** Merk at validering av enkeltfelter bør implementeres slik at det kjører både på trigger og under generell validering.
-Eksempelet som omhandler flere komplekse valideringer viser hvordan dette kan implementeres.
-
-Det er gjort flere ting for å få denne kodesnutten til å kjøre
-
-1. I _ValidationHandler.cs_ inkluderes `using Microsoft.Extensions.Primitives;` øverst i filen for å kunne ta i bruk `StringValues`.
-2. I _App.cs_ inkluderes `using Microsoft.AspNetCore.Http;` øverst i filen for å kunne ta i bruk `IHttpContextAccessor`.
-3. I _App.cs_ dependency injectes `IHttpContextAccessor` i konstruktøren og sendes med videre til ValidationHandler.
-
-```cs {hl_lines=[10, 14]}
-public App(
- IAppResources appResourcesService,
- ILogger logger,
- IData dataService,
- IProcess processService,
- IPDF pdfService,
- IProfile profileService,
- IRegister registerService,
- IPrefill prefillService,
- IHttpContextAccessor httpContextAccessor // <--- Add this line
- ) : base(appResourcesService, logger, dataService, processService, pdfService, prefillService)
- {
- _logger = logger;
- _validationHandler = new ValidationHandler(httpContextAccessor); // <--- Include the new property here
- _calculationHandler = new CalculationHandler();
- _instantiationHandler = new InstantiationHandler(profileService, registerService);
- }
-```
-
-Dersom man har flere komplekse valideringer som er tidkrevende er det anbefalt å implementere flere private metoder
-for validering av disse og bruke ValidationTriggerField til å avgjøre hvilken private metode som skal kjøres.
-Man kan bl.a. bruke en _switch statement_ for å oppnå dette.
-
-```cs
-public async Task ValidateData(object data, ModelStateDictionary validationResults)
-{
- if (data is flyttemelding model)
- {
- _httpContextAccessor.HttpContext
- .Request.Headers
- .TryGetValue("ValidationTriggerField", out StringValues triggerValues);
-
- string triggerField = triggerValues.FirstOrDefault(string.Empty);
-
- switch (triggerField)
- {
- case "kommune":
- ValidateKommune(model, validationResults);
- break;
- case "boaddresse":
- ValidateBoAdresse(model, validationResults);
- break;
- default:
- ValidateKommune(model, validationResults);
- ValidateBoAdresse(model, validationResults);
- break;
- }
- }
-}
-
-private void ValidateKommune(flyttemelding model, ModelStateDictionary validationResults)
-{
- if (model.kommune != null && !model.kommune.Equals("Oslo"))
- {
- validationResults.AddModelError(
- nameof(model.kommune),
- "Dette er ikke en gyldig kommune.");
- }
-}
-private void ValidateBoAdresse(flyttemelding model, ModelStateDictionary validationResults)
-{
- if (model.boaddresse != null && model.boaddresse.Length > 150)
- {
- validationResults.AddModelError(
- nameof(model.boaddresse),
- "Boadresse kan ikke være lengere enn 150 tegn.");
- }
-}
-```
-
-### Spesifisere at valideringsfeil er fikset
-Når validering trigges av et enkelt felt, så vil alle tidligere valideringer på dette feltet fjernes i påvente av svar fra den siste valideringen.
-Dersom et felt trigger validering som oppdaterer/legger til feilmelding på flere felter på en gang, vil ikke disse fjernes selv om det ikke lenger er noen
-feil i disse feltene. Dette er fordi man ikke har noen måte å vite hvilke felter som ev. er validert ifm en enkeltfeltvalidering.
-
-F.eks., dersom man har 2 felter: fornavn og etternavn. Begge felter trigger enkeltfeltvalidering, og dersom begge feltene har verdi så validerer man at fullt navn ikke
-kan være lengre enn 50 tegn. Feilmelding settes da på begge feltene. Dersom man retter opp i dette ved å endre fornavn, vil feilmeldingen fra fornavn-feltet forsvinne,
-men feilmeldingen som vises på etternavn-feltet vises fortsatt selv om valideringen ikke setter noen feilmeldinger på feltene.
-
-```C#
-private void ValidateFullName(Datamodell model, ModelStateDictionary validationResults)
-{
- if (!string.isNullOrEmpty(model.fornavn) && !string.isNullOrEmpty(model.etternavn)
- && model.fornavn.Length + model.etternavn.Length > 50)
- {
- validationResults.addModelError(nameof(model.fornavn),
- "Fullt navn kan ikke være lengre enn 50 tegn.");
- validationResults.addModelError(nameof(model.etternavn),
- "Fullt navn kan ikke være lengre enn 50 tegn.");
- }
-}
-```
-
-For å kunne fjerne gamle feilmeldinger i et sånt tilfelle, er det lagt til støtte for å kunne spesifisere at en valideringsfeil er **fikset**. Da
-vil det aktuelle feltet kunne få beskjed om at en spesifikk feilmelding som den viser frem er fikset og skal skjules.
-
-Dette gjøres ved å legge til en valideringsfeil i koden i det tilfellet der det ikke er noen feil i valideringen,
-og sette `*FIXED*` foran selve feilmeldingen. Dette tilsvarer oppsettet for [myk validering](#myke-valideringer).
-Denne prefixen gjør at feilmeldingen som settes fjernes fra det aktuelle feltet, eller ignoreres (dersom det ikke er noen feilmelding på feltet fra før).
-
-Man kan da utvide eksempelet over for å støtte dette:
-
-```C# {hl_lines=[14,16]}
-private void ValidateFullName(Datamodell model, ModelStateDictionary validationResults)
-{
- if (!string.isNullOrEmpty(model.fornavn) && !string.isNullOrEmpty(model.etternavn)
- && model.fornavn.Length + model.etternavn.Length > 50)
- {
- validationResults.addModelError(nameof(model.fornavn),
- "Fullt navn kan ikke være lengre enn 50 tegn.");
- validationResults.addModelError(nameof(model.etternavn),
- "Fullt navn kan ikke være lengre enn 50 tegn.");
- }
- else
- {
- validationResults.addModelError(nameof(model.fornavn),
- "*FIXED*Fullt navn kan ikke være lengre enn 50 tegn.");
- validationResults.addModelError(nameof(model.etternavn),
- "*FIXED*Fullt navn kan ikke være lengre enn 50 tegn.");
- }
-}
-```
-
-Dersom du har problemer med å få dette til å fungere, og du ser valideringsmeldinger med `*FIXED*` foran meldingen istedenfor at meldingen forsvinner,
-bør du dobbeltsjekke at du har `"FixedValidationPrefix": "*FIXED*"` satt under `GeneralSettings` i `appsettings.json`.
-{{}}
-{{}}
-
-
-## Myke valideringer
-
-Myke valideringer er valideringsmeldinger som ikke stopper bruker fra å sende inn eller gå videre til neste steg i prosessen, men som benyttes til å gi brukeren ulike former for informasjon.
-Denne typen valideringer kan f.eks. brukes til å be brukeren om å verifisere input som virker feil eller rart, men som strengt tatt ikke er ugyldig, eller gi nyttig informasjon for videre utfylling.
-
-Meldinger basert på myke validering vil vises en gang, men bruker kan velge å klikke seg videre uten å utføre endringer.
-
-Myke valideringer legges til fra server-siden i validerings-logikken, på samme måte som vanlige validerings-feil. Forskjellen er at valideringsmeldingen
-må prefixes med typen validering man ønker å gi, f.eks `*WARNING*`. Dette vil da tolkes som en myk validering. Prefixen `*WARNING*` blir ikke synlig for sluttbruker.
-
-De tilgjengelige typene myke valideringer er `WARNING`, `INFO` og `SUCCESS`.
-
-**Kodeeksempel**
-
-```csharp
-public async Task ValidateData(object data, ModelStateDictionary modelState)
-{
- if (data is TestModel testModel)
- {
- string firstName = testModel?.Person?.FirstName;
- if (firstName != null && firstName.Contains("1337"))
- {
- validationResults.AddModelError(
- "Person.FirstName",
- "*WARNING*Are you sure your first name contains 1337?");
- }
-
- if (firstName != null && firstname.Contains("Altinn"))
- {
- validationResults.AddModelError(
- "Person.FirstName",
- "*SUCCESS*Altinn is a great name!");
- }
- }
-
- await Task.CompletedTask;
-}
-```
-
-Eksempler på visning av de ulike valieringene ser du nedenfor:
-
-!["Informasjonsmelding"](info-message.jpeg "Eksempel på informasjonsmelding (*INFO* - prefix)" )
-
-!["Suksessmelding"](success-message.jpeg "Eksempel på suksessmelding (*SUCCESS* - prefix)"))
-
-!["Informasjonsmelding"](warning-message.jpeg "Eksempel på advarselsmelding (*WARNING* - prefix)" )
-
-Det er også mulig å overstyre tittelen man ser på meldingene ved å legge til nøkklene `soft_validation.info_title`, `soft_validation.warning_title`, og `soft_validation.success_title` i tekstressursene om man ønsker å sette custom tittel.
-
-## Gruppevalidering
-
-Det er mulig å gjøre valideringer på en repeterende gruppe i det brukeren ønsker å lagre en gitt rad.
-Dersom det er valideringsfeil i raden, vil brukeren hindres fra å lukke raden til feilene er fikset.
-
-{{}}
-{{}}
-```json {hl_lines=[7]}
-{
- "id": "demo-gruppe",
- "type": "Group",
- "children": [...],
- "maxCount": 9,
- "dataModelBindings": {...},
- "validateOnSaveRow": ["All"],
-}
-```
-
-Hvor `validateOnSaveRow` inneholder et sett med validerings-typer som skal sjekkes; dette kan være én eller flere av:
-
-- `Schema`
-- `Component`
-- `Expression`
-- `CustomBackend`
-- `Required`
-- `AllExceptRequired`
-- `All`
-{{}}
-{{}}
-```json {hl_lines=[7]}
-{
- "id": "demo-gruppe",
- "type": "Group",
- "children": [...],
- "maxCount": 9,
- "dataModelBindings": {...},
- "triggers": ["validateRow"]
-}
-```
-
-Om man legger til validering på gruppe-komponenten så vil det også gå et kall mot valideringen backend med en header som spesifiserer hvilken komponent som trigget valideringen: `ComponentId`.
-I tillegg er rad-indeksen for raden som blir lagret tilgjengelig i headeren `RowIndex`. Dersom gruppen er en nøstet gruppe, er verdien en komma-separert liste med indekser, ellers er indeksen ett enkelt tall.
-Valideringer er skrevet i C#, i `ValidationHandler.cs`-filen i applikasjonsmalen. I valideringen kan man så hente ut komponent-id'en og skreddersy eventuelle valideringer som skal gjøres backend, eksempel:
-
-```cs
-public async Task ValidateData(object data, ModelStateDictionary validationResults)
-{
- if (data is flyttemelding model)
- {
- _httpContextAccessor.HttpContext
- .Request.Headers
- .TryGetValue("ComponentId", out StringValues compIdValues);
-
- _httpContextAccessor.HttpContext
- .Request.Headers
- .TryGetValue("RowIndex", out StringValues rowIndexValues);
-
- string componentId = compIdValues.FirstOrDefault(string.Empty);
-
- switch (componentId)
- {
- case "top-level-group":
- // kjør valideringer spesifikke til gruppen
-
- // Hent rad-indeksen for en ikke-nøstet gruppe
- int rowIndex = int
- .Parse(rowIndexValues.FirstOrDefault(string.Empty));
-
- break;
- case "nested-group":
- // Hent alle rad-indekser for en nøstet gruppe
- int[] rowIndices = rowIndexValues
- .FirstOrDefault(string.Empty)
- .Split(",", StringSplitOptions.RemoveEmptyEntries)
- .Select(s => int.Parse(s))
- .ToArray();
-
- break;
- default:
- // kjør valideringene i sin helhet
- break;
- }
- }
-}
-```
-{{}}
-{{}}
-
-
-For tips til hvordan man løser komplekse valideringer se ekemplene under [enkeltfeltvalidering](#enkeltfeltvalidering).
diff --git a/content/app/development/logic/validation/files/_index.en.md b/content/app/development/logic/validation/files/_index.en.md
deleted file mode 100644
index 0cb9fb1eb29..00000000000
--- a/content/app/development/logic/validation/files/_index.en.md
+++ /dev/null
@@ -1,152 +0,0 @@
----
-title: File validation
-description: How to do extended file validation?
-toc: false
-tags: []
-weight: 10
----
-
-{{%notice info%}}
-This functionality requires that the application uses at least [version 7.10.0](https://github.com/Altinn/app-lib-dotnet/releases/tag/v7.10.0) of the Altinn.App.Core and Altinn.App.Api NuGet packages.
-{{% /notice%}}
-
-{{%notice warning%}}
-By enabling this feature you change the response body type from string to json. You will still get the same http status code, but the body will contain an array of json objects describing the error.
-{{% /notice%}}
-
-
-## Introduction
-By default, before a file is uploaded and actually stored, only simple validation is done to ensure the file adheres to the rules set on the data type and/or upload component. These checks includes:
-* Is the file extension valid according the the configured mime types
-* The file size is below the configured limit
-* Number of files uploaded is below the configured limit
-
-Extended file validation adds extension points to analyse the uploaded files byte stream before it's stored and return an error messages to the client if something is wrong. By default a mime type checker is included that scans the file to see if it is the type it claims to be. But any custom analyser can be written to validate different types of files and different metadata. You could for example write an analyser that checks if a png file has a minimum resolution before it's accepted or that a pdf file is of a specific version.
-
-The Altinn.App.Core NuGet package only defines the interfaces required in addition to making sure the code is called. The analyser implementations are created as a separate [NuGet package](https://www.nuget.org/packages/Altinn.FileAnalyzers) that can be imported into your application. This is done to keep the core of an Altinn 3 application as small as possible and to be able to release and use new analysers without depending on having to upgrade the application (beyond v7.10.0).
-
-
-## How to configure and enable the default mimetype validation in your application
-1. **Add reference to [Altinn.FileAnalyzers nuget package](https://www.nuget.org/packages/Altinn.FileAnalyzers)**
- Open command line to the repo of your application and navigate to the App folder where the App.csproj
- file is located and run the following command:
- ```shell
- nuget install Altinn.FileAnalyzers
- ```
-2. **Register the mime type analyzer**
- ```csharp
- services.AddMimeTypeValidation();
- ```
-3. **Configure the the analyzer for the datatype it should be used for**
- The analyzer is configured on a per datatype basis and will only run against the configured datatype. The example below configures the mime type analyzer and it's corresponding validator.
- ```json
- {
- "id": "08112113-cc3a-4d35-a8d2-bfba53a1ddfd",
- "allowedContentTypes": ["image/jpeg", "application/pdf"],
- "taskId": "Task_1",
- "maxSize": 25,
- "maxCount": 1,
- "minCount": 1,
- "enablePdfCreation": false,
- "enabledFileAnalysers": [ "mimeTypeAnalyser" ],
- "enabledFileValidators": [ "mimeTypeValidator" ]
- }
- ```
-4. **Add support for json objects in data response**
- This will tell the frontend to look for json in the response in order to provide an error message to the user.
- ```json
- "FeatureManagement": {
- "JsonObjectInDataResponse": true
- }
- ```
-## How to write your own analyser
-If you would like to write your own analyser you need to implement two interfaces: `IFileAnalyser` and `IFileValidator`. The analyser analyses the file for any metadata you would like to extract and returns this in a `FileAnalysisResult` which in turn is passed into the validator implementation. The validator then only validates based on the extracted metadata. The result contains a few fixed metadata properties - filename, mimetype and the id of the analyser used to create the result. Any additional metadata is passed as key/value pairs in the Metadata property. This separation is primarily done to allow for the re-use of the analyser to extract metadata about the file for other usage.
-
-1. **Implement the `IFileAnalyser` interface**
- The interface has one property `Id` and one method `Analyse` that needs to be implemented.
- The `Id` property should be unique is used when you configure the analyser in the `applicationmetadata.json` file. This is how your implementation is resolved when the application figures out which analyser to run on a given data type.
- Example from the default implementation of the mimetype analyser:
- ```csharp
- public string Id { get; private set; } = "mimeTypeAnalyser";
- ```
- The `Analyse` method will be passed in a stream representing the file and a filename if available (normally is). The stream is already set to position 0 and can be read directly.
- Example from the default implementation of the mimetype analyser:
- ```csharp
- public async Task Analyse(Stream stream, string? filename = null)
- {
- var results = _inspector.Inspect(stream);
-
- var match = results.OrderByDescending(match => match.Points).FirstOrDefault(match => match.Percentage == 1);
-
- // You provide the id of the analyser in the result to allow to distinguish between results from different analysers.
- var fileAnalysisResult = new FileAnalysisResult(Id);
- if (match != null)
- {
- fileAnalysisResult.Extensions = match.Definition.File.Extensions.ToList();
- fileAnalysisResult.MimeType = match.Definition.File.MimeType;
- fileAnalysisResult.Filename = filename;
- fileAnalysisResult.Metadata.Add("key", "value"); //This is just provided to show how you add custom metadata.
- }
-
- return fileAnalysisResult;
- }
- ```
-2. **Implement the `IFileValidator` interface**
- Based on the analysis result you can write a validator. The validator will be tightly coupled to the metadata properties you would like to validate against, meaning you will need to know the key and type of values to expect.
- The interface has one property `Id` and one method `Validate` that needs to be implemented.
- The `Id` property should be unique is used when you configure the analyser in the `applicationmetadata.json` file. This is how your implementation is resolved when the application figures out which validator to run on a given data type.
- Example from the default implementation of the mimetype validator:
- ```csharp
- public string Id { get; private set; } = "mimeTypeValidator";
- ```
- The `Validate` method will be passed in the data type it runs for and the result from the analysis. It returns a bool indicating if the validation was successful or not, and in the case of an error a list of errors will be returned.
- ```csharp
- public async Task<(bool Success, IEnumerable Errors)> Validate(DataType dataType, IEnumerable fileAnalysisResults)
- {
- List errors = new();
-
- var fileMimeTypeResult = fileAnalysisResults.FirstOrDefault(x => x.MimeType != null);
-
- // Verify that file mime type is an allowed content-type
- if (!dataType.AllowedContentTypes.Contains(fileMimeTypeResult?.MimeType, StringComparer.InvariantCultureIgnoreCase) && !dataType.AllowedContentTypes.Contains("application/octet-stream"))
- {
- ValidationIssue error = new()
- {
- Source = "File",
- Code = ValidationIssueCodes.DataElementCodes.ContentTypeNotAllowed,
- Severity = ValidationIssueSeverity.Error,
- Description = $"The {fileMimeTypeResult?.Filename + " "}file does not appear to be of the allowed content type according to the configuration for data type {dataType.Id}. Allowed content types are {string.Join(", ", dataType.AllowedContentTypes)}",
- CustomTextKey = "My.text.resource.key"
- };
-
- errors.Add(error);
-
- return (false, errors);
- }
-
- return (true, errors);
- }
- ```
-3. **Register you implementation in the applications dependency container**
- Once you have your code in place you need to register your implementation in order for the code to be executed when uploading files.
- ```csharp
- services.AddTransient();
- services.AddTransient();
- ```
-4. **Configure your analyser and validator**
- The last part is to configure your analyser for the datatype you need it to run against. Open the _applicationmetadata.json_ file and configure the analyser and validator.
- ```json
- {
- "id": "08112113-cc3a-4d35-a8d2-bfba53a1ddfd",
- "allowedContentTypes": [
- "image/jpeg", "application/pdf"
- ],
- "taskId": "Task_1",
- "maxSize": 25,
- "maxCount": 1,
- "minCount": 1,
- "enablePdfCreation": false,
- "enabledFileAnalysers": [ "mimeTypeAnalyser" ],
- "enabledFileValidators": [ "mimeTypeValidator" ]
- }
- ```
diff --git a/content/app/development/logic/validation/files/_index.nb.md b/content/app/development/logic/validation/files/_index.nb.md
deleted file mode 100644
index 82fdc0dbe58..00000000000
--- a/content/app/development/logic/validation/files/_index.nb.md
+++ /dev/null
@@ -1,152 +0,0 @@
----
-title: Utvidet filvalidering
-description: Hvordan utføre utvidet filvalidering?
-toc: false
-tags: []
-weight: 10
----
-
-{{%notice info%}}
-Denne funksjonaliteten krever at applikasjonen bruker minst [versjon 7.10.0](https://github.com/Altinn/app-lib-dotnet/releases/tag/v7.10.0) av Altinn.App.Core og Altinn.App.Api NuGet-pakkene.
-{{% /notice%}}
-
-{{%notice warning%}}
-Ved å aktivere denne funksjonen endrer du formatet på svaret i http responsen fra streng til json. Du vil fremdeles få samme HTTP-statuskode, men kroppen vil inneholde en rekke JSON-objekter som beskriver feilen.
-{{% /notice%}}
-
-
-## Innledning
-Som standard utføres bare enkel validering av en fil før den lastes opp og lagres. Dette for å sikre at filen overholder reglene satt for datatypen og/eller opplastingskomponenten. Disse sjekkene inkluderer:
-* Er filutvidelsen gyldig i henhold til de konfigurerte MIME-typene?
-* Filstørrelsen er under den konfigurerte grensen.
-* Antall opplastede filer er under den konfigurerte grensen.
-
-Utvidet filvalidering legger til mulighet for å analysere byte-strømmen til de opplastede filene før de lagres, og returnere feilmeldinger til klienten hvis det er noe galt. Som standard inkluderes en MIME-typekontroller som skanner filen for å se om den er av den typen den hevder å være. Man kan lage og legge til egenutviklede valideringer for å validere ulike typer filer og metadata. Du kan for eksempel skrive en analyse som sjekker om en PNG-fil har en minimumsoppløsning før den godtas, eller om en PDF-fil er av en bestemt versjon.
-
-Altinn.App.Core NuGet-pakken definerer grensesnittene som kreves i tillegg til å sikre at koden kalles. Analyseimplementeringene opprettes som en separat [NuGet-pakke](https://www.nuget.org/packages/Altinn.FileAnalyzers) som kan importeres i applikasjonen din. Dette gjøres for å holde kjernen til en Altinn 3-applikasjon så liten som mulig, og for å kunne lansere og bruke nye analyser uten å måtte oppgradere applikasjonen (utover v7.10.0).
-
-
-## Hvordan konfigurere og aktivere standard MIME-type validering i applikasjonen din
-1. **Legg til en referanse til [Altinn.FileAnalyzers NuGet-pakken](https://www.nuget.org/packages/Altinn.FileAnalyzers)**
- Åpne kommandolinjen til applikasjonsrepoet og naviger til mappen App der App.csproj-filen er plassert, og kjør følgende kommando:
- ```shell
- nuget install Altinn.FileAnalyzers
- ```
-2. **Registrer tjenesten for MIME-type valideringen slik at de blir tilgjenglelig**
- ```csharp
- services.AddMimeTypeValidation();
- ```
-3. **Konfigurer validatoren for den datatypen den skal brukes for**
- Validatoren konfigureres per datatypen og vil bare kjøre mot den konfigurerte datatypen. Eksemplet nedenfor konfigurerer MIME-type analysen og den tilhørende valideringskomponenten.
- ```json
- {
- "id": "08112113-cc3a-4d35-a8d2-bfba53a1ddfd",
- "allowedContentTypes": ["image/jpeg", "application/pdf"],
- "taskId": "Task_1",
- "maxSize": 25,
- "maxCount": 1,
- "minCount": 1,
- "enablePdfCreation": false,
- "enabledFileAnalysers": [ "mimeTypeAnalyser" ],
- "enabledFileValidators": [ "mimeTypeValidator" ]
- }
- ```
-4. **Legg til støtte for JSON-objekter i dataresponsen**
- Dette forteller frontend å se etter JSON i svaret for å gi en feilmelding til brukeren.
- ```json
- "FeatureManagement": {
- "JsonObjectInDataResponse": true
- }
- ```
-
-## Hvordan skrive din egen analyse
-Hvis du vil skrive din egen validator, må du implementere to interface: `IFileAnalyser` og `IFileValidator`. `IFileAnalyser` analyserer filen for eventuelle metadata du vil validere på og returnerer disse i en `FileAnalysisResult`. Resultatet sendes deretter til valideringslogikken. Resultatet inneholder noen navngitte egenskaper som filnavn, MIME-type og ID-en til analysatoren som ble brukt for å opprette resultatet. Eventuelle tilleggsmetadata sendes som nøkkel/verdi-par i Metadata propertyen. Denne separasjonen er primært gjort for å tillate gjenbruk av analysatoren for å ekstrahere metadata om filen for andre formål.
-
-1. **Implementer grensesnittet `IFileAnalyser`**
- Grensesnittet har en egenskap `Id` og en metode `Analyse` som må implementeres.
- `Id`-egenskapen skal være unik og brukes når du konfigurerer analysatoren i filen `applicationmetadata.json`. Dette er hvordan implementasjonen din blir valgt når applikasjonen bestemmer hvilken analyse som skal kjøres for en gitt datatype.
- Eksempel fra standardimplementeringen av MIME-type-analysatoren:
- ```csharp
- public string Id { get; private set; } = "mimeTypeAnalyser";
- ```
- Metoden `Analyse` får bytestrømmen som representerer filen og et filnavn hvis tilgjengelig (vanligvis er det tilgjengelig). Strømmen er allerede satt til posisjon 0 og kan leses direkte.
- Eksempel fra standardimplementeringen av MIME-type-analysatoren:
- ```csharp
- public async Task Analyse(Stream stream, string? filename = null)
- {
- var results = _inspector.Inspect(stream);
-
- var match = results.OrderByDescending(match => match.Points).FirstOrDefault(match => match.Percentage == 1);
-
- // Du oppgir ID-en til analysatoren i resultatet for å kunne skille mellom resultater fra forskjellige analysatorer.
- var fileAnalysisResult = new FileAnalysisResult(Id);
- if (match != null)
- {
- fileAnalysisResult.Extensions = match.Definition.File.Extensions.ToList();
- fileAnalysisResult.MimeType = match.Definition.File.MimeType;
- fileAnalysisResult.Filename = filename;
- fileAnalysisResult.Metadata.Add("key", "value"); //Dette viser bare hvordan du legger til egendefinerte metadata.
- }
-
- return fileAnalysisResult;
- }
- ```
-2. **Implementer grensesnittet `IFileValidator`**
- Basert på analyseresultatet kan du skrive valideringslogikken. Valideringen vil være tett knyttet til metadataegenskapene du vil validere mot, noe som betyr at du må vite nøkkelen og typen verdier som forventes.
- Grensesnittet har en egenskap `Id` og en metode `Validate` som må implementeres.
- `Id`-egenskapen skal være unik og brukes når du konfigurerer analysatoren i filen `applicationmetadata.json`. Dette er hvordan implementasjonen din blir valgt når applikasjonen bestemmer hvilken validering som skal kjøres for en gitt datatype.
- Eksempel fra standardimplementeringen av MIME-type validatoren:
- ```csharp
- public string Id { get; private set; } = "mimeTypeValidator";
- ```
- Metoden `Validate` får datatypen den kjører for, og resultatet fra analysen. Den returnerer en `bool` som indikerer om valideringen var vellykket eller ikke, og i tilfelle feil blir det returnert en liste over feil.
- ```csharp
- public async Task<(bool Success, IEnumerable Errors)> Validate(DataType dataType, IEnumerable fileAnalysisResults)
- {
- List errors = new();
-
- var fileMimeTypeResult = fileAnalysisResults.FirstOrDefault(x => x.MimeType != null);
-
- // Sjekk om filens MIME-type er en tillatt innholdstype
- if (!dataType.AllowedContentTypes.Contains(fileMimeTypeResult?.MimeType, StringComparer.InvariantCultureIgnoreCase) && !dataType.AllowedContentTypes.Contains("application/octet-stream"))
- {
- ValidationIssue error = new()
- {
- Source = "File",
- Code = ValidationIssueCodes.DataElementCodes.ContentTypeNotAllowed,
- Severity = ValidationIssueSeverity.Error,
- Description = $"Filen {fileMimeTypeResult?.Filename + " "}virker ikke å være av en tillatt innholdstype i henhold til konfigurasjonen for datatypen {dataType.Id}. Tillatte innholdstyper er {string.Join(", ", dataType.AllowedContentTypes)}",
- CustomTextKey = "My.text.resource.key"
- };
-
- errors.Add(error);
-
- return (false, errors);
- }
-
- return (true, errors);
- }
- ```
-3. **Registrer implementasjonen i applikasjonens DI-kontainer**
- Når koden din er på plass, må du registrere implementasjonen for at koden skal bli utført når filer lastes opp.
- ```csharp
- services.AddTransient();
- services.AddTransient();
- ```
-4. **Konfigurer analysen og validatoren**
- Når du har implementert analysatoren og valideringslogikken, må du konfigurere de i filen _applicationmetadata.json_. I konfigurasjonen av datatypen må du legge til analysatoren og valideringskomponenten med riktig ID.
- ```json
- {
- "id": "08112113-cc3a-4d35-a8d2-bfba53a1ddfd",
- "allowedContentTypes": [
- "image/jpeg", "application/pdf"
- ],
- "taskId": "Task_1",
- "maxSize": 25,
- "maxCount": 1,
- "minCount": 1,
- "enablePdfCreation": false,
- "enabledFileAnalysers": [ "mimeTypeAnalyser" ],
- "enabledFileValidators": [ "mimeTypeValidator" ]
- }
- ```
\ No newline at end of file
diff --git a/content/app/development/logic/validation/info-message.jpeg b/content/app/development/logic/validation/info-message.jpeg
deleted file mode 100644
index b72d3b216ac..00000000000
Binary files a/content/app/development/logic/validation/info-message.jpeg and /dev/null differ
diff --git a/content/app/development/logic/validation/success-message.jpeg b/content/app/development/logic/validation/success-message.jpeg
deleted file mode 100644
index b87319570f6..00000000000
Binary files a/content/app/development/logic/validation/success-message.jpeg and /dev/null differ
diff --git a/content/app/development/logic/validation/warning-message.jpeg b/content/app/development/logic/validation/warning-message.jpeg
deleted file mode 100644
index 6646bebdbf0..00000000000
Binary files a/content/app/development/logic/validation/warning-message.jpeg and /dev/null differ
diff --git a/content/app/development/process/_index.en.md b/content/app/development/process/_index.en.md
deleted file mode 100644
index e98d36ec787..00000000000
--- a/content/app/development/process/_index.en.md
+++ /dev/null
@@ -1,37 +0,0 @@
----
-title: Process handling
-description: The Application template supports defining a business process for the digital service.
-tags: [altinn-apps, process, bpmn]
-weight: 60
-aliases:
-- /app-template/processhandling
----
-
-The template follows the [BPMN 2.0 standard.](https://www.bpmn.org/)
-
-## Supported process elements
-
-
-* [__Process tasks__](tasks) _tasks that require users or systems to perform actions before the process continues_
-
-
-* [__Flow control__](flowcontrol) _controls navigation through a process with gateways_
-
-## Process Examples
-
-![Simple process](process1.drawio.svg "A process with data task")
-
-![Simple process](process2.drawio.svg "A process with data and confirmation tasks")
-
-![Simple process](process3.drawio.svg "A process with data, confirmation, and feedback task")
-
-![Simple process](process4.drawio.svg "A process with data and confirmations and optional confirmation")
-
-![Simple process](process5.drawio.svg "A process with data and confirmation and optional confirmation with options to go back to the data task")
-
-
-## Process configuration
-
-In Altinn Studio, the App developer can configure the process.
-
-[Read our development handbook for details.](../../../../app/development/configuration/process/)
\ No newline at end of file
diff --git a/content/app/development/process/_index.nb.md b/content/app/development/process/_index.nb.md
deleted file mode 100644
index 38868fad5fa..00000000000
--- a/content/app/development/process/_index.nb.md
+++ /dev/null
@@ -1,32 +0,0 @@
----
-title: Prosess handling
-description: Applikasjons templaten støtter å definere en foretnings prosess for digitale tjenester
-tags: [altinn-apps, process, bpmn]
-weight: 60
----
-
-Malen følger [BPMN 2.0-standarden](https://www.bpmn.org/).
-
-## Støttede prosesselementer
-
-* [__Prosessoppgaver__](tasks) _oppgaver som lar brukerne utføre handlinger før prosessen fortsetter_
-
-* [__Flytkontroll__](flowcontrol) _kontrollerer navigasjonen gjennom en prosess med gateways_
-
-## Prosesseksempler
-
-![Enkel prosess](process1.drawio.svg "En prosess med en dataoppgave")
-
-![Enkel prosess](process2.drawio.svg "En prosess med data- og bekreftelsesoppgaver")
-
-![Enkel prosess](process3.drawio.svg "En prosess med data-, bekreftelses- og tilbakemeldingsoppgave")
-
-![Enkel prosess](process4.drawio.svg "En prosess med data og bekreftelser og valgfri bekreftelse")
-
-![Enkel prosess](process5.drawio.svg "En prosess med data og bekreftelse og valgfri bekreftelse med mulighet til å gå tilbake til dataoppgaven")
-
-## Konfigurasjon av prosessen
-
-I Altinn Studio kan apputvikleren konfigurere prosessen.
-
-[Les vår utviklerhåndbok for detaljer.](../../../../app/development/configuration/process/)
\ No newline at end of file
diff --git a/content/app/development/process/actions/_index.en.md b/content/app/development/process/actions/_index.en.md
deleted file mode 100644
index 3a90d2235ff..00000000000
--- a/content/app/development/process/actions/_index.en.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: Actions
-description:
-tags: [altinn-apps, process, bpmn, gateway, action, acitons]
-weight: 30
-toc: false
----
-
-Actions are used to define what a user can do in a task. Actions are defined in the process file (BPMN) and have authorization rules attached to them defined in the policy file (XACML) to controll who can execute them.
-
-We have two types of actions:
-1. **Server actions**
- Arbitrary code that can be executed on the server as part of the process. These actions are typically used to help the user fill out the form by prefilling data, perform calculations, call external api's etc. They will typically update the data model, return the updated model to the client and update the UI. You can also tell the client what to do after a successful execution, for instance navigate to the next page.
-1. **Process actions**
- Process actions are somewhat similar to server actions, but they will move the process to the next step on successful execution. We have a number of predefined process actions, like "write", "confirm", "sign" and "reject". You can also define your own process actions.
-
-{{}}
\ No newline at end of file
diff --git a/content/app/development/process/actions/_index.nb.md b/content/app/development/process/actions/_index.nb.md
deleted file mode 100644
index 4dda28c23b1..00000000000
--- a/content/app/development/process/actions/_index.nb.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-title: Handlinger
-description:
-tags: [altinn-apper, prosess, bpmn, gateway, handling, handlinger]
-weight: 30
-toc: false
----
-
-Handlinger brukes til å definere hva en bruker kan gjøre i en oppgave. Handlinger er definert i prosessen (BPMN) og har i tillegg tilgangsregler som styrer hvem som kan utføre de definert i tilgangskontrollfilen (XACML). Vi har to typer handlinger:
-1. **Serverhandlinger**
- Vilkårlig kode som kan utføres på serveren som en del av prosessen. Disse handlingene brukes vanligvis til å hjelpe brukeren med å fylle ut skjemaet ved å forhåndsutfylle data, utføre beregninger, kalle eksterne API-er, osv. De vil vanligvis oppdatere datamodellen, returnere den oppdaterte modellen til klienten og oppdatere brukergrensesnittet. Du kan også fortelle klienten hva den skal gjøre etter en vellykket utførelse, for eksempel navigere til neste side.
-2. **Prosesshandlinger**
- Prosesshandlinger ligner på serverhandlinger, men de vil flytte prosessen til neste trinn ved vellykket utførelse. Vi har en rekke forhåndsdefinerte prosesshandlinger, som "skriv", "bekreft", "signer" og "avvis". Du kan også definere dine egne prosesshandlinger.
-
-{{}}
diff --git a/content/app/development/process/actions/process-actions/_index.en.md b/content/app/development/process/actions/process-actions/_index.en.md
deleted file mode 100644
index 0eb9a6c0ad8..00000000000
--- a/content/app/development/process/actions/process-actions/_index.en.md
+++ /dev/null
@@ -1,174 +0,0 @@
----
-title: Process actions
-description: Extended authorization, custom logic for process actions
-tags: [altinn-apps, process, bpmn, gateway, action, acitons]
-weight: 30
-toc: true
----
-
-In version 8 of the app nugets actions in tasks were introduced. This makes it possible for developers to associate ActionButtons in the UI with UserActions in the backend.
-It is possible to authorize each action in a task separately in the policy file.
-
-## Actions with special altinn logic connected to them
-
-### write
-Default action that is performed when a data or feedback task is submitted. This is also the permission a user needs to update data in the application.
-
-### confirm
-Default action that is performed when a confirmation task i submitted
-
-### sign
-Action that generates a signature object based on the configuration of the task see [Signature](../../tasks/signing)
-
-### reject
-Action to use when moving back from one task to another. Performing action reject will ensure data elements in the target task is unlocked.
-
-## Custom actions and custom logic when action is performed
-
-### Custom action in task
-To add actions to a task you have to modify the `App/config/process/process.bpmn` file and add the wanted action to the task.
-
-Example of a process where Task_1 has the actions _demo_ and _custom_ defined:
-
-```xml {hl_lines=["15-27"]}
-
-
-
-
- Flow1
-
-
-
- Flow1
- Flow2
-
-
- data
-
- demo
- custom
-
-
-
-
-
-
- Flow2
-
-
-
-```
-
-The type attribute that is defined for the _custom_ action (processAction) is the default value so the type for demo is also processAction.
-
-### Define necessary authorization policies
-
-Users needs to be granted the right to perform the action _custom_ and _demo_ when moving out of _Task1_
-
-This is defined in policy.xml:
-
-```xml
-
-
- Rule that defines that user with role DAGL can execute myServerAction for
- [ORG]/[APP] when it is in Task_1
-
-
-
-
-
- DAGL
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- Task_1
-
-
-
-
-
-
-
- custom
-
-
-
-
-
-
-
-```
-
-### Writing the custom code and registering it as a service
-
-The custom code assosiated with a process action is executed before the process is moved to the next task.
-
-To write custom logic create a new class that implements `Altinn.App.Core.Models.UserAction.IUserAction`.
-
-This interface requires you to define an `Id` and an implementation of `public async Task HandleAction(UserActionContext context)`. The id provided is used to match the C# implementation with the action specified in the process file.
-
-A very simple implementation of the _custom_ action that only logs the users userId and the instanceId can be implemented as this:
-
-```
-using System.Threading.Tasks;
-using Altinn.App.Core.Features;
-using Altinn.App.Core.Models.UserAction;
-using Microsoft.Extensions.Logging;
-
-namespace Altinn.App.Actions;
-
-public class MyDemoAction: IUserAction
-{
- private readonly ILogger _logger;
-
- public MyDemoAction(ILogger logger)
- {
- _logger = logger;
- }
-
- public string Id => "demo";
- public async Task HandleAction(UserActionContext context)
- {
- await Task.CompletedTask;
- _logger.LogInformation("UserId: {userId}, InstanceId: {instanceId}", context.UserId, context.Instance.Id);
- return UserActionResult.SuccessResult();
- }
-}
-
-```
-
-If the action retuns a `UserActionResult` with the field success set to true the process is moved to the next task. Otherwise the process will not be moved and the api will return an error to the user.
\ No newline at end of file
diff --git a/content/app/development/process/actions/process-actions/_index.nb.md b/content/app/development/process/actions/process-actions/_index.nb.md
deleted file mode 100644
index 45a7aebfb9d..00000000000
--- a/content/app/development/process/actions/process-actions/_index.nb.md
+++ /dev/null
@@ -1,174 +0,0 @@
----
-title: Process actions
-description: Extended authorization, custom logic for process actions
-tags: [altinn-apps, process, bpmn, gateway, action, acitons]
-weight: 30
-toc: true
----
-
-I versjon 8 av appen ble "nugets actions in tasks" introdusert. Dette gjør det mulig for utviklere å knytte ActionButtons i grensesnittet med UserActions i backenden.
-Det er mulig å autorisere hver handling i en oppgave separat i policy-filen.
-
-## Handlinger med spesiell Altinn-logikk knyttet til dem
-
-### write
-Standard handling som utføres når en data- eller tilbakemeldingsoppgave sendes inn. Dette er også tillatelsen en bruker trenger for å oppdatere data i applikasjonen.
-
-### confirm
-Standard handling som utføres når en bekreftelsesoppgave sendes inn.
-
-### sign
-Handling som genererer et signaturobjekt basert på konfigurasjonen av oppgaven, se [Signatur](../../tasks/signing)
-
-### reject
-Handling å bruke når du flytter tilbake fra en oppgave til en annen. Å utføre handlingen "reject" vil sikre at dataelementene i måloppgaven låses opp.
-
-## Egendefinerte handlinger og egendefinert logikk når handlingen utføres
-
-### Egendefinert handling i oppgave
-For å legge til handlinger i en oppgave må du endre filen `App/config/process/process.bpmn` og legge til ønsket handling i oppgaven.
-
-Eksempel på en prosess der Task_1 har handlingene _demo_ og _custom_ definert:
-
-```xml {hl_lines=["15-27"]}
-
-
-
-
- Flow1
-
-
-
- Flow1
- Flow2
-
-
- data
-
- demo
- custom
-
-
-
-
-
-
- Flow2
-
-
-
-```
-
-The type-attributtet som er definert for handlingen _custom_ (processAction) er standardverdien, så typen for demo er også processAction.
-
-### Definer nødvendige autorisasjonspolicyer
-
-Brukere må gis rettighetene til å utføre handlingene _custom_ og _demo_ når de forlater _Task1_.
-
-Dette er definert i policy.xml:
-
-```xml
-
-
- Rule that defines that user with role DAGL can execute myServerAction for
- [ORG]/[APP] when it is in Task_1
-
-
-
-
-
- DAGL
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- Task_1
-
-
-
-
-
-
-
- custom
-
-
-
-
-
-
-
-```
-
-### Skriving av tilpasset kode og registrering som tjeneste
-
-Den tilpassede koden assosiert med en prosesshandling utføres før prosessen flyttes til neste oppgave.
-
-For å skrive tilpasset logikk, opprett en ny klasse som implementerer `Altinn.App.Core.Models.UserAction.IUserAction`.
-
-Denne grensesnittet krever at du definerer en `Id` og en implementering av `public async Task HandleAction(UserActionContext context)`. Iden er brukt for å finne riktig C# implementasjon av det handlingen definert i prosessfilen.
-
-En svært enkel implementering av _custom_-handlingen som bare logger brukerens bruker-ID og instans-ID kan implementeres som følger:
-
-```
-using System.Threading.Tasks;
-using Altinn.App.Core.Features;
-using Altinn.App.Core.Models.UserAction;
-using Microsoft.Extensions.Logging;
-
-namespace Altinn.App.Actions;
-
-public class MyDemoAction: IUserAction
-{
- private readonly ILogger _logger;
-
- public MyDemoAction(ILogger logger)
- {
- _logger = logger;
- }
-
- public string Id => "demo";
- public async Task HandleAction(UserActionContext context)
- {
- await Task.CompletedTask;
- _logger.LogInformation("UserId: {userId}, InstanceId: {instanceId}", context.UserId, context.Instance.Id);
- return UserActionResult.SuccessResult();
- }
-}
-
-```
-
-Hvis handlingen returnerer en `UserActionResult` med feltet "success" satt til true, flyttes prosessen til neste oppgave. Ellers vil ikke prosessen bli flyttet, og API-en vil returnere en feil til brukeren.
\ No newline at end of file
diff --git a/content/app/development/process/actions/serveraction/_index.en.md b/content/app/development/process/actions/serveraction/_index.en.md
deleted file mode 100644
index 884a81d5dac..00000000000
--- a/content/app/development/process/actions/serveraction/_index.en.md
+++ /dev/null
@@ -1,112 +0,0 @@
----
-title: Server Action
-linktitle: Server Action
-description: How to write custom server side actions that can be triggered by a API-client or a generic button
-weight: 20
-toc: true
----
-
-{{% panel theme="warning" %}}
-⚠️ Server actions require version 8.0.0 or newer of app-libs
-
-If you want to define a generic button version 4.0.0 or newer of app-frontend is required.
-{{% /panel %}}
-
-## Overview
-
-Server actions is a way to write custom backend code that end users can trigger either by pressing a button or making an api request.
-
-They are almost identical to process actions, the only difference is that they do not automatically change the process state when triggered.
-
-A server action is tied to one or more process tasks and needs explisit autorization rules to grant end users execution rights.
-
-## Create and configure server action
-
-### Configure available server action for a process task
-
-To register what server acitons are available for a process task we need to add it to the tasks config in the process.bpmn file
-
-Example of a process task with a server action called `myServerAction`
-
-```xml
-
-
- SequenceFlow_1
- SequenceFlow_2
-
-
- data
-
- myServerAction
-
-
-
-
-
-```
-
-### Add access policy
-
-To allow users to trigger the server action we need to add authorization policies to the policy.xml file.
-
-Example of access policy rule granting users with `DAGL` role access to trigger the server action `myServerAction` when the process is in `Task_1`
-
-```xml
-
-
- Rule that defines that user with role DAGL can execute myServerAction for
- [ORG]/[APP] when it is in Task_1
-
-
-
-
-
- DAGL
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- Task_1
-
-
-
-
-
-
-
- myServerAction
-
-
-
-
-
-
-
-```
-
diff --git a/content/app/development/process/actions/serveraction/_index.nb.md b/content/app/development/process/actions/serveraction/_index.nb.md
deleted file mode 100644
index 626e279da96..00000000000
--- a/content/app/development/process/actions/serveraction/_index.nb.md
+++ /dev/null
@@ -1,113 +0,0 @@
----
-title: Server Action
-linktitle: Server Action
-description: Hvordan skrive custom server side handlinger som kan bli exekvert enten av en API-bruker eller via en Generic button
-weight: 20
-toc: true
-tags: [translation]
----
-
-
-{{% panel theme="warning" %}}
-⚠️ Server actions require version 8.0.0 or newer of app-libs
-
-If you want to define a generic button version 4.0.0 or newer of app-frontend is required.
-{{% /panel %}}
-
-## Overview
-
-Server actions is a way to write custom backend code that end users can trigger either by pressing a button or making an api request.
-
-They are almost identical to process actions, the only difference is that they do not automatically change the process state when triggered.
-
-A server action is tied to one or more process tasks and needs explisit autorization rules to grant end users execution rights.
-
-## Create and configure server action
-
-### Configure available server action for a process task
-
-To register what server acitons are available for a process task we need to add it to the tasks config in the process.bpmn file
-
-Example of a process task with a server action called `myServerAction`
-
-```xml
-
-
- SequenceFlow_1
- SequenceFlow_2
-
-
- data
-
- myServerAction
-
-
-
-
-
-```
-
-### Add access policy
-
-To allow users to trigger the server action we need to add authorization policies to the policy.xml file.
-
-Example of access policy rule granting users with `DAGL` role access to trigger the server action `myServerAction` when the process is in `Task_1`
-
-```xml
-
-
- Rule that defines that user with role DAGL can execute myServerAction for
- [ORG]/[APP] when it is in Task_1
-
-
-
-
-
- DAGL
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- Task_1
-
-
-
-
-
-
-
- myServerAction
-
-
-
-
-
-
-
-```
\ No newline at end of file
diff --git a/content/app/development/process/flowcontrol/_index.en.md b/content/app/development/process/flowcontrol/_index.en.md
deleted file mode 100644
index 6dbd4ac22ba..00000000000
--- a/content/app/development/process/flowcontrol/_index.en.md
+++ /dev/null
@@ -1,253 +0,0 @@
----
-title: Flowcontrol
-description: Controlling process flow
-tags: [altinn-apps, process, bpmn, gateway]
-weight: 20
-toc: true
----
-
-## Exclusive Gateways
-
-Exclusive gateways allow a different path in the process based on direct user input, data, or other aspects available from code.
-
-## Gateways controlling flow with expressions
-
-### Prerequisites
-
-* Your application uses version 8.0.0 or newer of the Altinn nugets.
-* Application with a process containing a exclusive gateway
-
-### Controlling flow out of a gateway based on data provided by the user using expressions
-
-It is possible to control what flow is chosen out of a gateway based on data that was provided by a user in a previous task using the same expression language used to hide/show elements in the UI.
-To accomplish this we first need to define what formdata should be provided as context to the expression.
-
-Example:
-```xml {hl_lines=["6-10"]}
-...
-
- Flow_t1_g1
- Flow_g1_t2
- Flow_g1_end
-
-
- Schema
-
-
-
-
-
-...
-```
-In the example above the gateway is adding the formdata stored in the datatype _Schema_ as context to the expressions. Form data and dataTypes are defined in the _applicaitonmetadata.json_ file.
-
-Once the gateway is connected to a datatype we can leverage the expressions language to define if flows leading out of the gateway are available.
-
-NOTE: There need to be only one flow available after filtering out flows, unless there is a default flow and it is part of the possible flows out of the gateway
-
-We now need to define these expressions in the outgoing flows from the gateway. In the example gateway we have two outgoing flows: _Flow_g1_t2_ and _Flow_g1_end_
-
-We want to send the process to follow the _Flow_g1_t2_ if the field Amount in the formdata is greater than or equal to 1000 or _Flow_g1_end_ if it is below 1000
-
-To achive this we need to add conditionExpressions to the outgoing flows
-
-```xml {hl_lines=[2,5]}
-
- ["greaterThanEq", ["dataModel", "Amount"], 1000]
-
-
- ["lessThan", ["dataModel", "Amount"], 1000]
-
-```
-If the user has submitted a Amount of 1000 the expressions in sequenceFlow _Flow_g1_end_ evaluates to false and the flow is removed from the possible flows to choose and the only available flow is _Flow_g1_t2_ and therefor it is chosen.
-
-To see more possibilities with expressions see [Expressions](../../../../app/development/logic/expressions/)
-
-
-### Controlling flow out of a gateway base on user action performed using expressions
-
-In addition to using the expressions against the datamodel it is also possible in a process conditionExpression to make decisions based on the action taken by the user/system in the task before the gateway.
-
-If an applications process has a confirmation step where it is possible to reject the data and send the instance back to the previous step (Task_1) if the end user performs the reject action
-
-```xml
-
- Flow_t1_t2
- Flow_t2_g1
-
-
- confirmation
-
- confirm
- reject
-
-
-
-
-
- Flow_t2_g1
- Flow_g1_t1
- Flow_g1_end
-
-
-
-```
-
-In the example above there is defined two actions in _Task_2_ confirm and reject. [Read more about actions](../tasks/)
-
-What we want to accomplish is to make the process engine choose _Flow_g1_t1_ if the user performs action _reject_ and _Flow_g1_end_ if action performed was _confirm…
-
-To do this we use the expression function _gatewayAction_
-
-```xml {hl_lines=[2,5]}
-
- ["equals", ["gatewayAction"], "reject"]
-
-
- ["lessThan", ["gatewayAction"], "confirm"]
-
-```
-
-The expressions function _gatewayAction_ returns the action performed in the task the process just left. In the example above the previous task is _Task_2_.
-
-The _gatewayAction_ function can be combine with all the other functions in [expressions](../../../../app/development/logic/expressions/)
-
-## Complex gateways requiring custom code
-
-If the requirements for your gateway cannot be done through expressions you have the option to write a custom code making the flow decisions for you
-
-### Prerequisites
-
-* Your application uses version 7.1.0 or newer of the Altinn nugets.
-* Application with a process containing an exclusive gateway.
-
-### Example process with exclusive gateways
-
-{{}}
-
-{{}}
-```xml
-
-
-
-
- Flow_s_t1
-
-
-
- Flow_s_t1
- Flow_t1_g1
-
-
- data
-
-
-
-
-
- Flow_t1_g1
- Flow_g1_g2
- Flow_g1_t2
-
-
-
-
- Flow_g1_t2
- Flow_t2_g2
-
-
- confirmation
-
-
-
-
-
- Flow_g1_g2
- Flow_t2_g2
- Flow_g2_end
-
-
-
- Flow_g2_end
-
-
-
-
-```
-
-{{}}
-
-{{}}
-```xml
-
-
-
-
- Flow_s_t1
-
-
-
- Flow_s_t1
- Flow_t1_g1
-
-
-
- Flow_t1_g1
- Flow_g1_g2
- Flow_g1_t2
-
-
-
-
- Flow_g1_t2
- Flow_t2_g2
-
-
-
- Flow_g1_g2
- Flow_t2_g2
- Flow_g2_end
-
-
-
- Flow_g2_end
-
-
-
-
-```
-{{}}
-
-{{}}
-
-Visual representation of the bpmn definition
-
-![BPMN definition diagram](process-definition.svg "BPMN definition diagram")
-
-### Implementing and injecting custom gateway code
-
-To choose correct sequenceflow out of the exclusive gateway based on instance data the application needs create a class implementing `Altinn.App.Core.Features.IProcessExclusiveGateway` and register it as a service in the dependency injection.
-
-The interface has one string Property `GatewayId`, and a method `FilterAsync`
-
-`GatewayId` is used to identify the Gateway in the process definition it is connected to.
-
-In our example definition a implementation for the first gateway (Gateway_1) would have this property set to `Gateway_1` as this is the value of the attribute `id` for the exclusive gateway in the process definition.
-
-The method FilterAsync is where you implement your custom logic to filter the available sequenceflow(s) out of the gateway based on the instance data.
-
-For further documentation of the interface read the xml documentation for the interface [here](https://github.com/Altinn/app-lib-dotnet/blob/main/src/Altinn.App.Core/Features/IProcessExclusiveGateway.cs)
-
-After you have written your custom implementation register it in `Program.cs` in the `RegisterCustomAppServices` method.
-
-Example:
-
-```csharp
-void RegisterCustomAppServices(
- IServiceCollection services,
- IConfiguration config,
- IWebHostEnvironment env)
-{
- services.AddTransient();
-}
-```
\ No newline at end of file
diff --git a/content/app/development/process/flowcontrol/_index.nb.md b/content/app/development/process/flowcontrol/_index.nb.md
deleted file mode 100644
index 551b2c31666..00000000000
--- a/content/app/development/process/flowcontrol/_index.nb.md
+++ /dev/null
@@ -1,303 +0,0 @@
----
-title: Flytkontroll
-description: Kontroller proess flyt
-tags: [altinn-apps, process, bpmn, gateway]
-weight: 20
-toc: true
----
-
-## Eksklusive gateways
-
-Eksklusive gateways tillater en annen vei i prosessen basert på direkte brukerinndata, data eller andre aspekter tilgjengelig fra koden.
-
-## Gateways som kontrollerer flyten med uttrykk
-
-### Forutsetninger
-
-* Applikasjonen din bruker versjon 8.0.0 eller nyere av Altinn-pakkene.
-* Applikasjon med en prosess som inneholder en eksklusiv gateway.
-
-### Kontrollere flyten ut av en gateway basert på data levert av brukeren ved hjelp av uttrykk
-
-Det er mulig å kontrollere hvilken flyt som velges ut av en gateway basert på data som ble levert av en bruker i en tidligere oppgave ved hjelp av samme uttrykkspråk som brukes til å skjule/ vise elementer i brukergrensesnittet.
-For å oppnå dette må vi først definere hvilke formdata som skal leveres som kontekst til uttrykket.
-
-Eksempel:
-```xml {hl_lines=["6-10"]}
-...
-
- Flow_t1_g1
- Flow_g1_t2
- Flow_g1_end
-
-
- Schema
-
-
-
-
-
-...
-```
-I eksempelet ovenfor legger gatewayen til formdata som er lagret i datatype _Schema_ som kontekst til uttrykkene. Formdata og datatyper er definert i filen _applicationmetadata.json_.
-
-Når gatewayen er koblet til en datatyper, kan vi dra nytte av uttrykkspråket for å definere om flytene ut av gatewayen er tilgjengelige.
-
-MERK: Det må være bare én flyt tilgjengelig etter filtrering av flyter, med mindre det er en standardflyt, og den er en del av de mulige flytene ut av gatewayen.
-
-Nå må vi definere disse uttrykkene i de utgående flytene fra gatewayen. I eksempelet på gatewayen har vi to utgående flyter: _Flow_g1_t2_ og _Flow_g1_end_
-
-Vi vil sende prosessen for å følge _Flow_g1_t2_ hvis feltet Amount i formdata er større enn eller lik 1000, eller _Flow_g1_end_ hvis det er mindre enn 1000.
-
-For å oppnå dette må vi legge til
-
-# Prosessflyt
-
-## Eksklusive gateways
-
-Eksklusive gateways tillater en annen vei i prosessen basert på direkte brukerinndata, data eller andre aspekter tilgjengelig fra koden.
-
-## Gateways som kontrollerer flyten med uttrykk
-
-### Forutsetninger
-
-* Applikasjonen din bruker versjon 8.0.0 eller nyere av Altinn-pakkene.
-* Applikasjon med en prosess som inneholder en eksklusiv gateway.
-
-### Kontrollere flyten ut av en gateway basert på data levert av brukeren ved hjelp av uttrykk
-
-Det er mulig å kontrollere hvilken flyt som velges ut av en gateway basert på data som ble levert av en bruker i en tidligere oppgave ved hjelp av samme uttrykkspråk som brukes til å skjule/vise elementer i brukergrensesnittet.
-For å oppnå dette må vi først definere hvilke formdata som skal leveres som kontekst til uttrykket.
-
-Eksempel:
-```xml {hl_lines=["6-10"]}
-...
-
- Flow_t1_g1
- Flow_g1_t2
- Flow_g1_end
-
-
- Schema
-
-
-
-
-
-...
-```
-I eksempelet ovenfor legger gatewayen til formdata som er lagret i datatypen _Schema_ som kontekst til uttrykkene. Formdata og datatyper er definert i filen _applicationmetadata.json_.
-
-Når gatewayen er koblet til en datatypen, kan vi dra nytte av uttrykkspråket for å definere om flytene ut av gatewayen er tilgjengelige.
-
-MERK: Det må bare være én flyt tilgjengelig etter filtrering av flytene, med mindre det er en standardflyt, og den er en del av de mulige flytene ut av gatewayen.
-
-Nå må vi definere disse uttrykkene i de utgående flytene fra gatewayen. I eksemplet på gatewayen har vi to utgående flyter: _Flow_g1_t2_ og _Flow_g1_end_
-
-Vi ønsker at prosessen skal følge _Flow_g1_t2_ hvis feltet Amount i formdata er større enn eller lik 1000, eller _Flow_g1_end_ hvis det er mindre enn 1000.
-
-For å oppnå dette må vi leg
-
-til betingelsesuttrykkene i de utgående flytene.
-
-```xml {hl_lines=[2,5]}
-
- ["greaterThanEq", ["dataModel", "Amount"], 1000]
-
-
- ["lessThan", ["dataModel", "Amount"], 1000]
-
-```
-Hvis brukeren har sendt inn en Amount på 1000, vil uttrykkene i sekvensflyten _Flow_g1_end_ evaluere til falsk, og flyten blir fjernet fra de mulige flytene å velge mellom, og den eneste tilgjengelige flyten er _Flow_g1_t2_, og derfor blir den valgt.
-
-For å se flere muligheter med uttrykk, se [Uttrykk](../../../../app/development/logic/expressions/)
-
-### Kontrollere flyten ut av en gateway basert på brukerhandling utført ved hjelp av uttrykk
-
-I tillegg til å bruke uttrykk mot datamodellen er det også mulig å ta beslutninger basert på handlingen utført av brukeren/systemet i oppgaven før gatewayen i et prosessbetingelsesuttrykk.
-
-Hvis en applikasjonsprosess har et bekreftelsessteg der det er mulig å avvise dataene og sende instansen tilbake til forrige steg (Task_1) hvis sluttbrukeren utfører avvisningshandlingen.
-
-```xml
-
- Flow_t1_t2
- Flow_t2_g1
-
-
- confirmation
-
- confirm
- reject
-
-
-
-
-
- Flow_t2_g1
- Flow_g1_t1
- Flow_g1_end
-
-
-
-```
-
-I eksempelet ovenfor er det definert to handlinger i _Task_2_: bekreft og avvis. [Les mer om handlinger](../tasks/)
-
-Det vi ønsker å oppnå
-
-er å få prosessmotoren til å velge _Flow_g1_t1_ hvis brukeren utfører handlingen _avvis_ og _Flow_g1_end_ hvis handlingen som ble utført var _bekreft_...
-
-For å gjøre dette bruker vi uttrykksfunksjonen _gatewayAction_
-
-```xml {hl_lines=[2,5]}
-
- ["equals", ["gatewayAction"], "avvis"]
-
-
- ["lessThan", ["gatewayAction"], "bekreft"]
-
-```
-
-Uttrykksfunksjonen _gatewayAction_ returnerer handlingen utført i oppgaven som prosessen nettopp forlot. I eksempelet ovenfor er forrige oppgave _Task_2_.
-
-Funksjonen _gatewayAction_ kan kombineres med alle de andre funksjonene i [uttrykk](../../../../app/development/logic/expressions/)
-
-## Komplekse gateways som krever tilpasset kode
-
-Hvis kravene for gatewayen din ikke kan oppfylles gjennom uttrykk, har du muligheten til å skrive tilpasset kode som tar beslutningene for flyten for deg.
-
-### Forutsetninger
-
-* Applikasjonen din bruker versjon 7.1.0 eller nyere av Altinn-pakkene.
-* Applikasjon med en prosess som inneholder en eksklusiv gateway.
-
-### Eksempelprosess med eksklusive gateways
-
-{{}}
-
-{{}}
-```xml
-
-
-
-
- Flow_s_t1
-
-
-
- Flow_s_t1
- Flow_t1_g1
-
-
- data
-
-
-
-
-
- Flow_t1_g1
- Flow_g1_g2
- Flow_g1_t2
-
-
-
-
- Flow_g1_t2
- Flow_t2_g2
-
-
- confirmation
-
-
-
-
-
- Flow_g1_g2
- Flow_t2_g2
- Flow_g2_end
-
-
-
- Flow_g2_end
-
-
-
-
-```
-
-{{}}
-
-{{}}
-```xml
-
-
-
-
- Flow_s_t1
-
-
-
- Flow_s_t1
- Flow_t1_g1
-
-
-
- Flow_t1_g1
- Flow_g1_g2
- Flow_g1_t2
-
-
-
-
- Flow_g1_t2
- Flow_t2_g2
-
-
-
- Flow_g1_g2
- Flow_t2_g2
- Flow_g2_end
-
-
-
- Flow_g2_end
-
-
-
-
-```
-{{}}
-
-{{}}
-
-Visuell representasjon av BPMN-definisjonen
-
-![BPMN definisjonsdiagram](process-definition.svg "BPMN definisjonsdiagram")
-
-### Implementering og injisering av tilpasset gateway-kode
-
-For å velge riktig sekvensflyt ut av den eksklusive gatewayen basert på instansdata, må applikasjonen opprette en klasse som implementerer `Altinn.App.Core.Features.IProcessExclusiveGateway` og registrere den som en tjeneste i avhengighetsinjeksjonen.
-
-Grensesnittet har en strengegenskap `GatewayId` og en metode `FilterAsync`.
-
-`GatewayId` brukes til å identifisere gatewayen i prosessdefinisjonen den er tilknyttet.
-
-I vårt eksempel har en implementering for den første gatewayen (Gateway_1) denne egenskapen satt til `Gateway_1`, da dette er verdien for attributtet `id` for den eksklusive gatewayen i prosessdefinisjonen.
-
-Metoden `FilterAsync` er der du implementerer din tilpassede logikk for å filtrere de tilgjengelige sekvensflytene ut av gatewayen basert på instansdataene.
-
-For ytterligere dokumentasjon av grensesnittet, les XML-dokumentasjonen for grensesnittet [her](https://github.com/Altinn/app-lib-dotnet/blob/main/src/Altinn.App.Core/Features/IProcessExclusiveGateway.cs).
-
-Etter at du har skrevet din tilpassede implementering, registrerer du den i `Program.cs` i `RegisterCustomAppServices`-metoden.
-
-Eksempel:
-
-```csharp
-void RegisterCustomAppServices(
- IServiceCollection services,
- IConfiguration config,
- IWebHostEnvironment env)
-{
- services.AddTransient();
-}
-```
\ No newline at end of file
diff --git a/content/app/development/process/flowcontrol/process-definition.svg b/content/app/development/process/flowcontrol/process-definition.svg
deleted file mode 100644
index 67bb30bbb58..00000000000
--- a/content/app/development/process/flowcontrol/process-definition.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/process/process1.drawio.svg b/content/app/development/process/process1.drawio.svg
deleted file mode 100644
index d93c00a9c80..00000000000
--- a/content/app/development/process/process1.drawio.svg
+++ /dev/null
@@ -1,68 +0,0 @@
-
\ No newline at end of file
diff --git a/content/app/development/process/process2.drawio.svg b/content/app/development/process/process2.drawio.svg
deleted file mode 100644
index 78ad5abc88c..00000000000
--- a/content/app/development/process/process2.drawio.svg
+++ /dev/null
@@ -1,87 +0,0 @@
-
\ No newline at end of file
diff --git a/content/app/development/process/process3.drawio.svg b/content/app/development/process/process3.drawio.svg
deleted file mode 100644
index 0c009fd7ceb..00000000000
--- a/content/app/development/process/process3.drawio.svg
+++ /dev/null
@@ -1,106 +0,0 @@
-
\ No newline at end of file
diff --git a/content/app/development/process/process4.drawio.svg b/content/app/development/process/process4.drawio.svg
deleted file mode 100644
index c010b4753a7..00000000000
--- a/content/app/development/process/process4.drawio.svg
+++ /dev/null
@@ -1,162 +0,0 @@
-
\ No newline at end of file
diff --git a/content/app/development/process/process5.drawio.svg b/content/app/development/process/process5.drawio.svg
deleted file mode 100644
index ad56cc8ed7d..00000000000
--- a/content/app/development/process/process5.drawio.svg
+++ /dev/null
@@ -1,199 +0,0 @@
-
\ No newline at end of file
diff --git a/content/app/development/process/tasks/_index.en.md b/content/app/development/process/tasks/_index.en.md
deleted file mode 100644
index 16076bf0330..00000000000
--- a/content/app/development/process/tasks/_index.en.md
+++ /dev/null
@@ -1,139 +0,0 @@
----
-title: Process tasks
-description: Defining process tasks
-tags: [altinn-apps, process, bpmn, task]
-weight: 10
----
-
-## Task types
-
-### Data Task
-
-A data task is where the user/system accessing the digital service through UI or API can read, write and modify data related to a digital service.
-
-A data task requires that all data for a given process task is valid and that the user/system has added all the necessary data.
-
-The data validation is part of the standard logic in the template. Application developers can add custom validation for each data element and task.
-
-{{}}
-{{}}
-```xml
-
- Flow1
- Flow2
-
-
- data
-
-
-
-```
-{{}}
-{{}}
-```xml
-
- Flow1
- Flow2
-
-```
-{{}}
-{{}}
-
-### Confirmation Task
-
-A confirmation task is where the end user accessing the application through the browser or system through API can confirm data that is part of the process.
-
-When a user confirms a confirmation task a confirm instance event log is created detailing that user/system X has confirmed.
-
-Example of a confirmation task
-{{}}
-{{}}
-```xml
-
- Flow1
- Flow2
-
-
-
- confirm
-
- confirmation
-
-
-
-```
-{{}}
-{{}}
-```xml
-
- Flow1
- Flow2
-
-```
-{{}}
-{{}}
-
-### Signing Task
-
-A signing task is where the end user accessing the application through the browser or system through API can sign data that is part of the process.
-
-When a user performs a sign action a signature object containing the user information and a hash of the data elements defined in the process task will be generated along a instance event log detailing that user/system X has signed
-
-Example of a signing task (only supported in v8)
-```xml
-
- Flow1
- Flow2
-
-
-
- sign
-
- signing
-
-
- MyDataModel
-
- signature2
-
- signature1
-
-
-
-
-
-```
-
-As the example above shows a signing task needs additional information. See [Setting up signing](signing) for details on how to configure a singing task and the effects.
-
-### Feedback Task
-
-A feedback task allows the service owner or others to give feedback to the entity reporting data.
-
-It allows uploading data and moving the process forward.
-
-Example of a feedback task
-
-{{}}
-{{}}
-```xml
-
- Flow1
- Flow2
-
-
- feedback
-
-
-
-```
-{{}}
-{{}}
-```xml
-
- Flow1
- Flow2
-
-```
-{{}}
-{{}}
diff --git a/content/app/development/process/tasks/_index.nb.md b/content/app/development/process/tasks/_index.nb.md
deleted file mode 100644
index 3ecc12e5673..00000000000
--- a/content/app/development/process/tasks/_index.nb.md
+++ /dev/null
@@ -1,141 +0,0 @@
----
-title: Prosess oppgaver
-description: Definere prosess oppgaver
-tags: [altinn-apps, process, bpmn, task]
-weight: 10
----
-
-## Oppgavetyper
-
-### Data task
-
-En dataoppgave er der brukeren/systemet som bruker den digitale tjenesten gjennom brukergrensesnittet eller API-en kan lese, skrive og endre data relatert til en digital tjeneste.
-
-En dataoppgave krever at all data for en gitt prosessoppgave er gyldig og at brukeren/systemet har lagt til all nødvendig data.
-
-Datavalidering er en del av standardlogikken i malen. Applikasjonsutviklere kan legge til egendefinert validering for hvert dataelement og oppgave.
-
-{{}}
-{{}}
-```xml
-
- Flow1
- Flow2
-
-
- data
-
-
-
-```
-{{}}
-{{}}
-```xml
-
- Flow1
- Flow2
-
-```
-{{}}
-{{}}
-
-### Confirmation task
-
-En bekreftelsesoppgave er der sluttbrukeren som bruker applikasjonen gjennom nettleseren eller systemet gjennom API kan bekrefte data som er en del av prosessen.
-
-Når en bruker bekrefter en bekreftelsesoppgave, opprettes det en bekreftelseslogg for instansen som detaljerer at bruker/system X har bekreftet.
-
-Eksempel på en bekreftelsesoppgave:
-
-{{}}
-{{}}
-```xml
-
- Flow1
- Flow2
-
-
-
- confirm
-
- confirmation
-
-
-
-```
-{{}}
-{{}}
-```xml
-
- Flow1
- Flow2
-
-```
-{{}}
-{{}}
-
-### Signing task
-
-En signeringsoppgave er der sluttbrukeren som bruker applikasjonen gjennom nettleseren eller systemet gjennom API kan signere data som er en del av prosessen.
-
-Når en bruker utfører en signering, genereres det et signaturobjekt som inneholder brukerinformasjonen og en hash av dataelementene som er definert i prosessoppgaven. Samtidig opprettes en hendelseslogg for instansen som detaljerer at bruker/system X har signert.
-
-Eksempel på en signeringsoppgave (bare tilgjengelig fra versjon 8):
-
-```xml
-
- Flow1
- Flow2
-
-
-
- sign
-
- signing
-
-
- MyDataModel
-
- signature2
-
- signature1
-
-
-
-
-
-```
-
-Som eksempelet ovenfor viser, krever en signaturoppgave ekstra informasjon. Se [Konfigurering av signering](signing) for detaljer om hvordan du konfigurerer en signaturoppgave og dens effekter.
-
-### Feedback task
-
-En tilbakemeldingsoppgave lar tjenesteeieren eller andre gi tilbakemeldinger til enheten som rapporterer data.
-
-Det lar brukeren laste opp data og fortsette prosessen.
-
-Eksempel på en tilbakemeldingsoppgave:
-
-{{}}
-{{}}
-```xml
-
- Flow1
- Flow2
-
-
- feedback
-
-
-
-```
-{{}}
-{{}}
-```xml
-
- Flow1
- Flow2
-
-```
-{{}}
-{{}}
diff --git a/content/app/development/process/tasks/signing/_index.en.md b/content/app/development/process/tasks/signing/_index.en.md
deleted file mode 100644
index 6c56d50e86d..00000000000
--- a/content/app/development/process/tasks/signing/_index.en.md
+++ /dev/null
@@ -1,345 +0,0 @@
----
-title: Signing task
-description: Defining signing process tasks
-tags: [altinn-apps, process, bpmn, task, sign, signing]
-toc: true
----
-
-{{% panel theme="warning" %}}
-⚠️ Signing task require version 8.0.0 or newer of app-libs
-{{% /panel %}}
-
-Setting up a signing task in the process file requires a bit more work than a regular data, confirm or feedback task.
-
-This page will walk you through what you need to configure and how that is connected to other parts of the configuration.
-
-## Defining and configuring a signing task
-
-A signing task in its simples format looks something like this:
-
-```xml
-
- Flow_1enq1lu
- Flow_0ybpfuh
-
-
- signing
-
- sign
-
-
-
- Model
-
- signature
-
-
-
-
-```
-
-### Making sign an available action
-
-As for confirmation steps we need to define the actions available, to generate a signing object the user needs to be able to perform the sign action:
-
-```xml
-
- sign
-
-```
-
-The sign action can be the only option or in combination with other actions like confirm and/or reject, based on the needs of each application.
-
-### Configure what dataelements to sign
-
-Once a user performs a sign action the config from `` will be used to create a signature object.
-
-Currently the app developer defines what data elements are going to be a part of the signature object by defining a list of dataTypes. This can be form data, attachments or pdfs.
-
-The dataTypes are defined in the `App/config/applicationmetadata.json` file.
-
-The example signing task above defines that alle dataelements connected to the dataType Model should be a part of the signature.
-
-If the application also has a datatype with attachments named `attachments` where the user provides additional files that the developer wants to be a part of the signature object the `` should look like this:
-
-```xml
-
-
- Model
- attachmetns
-
- signature
-
-```
-
-### Configure where to store the signature object
-
-A signature object also requires a dataType where it should be stored once generated. This is defined in the `` and also needs to be defined in `App/config/applicationmetadata.json`
-
-Example of a applicationmetadata.json with a signature datatype named signature:
-
-```json
-{
- "id": "ttd/vga-dev-v8",
- "org": "ttd",
- "title": {
- "nb": "vga-dev-v8",
- "en": "vga-dev-v8"
- },
- "dataTypes": [
- {
- "id": "ref-data-as-pdf",
- "allowedContentTypes": [
- "application/pdf"
- ],
- "maxCount": 0,
- "minCount": 0,
- "enablePdfCreation": true
- },
- {
- "id": "Model",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.Model",
- "allowAnonymousOnStateless": false,
- "autoDeleteOnProcessEnd": false
- },
- "taskId": "Task_1",
- "maxCount": 1,
- "minCount": 1,
- "enablePdfCreation": true
- },
- {
- "id": "signature",
- "allowedContentTypes": [
- "application/json"
- ],
- "taskId": "Task_2",
- "maxSize": 25,
- "maxCount": 1,
- "minCount": 0,
- "enablePdfCreation": false
- }
- ],
- "partyTypesAllowed": {
- "bankruptcyEstate": false,
- "organisation": false,
- "person": false,
- "subUnit": false
- },
- "autoDeleteOnProcessEnd": false,
- "created": "2022-10-21T07:30:47.2710111Z",
- "createdBy": "appdeveloper",
- "lastChanged": "2022-10-21T07:30:47.2710121Z",
- "lastChangedBy": "appdeveloper"
-}
-```
-
-### Design layout for the signing step
-
-The signing step requires a layout that defines what should be displayed to the user. This is done through a separate layout set, which in turn is associated with the signing process step (`Task_2` in our example).
-
-If you have a v3 application without a layout set, see [Layout-sets](../../../ux/pages/layout-sets/) for how to set this up.
-
-Create a new folder in `App/ui/` with a name that describes this layout set, for example, _signing_. In this folder, create the file `Settings.json` and a folder named `layouts`.
-
-In the `layouts` folder, create files that define how pages in this layout set should look. The only component that a signing layout must have is an [`ActionButton`](../../../ux/components/actionbutton/) with `"action": "sign"`, which defines that when the user presses this, they perform the sign action, advancing the process.
-
-An example of a simple layout with a read-only text field and a signing button may look like this:
-
-
-```json
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- "data": {
- "layout": [
- {
- "id": "name-readonly-input",
- "type": "Input",
- "dataModelBindings": {
- "simpleBinding": "Name"
- },
- "readOnly": true,
- "required": true
- },
- {
- "id": "sign-button",
- "type": "ActionButton",
- "textResourceBindings": {
- "title": "Sign"
- },
- "action": "sign",
- "buttonStyle": "primary"
- }
- ]
- }
-}
-```
-
-### Define authorization rule that gives the user signing rights
-
-To allow users to sign, a rule must be defined in `App/config/authorization/policy.xml` that grants users the rights to sign in the given process step.
-
-This rule must specify that users who should be able to sign have the permission rights: _read_, _write_, and _sign_ on the step.
-
-An example of an authorization rule granting these permissions for the _DAGL_ role on the process step with the ID _Task_2_ could look like this:
-
-```xml
-
- Rule that defines that user with role DAGL can read, write and sign for [ORG]/[APP] when it is in Task_2
-
-
-
-
- DAGL
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- Task_2
-
-
-
-
-
-
-
- read
-
-
-
-
-
- write
-
-
-
-
-
- sign
-
-
-
-
-
-
-```
-
-### Configure unique signatures
-
-If an application has multiple signing steps it is possible to ensure that one person cannot sign both steps even if they have the necessary roles.
-
-Example if two members of the board should sign, but the same person cannot perform both signing steps.
-
-To configure this we need to add the first signature dataobject to the list in `` for signing task two
-
-```xml
-
- Flow_1enq1lu
- Flow_0ybpfuh
-
-
- signing
-
- sign
-
-
-
- Model
-
- signature
-
-
-
-
-
- Flow_1enadsf
- Flow_0yadsfh
-
-
- signing
-
- sign
-
-
-
- Model
-
- signature2
-
- signature
-
-
-
-
-
-```
-
-In the example the signing object for Task_2 is stored in the dataType signature, and in signature2 for Task_3.
-
-In addition Task_3s `` has defined that it should be unique from all signature objects stored in dataType `signature`.
-
-```xml
-
- signature
-
-```
-
-### Enable the signer to decline signing
-
-If it should be possible to decline signing and, for example send the instance back to the previous step, this can be done by adding a `reject` action to this process step.
-
-This is then added to the authorization rule, and a separate `ActionButton` is defined that is associated with the `reject` action.
-
-See [Controlling process flow](../../flowcontrol/) for more information.
-
-
-### Signing object stored when user signs
-
-Once the user performs the sign action a signature object will be stored as dataType signature. The signature object will look something like this:
-
-```json
-{
- "id": "ab5b8d43-64a5-482d-bfab-99e5ae6b2f55",
- "instanceGuid": "5267dc93-aa7d-4af9-934b-b0cf5b97d86e",
- "signedTime": "2023-06-16T12:16:36.6250698Z",
- "signeeInfo": {
- "userId": "1337",
- "personNumber": "01039012345",
- "organisationNumber": null
- },
- "dataElementSignatures": [
- {
- "dataElementId": "c71177df-e74d-44a2-976c-0443c98756ba",
- "sha256Hash": "cee2a288ccc273e85f9bdbbc2de52b02d0f0caac80a62e0352bd72689b283286",
- "signed": true
- }
- ]
-}
-```
-
-If multiple dataElements are signed they will be added to the `dataElementSignatures` list.
-
-The field `sha256Hash` contains a hexadecimal encoded SHA256 hash generated from the data stored in Altinn at the time of signing.
-The `signeeInfo` object holds the information about who performed the signing.
-
-### Verifying the SHA256 hash
-The hash value, also referred to as a `digest`, is the output from the SHA256 hashing method. In the example above, the digest has been produced from a file belonging to a specific data element. In other words: the fingerprint of the file the user has signed.
-
-To verify the signature, an independent SHA256 hash of the same file should be produced and then compared to the stored value. If the two values are identical, the file remains unchanged and the signature is valid.
-
-Additional information regarding Altinn's implementation of the SHA256 hashing algorithm and digest can be found on [Github](https://github.com/Altinn/altinn-storage/blob/afa8f921231afc485c17b8f4226f6d8e2333b3dd/src/Storage/Services/DataService.cs#L57). In essence, the digest is a SHA256 hash of the file in question, formatted as a lowercase hexadecimal string without delimiters.
\ No newline at end of file
diff --git a/content/app/development/process/tasks/signing/_index.nb.md b/content/app/development/process/tasks/signing/_index.nb.md
deleted file mode 100644
index a6e9a8e55fc..00000000000
--- a/content/app/development/process/tasks/signing/_index.nb.md
+++ /dev/null
@@ -1,341 +0,0 @@
----
-title: Signerings task
-description: Definer signerings prosess tasks
-tags: [altinn-apps, process, bpmn, task, sign, signing]
-toc: true
----
-
-{{% panel theme="warning" %}}
-⚠️ Signing task krever versjon 8.0.0 eller nyere av app-libs
-{{% /panel %}}
-
-Oppsett av en signeringoppgave i prosessfilen krever litt mer arbeid enn en vanlig data-, bekreftelses- eller tilbakemeldingsoppgave.
-
-Denne siden vil veilede deg gjennom hva du trenger å konfigurere og hvordan det er koblet til andre deler av konfigurasjonen.
-
-## Definere og konfigurere en signeringoppgave
-En signeringoppgave i sin enkleste form ser omtrent slik ut:
-
-```xml
-
- Flow_1enq1lu
- Flow_0ybpfuh
-
-
- signing
-
- sign
-
-
-
- Modell
-
- signatur
-
-
-
-
-```
-### Gjøre signering tilgjengelig som handling
-
-Som med bekreftelsesoppgaver må vi definere de tilgjengelige handlingene. For å generere et signeringobjekt må brukeren kunne utføre handlingen "signer":
-
-```xml
-
- sign
-
-```
-
-"Signer" kan være det eneste alternativet eller kombinert med andre handlinger som "bekreft" og/eller "avvis", avhengig av behovene til hver applikasjon.
-
-### Konfigurere hvilke dataelementer som skal signeres
-
-Når en bruker utfører handlingen "sign", vil konfigurasjonen fra bli brukt til å opprette et signeringobjekt.
-
-For øyeblikket definerer apputvikleren hvilke dataelementer som skal være en del av signeringobjektet ved å definere en liste over datatyper. Dette kan være skjemadata, vedlegg eller PDF-er.
-
-Datatypene er definert i filen App/config/applicationmetadata.json.
-
-I eksemplet med signeringoppgaven ovenfor definerer den at alle dataelementer som er tilknyttet datatypen "Modell", skal være en del av signaturen.
-
-Hvis applikasjonen også har datatypen "attachments", der brukeren legger ved ekstra filer som utvikleren ønsker å være en del av signeringobjektet, bør se slik ut:
-
-```xml
-
-
- Modell
- attachments
-
- signatur
-
-```
-
-### Konfigurere hvor signaturobjektet skal lagres
-
-Et signaturobjekt krever også en datatype der det skal lagres når det er generert. Dette er definert i ``, og må også være definert i `App/config/applicationmetadata.json`.
-
-Eksempel på en applicationmetadata.json-fil med en signaturdatatypen kalt "signatur":
-
-```json
-{
- "id": "ttd/vga-dev-v8",
- "org": "ttd",
- "title": {
- "nb": "vga-dev-v8",
- "en": "vga-dev-v8"
- },
- "dataTypes": [
- {
- "id": "ref-data-as-pdf",
- "allowedContentTypes": [
- "application/pdf"
- ],
- "maxCount": 0,
- "minCount": 0,
- "enablePdfCreation": true
- },
- {
- "id": "Modell",
- "allowedContentTypes": [
- "application/xml"
- ],
- "appLogic": {
- "autoCreate": true,
- "classRef": "Altinn.App.Models.Model",
- "allowAnonymousOnStateless": false,
- "autoDeleteOnProcessEnd": false
- },
- "taskId": "Task_1",
- "maxCount": 1,
- "minCount": 1,
- "enablePdfCreation": true
- },
- {
- "id": "signatur",
- "allowedContentTypes": [
- "application/json"
- ],
- "taskId": "Task_2",
- "maxSize": 25,
- "maxCount": 1,
- "minCount": 0,
- "enablePdfCreation": false
- }
- ],
- "partyTypesAllowed": {
- "bankruptcyEstate": false,
- "organisation": false,
- "person": false,
- "subUnit": false
- },
- "autoDeleteOnProcessEnd": false,
- "created": "2022-10-21T07:30:47.2710111Z",
- "createdBy": "appdeveloper",
- "lastChanged": "2022-10-21T07:30:47.2710121Z",
- "lastChangedBy": "appdeveloper"
-}
-```
-
-### Design layout for signeringssteget
-
-Signeringssteget trenger en layout som definerer hva som skal vises til brukeren. Dette gjøres via en egen layoutset som i sin tur knyttes til signering prosesssteget (`Task_2 i vårt eksempel`)
-
-Hvis du har en v3 applikasjon uten layoutset se [Flere skjema i samme app (layout-sets)](../../../ux/pages/layout-sets/) for hvordan dette settes opp.
-
-Opprett en ny mappe i `App/ui/` med navnet som beskriver dette layoutsettet, f.eks. _signering_. I denne mappen oppretter du så filen `Settings.json` og en mappe med navn `layouts`.
-
-I `layouts` mappen opprettes filer som definerer hvordan sider i dette layoutsettet skal se ut. Det eneste komponenten som en signering layout må ha er en [`ActionButton`](../../../ux/components/actionbutton/) med `"action": "sign"` som definerer at når brukeren trykker på denne så utfører han action sign når han flytter prosessen videre.
-
-Eksempel på en enkel layout med et read only tekst felt og en signeringsknapp kan se sånn her ut:
-
-```json
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- "data": {
- "layout": [
- {
- "id": "name-readonly-input",
- "type": "Input",
- "dataModelBindings": {
- "simpleBinding": "Name"
- },
- "readOnly": true,
- "required": true
- },
- {
- "id": "sign-button",
- "type": "ActionButton",
- "textResourceBindings": {
- "title": "Sign"
- },
- "action": "sign",
- "buttonStyle": "primary"
- }
- ]
- }
-}
-```
-
-### Sett autorisasjons regel som gir bruker lov til å signere
-
-For at brukere skal få lov til å signere må det defineres en regel i `App/config/authorization/policy.xml` som gir brukerne rettigheter til på signere på det nye prosesssteget.
-
-Denne regelen må da definere at brukerene som skal kunne signere har rettighetene _read_, _write_ og _sign_ på steget der signering skal utføres.
-
-Eksempel på en autorisasjonsregel som gir disse tilgangene for _DAGL_-rollen på prosess steg med id _Task_2_:
-
-```xml
-
- Rule that defines that user with role REGNA or DAGL can read and write for [ORG]/[APP] when it is in Task_1
-
-
-
-
- DAGL
-
-
-
-
-
-
-
- [ORG]
-
-
-
- [APP]
-
-
-
- Task_2
-
-
-
-
-
-
-
- read
-
-
-
-
-
- write
-
-
-
-
-
- sign
-
-
-
-
-
-
-```
-
-### Konfigurere unike signaturer
-
-Hvis en applikasjon har flere signeringstrinn, kan du sørge for at én person ikke kan signere begge trinnene selv om de har nødvendige roller.
-
-For eksempel hvis to styremedlemmer skal signere, men samme person ikke kan utføre begge signeringstrinnene.
-
-For å konfigurere dette må vi legge til det første signaturdataobjektet i listen `` for signeringoppgave to:
-
-```xml
-
- Flow_1enq1lu
- Flow_0ybpfuh
-
-
- signing
-
- sign
-
-
-
- Model
-
- signatur
-
-
-
-
-
- Flow_1enadsf
- Flow_0yadsfh
-
-
- signing
-
- sign
-
-
-
- Model
-
- signatur2
-
- signatur
-
-
-
-
-
-```
-
-I eksempelet blir signeringobjektet for oppgave Task_2 lagret i datatypen "signature", og i "signature2" for oppgave Task_3.
-
-I tillegg har Task_3s `` definert at den skal være unik blant alle signaturobjekter som er lagret i datatypen "signatur".
-
-```xml
-
- signatur
-
-```
-
-### Gjøre det mulig for signerer å avslå å signere
-
-Hvis det skal være mulig å avslå å signere og for eksempel sende instansen tilbake til forrige steg kan dette gjøres ved å legge til en `reject` action på dette prosesssteget.
-
-Denne legges da til i autorisasjonsregelen og det defineres en egen ActionButton som knyttes til action `reject`.
-
-Se [Kontroller proess flyt](../../flowcontrol/) for mer informasjon.
-
-### Lagring av signeringobjekt når brukeren signerer
-
-Når brukeren utfører signeringen, vil et signeringobjekt bli lagret som datatypen "signatur". Signeringobjektet vil se omtrent slik ut:
-
-```json
-{
- "id": "ab5b8d43-64a5-482d-bfab-99e5ae6b2f55",
- "instanceGuid": "5267dc93-aa7d-4af9-934b-b0cf5b97d86e",
- "signedTime": "2023-06-16T12:16:36.6250698Z",
- "signeeInfo": {
- "userId": "1337",
- "personNumber": "01039012345",
- "organisationNumber": null
- },
- "dataElementSignatures": [
- {
- "dataElementId": "c71177df-e74d-44a2-976c-0443c98756ba",
- "sha256Hash": "cee2a288ccc273e85f9bdbbc2de52b02d0f0caac80a62e0352bd72689b283286",
- "signed": true
- }
- ]
-}
-```
-
-Hvis flere dataelementer er signert, vil de bli lagt til i listen `dataElementSignatures`.
-
-Feltet `sha256Hash` inneholder en heksadesimal-kodet SHA256 hash generert fra dataene som er lagret i Altinn på tidspunktet for signeringen.
-Objektet `signeeInfo` inneholder informasjonen om hvem som utførte signeringen.
-
-### Verifisering av SHA256 hash
-Også kalt en `digest`, denne verdien er resultatet fra SHA256 hash metoden. I eksempelet over har metoden blitt kjørt på en fil som tilhører et spesifikt dataelement, det vil si filen man har signert.
-
-Det å verifisere signaturen i etterkant går i prinsippet ut på å sammenligne oppgitt `sha256Hash` med en uavhengig SHA256 beregning av samme fil. Hvis verdiene er identiske betyr det at filen brukeren har signert ikke har endret seg, og at signaturen fremdeles er gyldig.
-
-Mer informasjon om Altinn sin implementering av denne utregningen finnes på [Github](https://github.com/Altinn/altinn-storage/blob/afa8f921231afc485c17b8f4226f6d8e2333b3dd/src/Storage/Services/DataService.cs#L57). Kort oppsummert må man generere en SHA256 verdi av filen man vil sammenligne, deretter formattere denne verdien som en heksadesimal streng uten bindestreker og med kun små bokstaver.
\ No newline at end of file
diff --git a/content/app/development/ux/_index.en.md b/content/app/development/ux/_index.en.md
deleted file mode 100644
index 05e13fe8735..00000000000
--- a/content/app/development/ux/_index.en.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: App User Interface
-linktitle: User interface
-description: Configuring components, layouts, pages, grid, etc.
-weight: 20
----
-
-{{}}
diff --git a/content/app/development/ux/_index.nb.md b/content/app/development/ux/_index.nb.md
deleted file mode 100644
index 3b9a431e7ba..00000000000
--- a/content/app/development/ux/_index.nb.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: App brukergrensesnitt
-linktitle: Brukergrensesnitt
-description: Konfigurering av komponenter, layouts, sider, grid, etc.
-weight: 20
----
-
-{{}}
diff --git a/content/app/development/ux/components/ActionButton/_index.en.md b/content/app/development/ux/components/ActionButton/_index.en.md
deleted file mode 100644
index 877bd291205..00000000000
--- a/content/app/development/ux/components/ActionButton/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: ActionButton
-linktitle: ActionButton
-description: # Brief description of what the component does
-schemaname: ActionButton # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/ActionButton/_index.nb.md b/content/app/development/ux/components/ActionButton/_index.nb.md
deleted file mode 100644
index 2427e6b79b4..00000000000
--- a/content/app/development/ux/components/ActionButton/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: ActionButton
-linktitle: ActionButton
-description: # Kort beskrivelse av komponenten
-schemaname: ActionButton # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/Address/_index.en.md b/content/app/development/ux/components/Address/_index.en.md
deleted file mode 100644
index fc5de2303a6..00000000000
--- a/content/app/development/ux/components/Address/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: Address
-linktitle: Address
-description: # Brief description of what the component does
-schemaname: Address # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/Address/_index.nb.md b/content/app/development/ux/components/Address/_index.nb.md
deleted file mode 100644
index b582def971b..00000000000
--- a/content/app/development/ux/components/Address/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: Address
-linktitle: Address
-description: # Kort beskrivelse av komponenten
-schemaname: Address # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/Alert/Alert-anatomy.png b/content/app/development/ux/components/Alert/Alert-anatomy.png
deleted file mode 100644
index aa3fcdbc668..00000000000
Binary files a/content/app/development/ux/components/Alert/Alert-anatomy.png and /dev/null differ
diff --git a/content/app/development/ux/components/Alert/Alert-danger-settings.png b/content/app/development/ux/components/Alert/Alert-danger-settings.png
deleted file mode 100644
index 36dac668647..00000000000
Binary files a/content/app/development/ux/components/Alert/Alert-danger-settings.png and /dev/null differ
diff --git a/content/app/development/ux/components/Alert/Alert-info-settings.png b/content/app/development/ux/components/Alert/Alert-info-settings.png
deleted file mode 100644
index 6835cb97a8b..00000000000
Binary files a/content/app/development/ux/components/Alert/Alert-info-settings.png and /dev/null differ
diff --git a/content/app/development/ux/components/Alert/Alert-settings-panel.png b/content/app/development/ux/components/Alert/Alert-settings-panel.png
deleted file mode 100644
index 15f54c8e795..00000000000
Binary files a/content/app/development/ux/components/Alert/Alert-settings-panel.png and /dev/null differ
diff --git a/content/app/development/ux/components/Alert/Alert-success-settings.png b/content/app/development/ux/components/Alert/Alert-success-settings.png
deleted file mode 100644
index 29e95843532..00000000000
Binary files a/content/app/development/ux/components/Alert/Alert-success-settings.png and /dev/null differ
diff --git a/content/app/development/ux/components/Alert/Alert-text-settings.png b/content/app/development/ux/components/Alert/Alert-text-settings.png
deleted file mode 100644
index 3f50959b1cb..00000000000
Binary files a/content/app/development/ux/components/Alert/Alert-text-settings.png and /dev/null differ
diff --git a/content/app/development/ux/components/Alert/Alert-warning-settings.png b/content/app/development/ux/components/Alert/Alert-warning-settings.png
deleted file mode 100644
index 4ca0b6631e7..00000000000
Binary files a/content/app/development/ux/components/Alert/Alert-warning-settings.png and /dev/null differ
diff --git a/content/app/development/ux/components/Alert/_index.en.md b/content/app/development/ux/components/Alert/_index.en.md
deleted file mode 100644
index a1304bd5914..00000000000
--- a/content/app/development/ux/components/Alert/_index.en.md
+++ /dev/null
@@ -1,333 +0,0 @@
----
-title: Alert
-linktitle: Alert
-description: The component can be used to display a message with different levels of severity.
-schemaname: Alert # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
-aliases:
-- alertcomponent
----
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-Alerts are commonly used to display important information to users that should be highlighted.
-
-### Anatomy
-
-![Alert anatomy](Alert-anatomy.png)
-
-{{% anatomy-list %}}
-1. **Heading**: A brief and descriptive title.
-2. **Icon**: A graphical symbol that conveys the severity of the alert.
-3. **Text content**: The written information or message associated with the alert.
-{{% /anatomy-list %}}
-
-
-### Related
-
-- [`Panel`](../panel/)
-
-
-## Properties
-
-| **Property** | **Type** | **Description** |
-|--------------|------------------------------------------------|------------------------------------------------------------------------------------------------|
-| `severity` | string | String value indicating the severity level of the alert. This affect the styling of the alert. **Enum:** `"success" \| "info" \| "danger" \| "warning"` |
-
-
-
-
-
-
-
-## Configuration
-
-### Add component
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the left-side panel to the middle page area.
-Selecting the component brings up its configuration panel on the right-hand side.
-
-### Settings in Altinn Studio Designer
-
-{{% notice warning %}}
-We are currently updating Altinn Studio with more configuration options!
- The documentation is continuously updated, but more settings may be available than described here, and some settings may be in beta.
-{{% /notice %}}
-
-{{}}
-{{}}
-
-Property settings available in Altinn Studio Designer.
-
-![Altert settings panel](Alert-settings-panel.png "Alert settings panel")
-
-- **Komponent-ID** (`id`): Automatically generated component ID (editable).
-- **Ledetekst** (`textResourceBindings.title`): Alert heading.
-- **Tekstinnhold** (`textResourceBindings.body`): Alert content.
-- **Alvorlighetsgrad** (`severity`): Severity level. Influences the alert's styling (colors and icon).
-
-{{}}
-{{}}
-
-Corresponding settings in the page's JSON file.
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines=""}
-{
- "data": {
- "layout": [
- {
- "id": "alert-id",
- "type": "Alert",
- "severity": "info",
- "textResourceBindings": {
- "title": "",
- "body": ""
- }
- }
- ]
- }
-}
-```
-
-{{}}
-{{}}
-
-### Heading and content
-
-You can add heading and content by creating a new or pick an existing [text resource](/app/development/ux/texts/#add-and-change-texts-in-an-application).
-
-{{}}
-{{}}
-![Alert info innstillinger](Alert-text-settings.png "Alert text settings")
-{{}}
-
-{{}}
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="7-10"}
-{
- "data": {
- "layout": [
- {
- "id": "alert-id",
- "type": "Alert",
- "textResourceBindings": {
- "title": "Vedrørende navneendring",
- "body": "Ved å bekrefte navneendring bekrefter du at du ønsker å endre navnet ditt."
- },
- "severity": "info"
- }
- }
- ]
- }
-}
-```
-{{}}
-{{}}
-
-### Severity level
-
-By changing the severity level, you can change the styling (colors and icon) of the alert.
-
-#### `info`
-
-{{}}
-
-{{}}
-![Info card](info.png)
-{{}}
-
-{{}}
-![Alert info innstillinger](Alert-info-settings.png "Alert info")
-{{}}
-
-{{}}
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="11"}
-{
- "data": {
- "layout": [
- {
- "id": "alert-id",
- "type": "Alert",
- "textResourceBindings": {
- "title": "Vedrørende navneendring",
- "body": "Ved å bekrefte navneendring bekrefter du at du ønsker å endre navnet ditt."
- },
- "severity": "info"
- }
- }
- ]
- }
-}
-```
-{{}}
-{{}}
-
-#### `success`
-
-{{}}
-
-{{}}
-![Success card](success.png)
-{{}}
-
-{{}}
-![Alert success innstillinger](Alert-success-settings.png "Alert success")
-{{}}
-
-{{}}
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="11"}
-{
- "data": {
- "layout": [
- {
- "id": "alert-id",
- "type": "Alert",
- "textResourceBindings": {
- "title": "Vedrørende navneendring",
- "body": "Ved å bekrefte navneendring bekrefter du at du ønsker å endre navnet ditt."
- },
- "severity": "success"
- }
- }
- ]
- }
-}
-```
-{{}}
-{{}}
-
-#### `warning`
-
-{{}}
-
-{{}}
-![Warning card](warning.png)
-{{}}
-
-{{}}
-![Alert warning innstillinger](Alert-warning-settings.png "Alert warning")
-{{}}
-
-{{}}
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="11"}
-{
- "data": {
- "layout": [
- {
- "id": "alert-id",
- "type": "Alert",
- "textResourceBindings": {
- "title": "Vedrørende navneendring",
- "body": "Ved å bekrefte navneendring bekrefter du at du ønsker å endre navnet ditt."
- },
- "severity": "warning"
- }
- }
- ]
- }
-}
-```
-{{}}
-{{}}
-
-#### `danger`
-
-{{}}
-
-{{}}
-![Danger card](danger.png)
-{{}}
-
-{{}}
-![Alert danger innstillinger](Alert-danger-settings.png "Alert danger")
-{{}}
-
-{{}}
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="11"}
-{
- "data": {
- "layout": [
- {
- "id": "alert-id",
- "type": "Alert",
- "textResourceBindings": {
- "title": "Vedrørende navneendring",
- "body": "Ved å bekrefte navneendring bekrefter du at du ønsker å endre navnet ditt."
- },
- "severity": "danger"
- }
- }
- ]
- }
-}
-```
-{{}}
-{{}}
\ No newline at end of file
diff --git a/content/app/development/ux/components/Alert/_index.nb.md b/content/app/development/ux/components/Alert/_index.nb.md
deleted file mode 100644
index 46a3d21fdec..00000000000
--- a/content/app/development/ux/components/Alert/_index.nb.md
+++ /dev/null
@@ -1,337 +0,0 @@
----
-title: Alert
-linktitle: Alert
-description: Komponenten kan brukes til å vise en melding med ulike alvorlighetsgrader.
-schemaname: Alert # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
-aliases:
-- alertcomponent
----
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-Alert brukes ofte til å vise viktig informasjon som skal fremheves for brukerne.
-
-### Anatomi
-
-![Alert anatomy](Alert-anatomy.png)
-
-{{% anatomy-list %}}
-1. **Overskrift**: En kort beskrivende tittel .
-2. **Ikon**: Et grafisk symbol som formidler alvorlighetsgraden av varselet.
-3. **Tekstinnhold**: Skritlig informasjon eller beskjed assosiert med varselet.
-{{% /anatomy-list %}}
-
-### Tilgjengelighet
-
-Komponenten får ikke automatisk `role="alert"`. Dette betyr at skjermlesere ikke vil behandle den som en varsel.
-En Alert bør bare ha `role="alert"` hvis den vises i brukergrensesnittet som et resultat av en handling brukeren har tatt.
-Vi legger automatisk til `role="alert"` hvis `Alert` har en `hidden`-egenskap satt til false. Dette betyr at `Alert`-en
-ble synlig for brukeren basert på en handling brukeren tok.
-
-
-### Relatert
-
-- [`Panel`](../panel/)
-
-
-## Egenskaper
-
-| **Egenskap** | **Type** | **Beskrivelse** |
-|--------------|------------------------------------------------|-----------------------------------------------------------------------------------------------|
-| `severity` | string | Strengverdi som angir alvorlighetsgraden til varselet. Dette påvirker utseendet til varselet. **Enum:** `"success" \| "info" \| "danger" \| "warning"`|
-
-
-
-
-
-
-
-## Konfigurering
-
-### Legg til komponent
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra venstre sidepanel til midten av siden.
-Når du velger komponenten, vises et panel med innstillinger for den på høyre side.
-
-### Innstillinger i Altinn Studio Designer
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende,
- men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-{{}}
-{{}}
-
-Innstillinger for egenskaper tilgjengelig i Altinn Studio Designer.
-
-![Altert innstillingspanel](Alert-settings-panel.png "Innstillinger for Alert")
-
-- **Komponent-ID** (`id`): Automatisk generert komponent-ID (kan redigeres).
-- **Ledetekst** (`textResourceBindings.title`): Overskrift.
-- **Tekstinnhold** (`textResourceBindings.body`): Innholdstekst.
-- **Alvorlighetsgrad** (`severity`): Påvirker varselets useende (farger og ikon).
-
-{{}}
-{{}}
-
-Korresponderende innstillinger i sidens JSON-fil.
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines=""}
-{
- "data": {
- "layout": [
- {
- "id": "alert-id",
- "type": "Alert",
- "severity": "info",
- "textResourceBindings": {
- "title": "",
- "body": ""
- }
- }
- ]
- }
-}
-```
-
-{{}}
-{{}}
-
-### Overskrift og tekstinnhold
-
-Overskrift (ledetekst) og tekstinnhold legges til ved å opprette ny eller velge en eksisterende [tekstressurs](/nb/app/development/ux/texts/#legge-til-og-endre-tekster-i-en-app).
-
-{{}}
-{{}}
-![Alert info innstillinger](Alert-text-settings.png "Alert text settings")
-{{}}
-
-{{}}
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="7-10"}
-{
- "data": {
- "layout": [
- {
- "id": "alert-id",
- "type": "Alert",
- "textResourceBindings": {
- "title": "Vedrørende navneendring",
- "body": "Ved å bekrefte navneendring bekrefter du at du ønsker å endre navnet ditt."
- },
- "severity": "info"
- }
- }
- ]
- }
-}
-```
-{{}}
-{{}}
-
-### Alvorlighetsgrad
-
-Ved å endre alvorlighetsgrad endrer du varselets farger og ikon.
-
-#### `info`
-
-{{}}
-
-{{}}
-![Info card](info.png)
-{{}}
-
-{{}}
-![Alert info innstillinger](Alert-info-settings.png "Alert info")
-{{}}
-
-{{}}
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="11"}
-{
- "data": {
- "layout": [
- {
- "id": "alert-id",
- "type": "Alert",
- "textResourceBindings": {
- "title": "Vedrørende navneendring",
- "body": "Ved å bekrefte navneendring bekrefter du at du ønsker å endre navnet ditt."
- },
- "severity": "info"
- }
- }
- ]
- }
-}
-```
-{{}}
-{{}}
-
-#### `success`
-
-{{}}
-
-{{}}
-![Success card](success.png)
-{{}}
-
-{{}}
-![Alert success innstillinger](Alert-success-settings.png "Alert success")
-{{}}
-
-{{}}
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="11"}
-{
- "data": {
- "layout": [
- {
- "id": "alert-id",
- "type": "Alert",
- "textResourceBindings": {
- "title": "Vedrørende navneendring",
- "body": "Ved å bekrefte navneendring bekrefter du at du ønsker å endre navnet ditt."
- },
- "severity": "success"
- }
- }
- ]
- }
-}
-```
-{{}}
-{{}}
-
-#### `warning`
-
-{{}}
-
-{{}}
-![Warning card](warning.png)
-{{}}
-
-{{}}
-![Alert warning innstillinger](Alert-warning-settings.png "Alert warning")
-{{}}
-
-{{}}
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="11"}
-{
- "data": {
- "layout": [
- {
- "id": "alert-id",
- "type": "Alert",
- "textResourceBindings": {
- "title": "Vedrørende navneendring",
- "body": "Ved å bekrefte navneendring bekrefter du at du ønsker å endre navnet ditt."
- },
- "severity": "warning"
- }
- }
- ]
- }
-}
-```
-{{}}
-{{}}
-
-#### `danger`
-
-{{}}
-
-{{}}
-![Danger card](danger.png)
-{{}}
-
-{{}}
-![Alert danger innstillinger](Alert-danger-settings.png "Alert danger")
-{{}}
-
-{{}}
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="11"}
-{
- "data": {
- "layout": [
- {
- "id": "alert-id",
- "type": "Alert",
- "textResourceBindings": {
- "title": "Vedrørende navneendring",
- "body": "Ved å bekrefte navneendring bekrefter du at du ønsker å endre navnet ditt."
- },
- "severity": "danger"
- }
- }
- ]
- }
-}
-```
-{{}}
-{{}}
\ No newline at end of file
diff --git a/content/app/development/ux/components/Alert/danger.png b/content/app/development/ux/components/Alert/danger.png
deleted file mode 100644
index 121422eb480..00000000000
Binary files a/content/app/development/ux/components/Alert/danger.png and /dev/null differ
diff --git a/content/app/development/ux/components/Alert/info.png b/content/app/development/ux/components/Alert/info.png
deleted file mode 100644
index 60b39fc1444..00000000000
Binary files a/content/app/development/ux/components/Alert/info.png and /dev/null differ
diff --git a/content/app/development/ux/components/Alert/success.png b/content/app/development/ux/components/Alert/success.png
deleted file mode 100644
index e7b3097040c..00000000000
Binary files a/content/app/development/ux/components/Alert/success.png and /dev/null differ
diff --git a/content/app/development/ux/components/Alert/warning.png b/content/app/development/ux/components/Alert/warning.png
deleted file mode 100644
index cf57d843a18..00000000000
Binary files a/content/app/development/ux/components/Alert/warning.png and /dev/null differ
diff --git a/content/app/development/ux/components/AttachmentList/_index.en.md b/content/app/development/ux/components/AttachmentList/_index.en.md
deleted file mode 100644
index 74b6e47086c..00000000000
--- a/content/app/development/ux/components/AttachmentList/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: AttachmentList
-linktitle: AttachmentList
-description: # Brief description of what the component does
-schemaname: AttachmentList # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/AttachmentList/_index.nb.md b/content/app/development/ux/components/AttachmentList/_index.nb.md
deleted file mode 100644
index 704e7d01d89..00000000000
--- a/content/app/development/ux/components/AttachmentList/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: AttachmentList
-linktitle: AttachmentList
-description: # Kort beskrivelse av komponenten
-schemaname: AttachmentList # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/Button/_index.en.md b/content/app/development/ux/components/Button/_index.en.md
deleted file mode 100644
index b6d4c57c7db..00000000000
--- a/content/app/development/ux/components/Button/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: Button
-linktitle: Button
-description: # Brief description of what the component does
-schemaname: Button # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/Button/_index.nb.md b/content/app/development/ux/components/Button/_index.nb.md
deleted file mode 100644
index db9cb1a010c..00000000000
--- a/content/app/development/ux/components/Button/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: Button
-linktitle: Button
-description: # Kort beskrivelse av komponenten
-schemaname: Button # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/Checkboxes/Checkboxes-anatomy.png b/content/app/development/ux/components/Checkboxes/Checkboxes-anatomy.png
deleted file mode 100644
index 75a73d8ce2d..00000000000
Binary files a/content/app/development/ux/components/Checkboxes/Checkboxes-anatomy.png and /dev/null differ
diff --git a/content/app/development/ux/components/Checkboxes/Checkboxes-text-anatomy.png b/content/app/development/ux/components/Checkboxes/Checkboxes-text-anatomy.png
deleted file mode 100644
index 6a413321c42..00000000000
Binary files a/content/app/development/ux/components/Checkboxes/Checkboxes-text-anatomy.png and /dev/null differ
diff --git a/content/app/development/ux/components/Checkboxes/Manuelt-settings.png b/content/app/development/ux/components/Checkboxes/Manuelt-settings.png
deleted file mode 100644
index aacc4f7bf36..00000000000
Binary files a/content/app/development/ux/components/Checkboxes/Manuelt-settings.png and /dev/null differ
diff --git a/content/app/development/ux/components/Checkboxes/Visning-column.png b/content/app/development/ux/components/Checkboxes/Visning-column.png
deleted file mode 100644
index 598643b57b7..00000000000
Binary files a/content/app/development/ux/components/Checkboxes/Visning-column.png and /dev/null differ
diff --git a/content/app/development/ux/components/Checkboxes/Visning-row.png b/content/app/development/ux/components/Checkboxes/Visning-row.png
deleted file mode 100644
index 82c22393ce0..00000000000
Binary files a/content/app/development/ux/components/Checkboxes/Visning-row.png and /dev/null differ
diff --git a/content/app/development/ux/components/Checkboxes/_index.en.md b/content/app/development/ux/components/Checkboxes/_index.en.md
deleted file mode 100644
index 35a0d296846..00000000000
--- a/content/app/development/ux/components/Checkboxes/_index.en.md
+++ /dev/null
@@ -1,138 +0,0 @@
----
-title: Checkboxes
-linktitle: Checkboxes
-description: Input element that allows the user to select or deselect choices for one or more options.
-schemaname: Checkboxes # Component schema name used to autogenerate list of properies from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the componets will be sorted alphabetically
-toc: true
-aliases:
-- checkbox
----
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-Checkboxes are often used in forms to gather input from the user, allowing them to select one or more options from a list.
-
-#### Use checkboxes when:
-* Users can select multiple options from a list.
-* An explicit choice needs to be made to use the settings (e.g., confirming that the user has read a document).
-
-### Anatomy
-
-![Checkbox Anatomy](Checkboxes-anatomy.png)
-
-{{% anatomy-list %}}
-1. **Heading** - Question or instruction.
-2. **Checkbox** - The choice control.
-3. **Label** - Text label associated with the checkbox.
-{{% /anatomy-list %}}
-
-### Style
-
-* Checkboxes should always have an associated label on the right side.
-
-### Best Practices
-
-* Checkboxes with disabled options should be avoided.
- If an option is unavailable, it should be removed, and an explanation should be provided for why the option is missing.
-
-### Content guidelines
-
-* Keep labels short and descriptive.
-* Start all labels with a capital letter.
-* Do not include punctuation after labels.
-
-### Related
-
-* For a more compact way to display multiple options with multiple selection, use [MultipleSelect](../multipleselect/).
-* If the user can only select one option from a list, use [RadioButtons](../radiobuttons).
-* For a more compact way to display multiple options with single selection, use [Dropdown](../dropdown).
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio with more configuration options!
- The documentation is continuously updated, but more settings may be available than described here, and some settings may be in beta.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-14"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- "id": "Image-id",
- "type": "Image",
- "image": {
- "src": {},
- "width": "100%",
- "align": "center"
- }
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-{{< property-docs prop="text-all" >}}
-
-{{< property-docs prop="dataModelBindings" >}}
-
-{{< property-docs prop="options-page" >}}
-
-{{< property-docs prop="readOnly" >}}
-
-{{< property-docs prop="required" >}}
-
-{{< property-docs prop="layout" >}}
-
-{{< property-docs prop="preselectedOptionsIndex" >}}
-
-{{< property-docs prop="renderAsSummary" >}}
-
-{{< property-docs prop="hidden" >}}
-
-{{< property-docs prop="page-break" >}}
-
-{{< property-docs prop="grid-short" >}}
-
-
diff --git a/content/app/development/ux/components/Checkboxes/_index.nb.md b/content/app/development/ux/components/Checkboxes/_index.nb.md
deleted file mode 100644
index a63f1b513fd..00000000000
--- a/content/app/development/ux/components/Checkboxes/_index.nb.md
+++ /dev/null
@@ -1,137 +0,0 @@
----
-title: Avkrysningsbokser
-linktitle: Avkrysningsbokser
-description: Inndataelement som lar brukeren velge eller fjerne valg for ett eller flere alternativer.
-schemaname: Checkboxes # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
-aliases:
-- checkbox
----
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-Avkrysningsbokser brukes ofte i skjemaer for å samle input fra brukeren,
- slik at de kan velge ett eller flere alternativer fra en liste.
-
- #### Bruk avkrysningsbokser når:
- * Brukere kan velge flere alternativer fra en liste.
- * Det må gjøres et eksplisitt valg for å bruke innstillingene (f.eks. bekrefte at brukeren har lest et dokument).
-
-### Anatomi
-
-![Anatomi avkrysningsbokser](Checkboxes-anatomy.png)
-
-{{% anatomy-list %}}
-1. **Overskrift** - Spørsmål eller instruksjon.
-2. **Avkrysningsboks** - Valgkontrollen.
-3. **Etikett** - Tekstetikett knyttet til avkrysningsboksen.
-{{% /anatomy-list %}}
-
-### Stil
-
-* Avkrysningsbokser bør alltid ha en tilknyttet etikett på høyre side.
-
-### Beste praksis
-
-* Avkrysningsbokser med deaktivert valg bør unngås.
- Hvis et alternativ er utilgjengelig bør det fjernes og en forklaring gitt for hvorfor alternativet mangler.
-
- ### Veiledning for innhold
-
-* Hold etikettene korte og beskrivende.
-* Begynn alle etiketter med stor bokstav.
-* Ikke inkluder tegnsetting etter etikettene.
-
-### Relatert
-
-* For en mer kompakt måte å vise flere alternativer med flervalg, bruk [MultipleSelect](../multipleselect/).
-* Hvis brukeren bare kan velge ett alternativ fra en liste, bruk [RadioButtons](../radiobuttons).
-* For en mer kompakt måte å vise flere alternativer med enkeltvalg, bruk en [rullegardinmeny](../dropdown).
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-14"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-{{< property-docs prop="text-all" >}}
-
-{{< property-docs prop="dataModelBindings" >}}
-
-{{< property-docs prop="options-page" >}}
-
-{{< property-docs prop="readOnly" >}}
-
-{{< property-docs prop="required" >}}
-
-{{< property-docs prop="layout" >}}
-
-{{< property-docs prop="preselectedOptionsIndex" >}}
-
-{{< property-docs prop="renderAsSummary" >}}
-
-{{< property-docs prop="hidden" >}}
-
-{{< property-docs prop="page-break" >}}
-
-{{< property-docs prop="grid-short" >}}
-
-
diff --git a/content/app/development/ux/components/Custom/_index.en.md b/content/app/development/ux/components/Custom/_index.en.md
deleted file mode 100644
index c8807b281d0..00000000000
--- a/content/app/development/ux/components/Custom/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: Custom
-linktitle: Custom
-description: # Brief description of what the component does
-schemaname: Custom # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/Custom/_index.nb.md b/content/app/development/ux/components/Custom/_index.nb.md
deleted file mode 100644
index d44ba3a8640..00000000000
--- a/content/app/development/ux/components/Custom/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: Custom
-linktitle: Custom
-description: # Kort beskrivelse av komponenten
-schemaname: Custom # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/Datepicker/_index.en.md b/content/app/development/ux/components/Datepicker/_index.en.md
deleted file mode 100644
index a637ecb5198..00000000000
--- a/content/app/development/ux/components/Datepicker/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: Datepicker
-linktitle: Datepicker
-description: # Brief description of what the component does
-schemaname: Datepicker # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/Datepicker/_index.nb.md b/content/app/development/ux/components/Datepicker/_index.nb.md
deleted file mode 100644
index 34e7bf50ca1..00000000000
--- a/content/app/development/ux/components/Datepicker/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: Datepicker
-linktitle: Datepicker
-description: # Kort beskrivelse av komponenten
-schemaname: Datepicker # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/FileUpload/_index.en.md b/content/app/development/ux/components/FileUpload/_index.en.md
deleted file mode 100644
index c18a4ab9479..00000000000
--- a/content/app/development/ux/components/FileUpload/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: FileUpload
-linktitle: FileUpload
-description: # Brief description of what the component does
-schemaname: FileUpload # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/FileUpload/_index.nb.md b/content/app/development/ux/components/FileUpload/_index.nb.md
deleted file mode 100644
index 12665896d15..00000000000
--- a/content/app/development/ux/components/FileUpload/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: FileUpload
-linktitle: FileUpload
-description: # Kort beskrivelse av komponenten
-schemaname: FileUpload # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/FileUploadWithTag/_index.en.md b/content/app/development/ux/components/FileUploadWithTag/_index.en.md
deleted file mode 100644
index 8d505c75779..00000000000
--- a/content/app/development/ux/components/FileUploadWithTag/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: FileUploadWithTag
-linktitle: FileUploadWithTag
-description: # Brief description of what the component does
-schemaname: FileUploadWithTag # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/FileUploadWithTag/_index.nb.md b/content/app/development/ux/components/FileUploadWithTag/_index.nb.md
deleted file mode 100644
index 6988bdf4b45..00000000000
--- a/content/app/development/ux/components/FileUploadWithTag/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: FileUploadWithTag
-linktitle: FileUploadWithTag
-description: # Kort beskrivelse av komponenten
-schemaname: FileUploadWithTag # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/Group/_index.en.md b/content/app/development/ux/components/Group/_index.en.md
deleted file mode 100644
index 7f5449945e8..00000000000
--- a/content/app/development/ux/components/Group/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: Group
-linktitle: Group
-description: # Brief description of what the component does
-schemaname: Group # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/Group/_index.nb.md b/content/app/development/ux/components/Group/_index.nb.md
deleted file mode 100644
index 7bc7483ece0..00000000000
--- a/content/app/development/ux/components/Group/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: Group
-linktitle: Group
-description: # Kort beskrivelse av komponenten
-schemaname: Group # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/Header/_index.en.md b/content/app/development/ux/components/Header/_index.en.md
deleted file mode 100644
index b7490cbf17c..00000000000
--- a/content/app/development/ux/components/Header/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: Header
-linktitle: Header
-description: # Brief description of what the component does
-schemaname: Header # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/Header/_index.nb.md b/content/app/development/ux/components/Header/_index.nb.md
deleted file mode 100644
index e3fbc19200a..00000000000
--- a/content/app/development/ux/components/Header/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: Header
-linktitle: Header
-description: # Kort beskrivelse av komponenten
-schemaname: Header # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/Input/_index.en.md b/content/app/development/ux/components/Input/_index.en.md
deleted file mode 100644
index 3981e350de1..00000000000
--- a/content/app/development/ux/components/Input/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: Input
-linktitle: Input
-description: # Brief description of what the component does
-schemaname: Input # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/Input/_index.nb.md b/content/app/development/ux/components/Input/_index.nb.md
deleted file mode 100644
index 72ee4144e0b..00000000000
--- a/content/app/development/ux/components/Input/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: Input
-linktitle: Input
-description: # Kort beskrivelse av komponenten
-schemaname: Input # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/InstanceInformation/_index.en.md b/content/app/development/ux/components/InstanceInformation/_index.en.md
deleted file mode 100644
index a296d8686a3..00000000000
--- a/content/app/development/ux/components/InstanceInformation/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: InstanceInformation
-linktitle: InstanceInformation
-description: # Brief description of what the component does
-schemaname: InstanceInformation # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/InstanceInformation/_index.nb.md b/content/app/development/ux/components/InstanceInformation/_index.nb.md
deleted file mode 100644
index 8968b5356b4..00000000000
--- a/content/app/development/ux/components/InstanceInformation/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: InstanceInformation
-linktitle: InstanceInformation
-description: # Kort beskrivelse av komponenten
-schemaname: InstanceInformation # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/InstantiationButton/_index.en.md b/content/app/development/ux/components/InstantiationButton/_index.en.md
deleted file mode 100644
index d7680eb1f4e..00000000000
--- a/content/app/development/ux/components/InstantiationButton/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: InstantiationButton
-linktitle: InstantiationButton
-description: # Brief description of what the component does
-schemaname: InstantiationButton # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/InstantiationButton/_index.nb.md b/content/app/development/ux/components/InstantiationButton/_index.nb.md
deleted file mode 100644
index e93d2f7d8c4..00000000000
--- a/content/app/development/ux/components/InstantiationButton/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: InstantiationButton
-linktitle: InstantiationButton
-description: # Kort beskrivelse av komponenten
-schemaname: InstantiationButton # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/Map/_index.en.md b/content/app/development/ux/components/Map/_index.en.md
deleted file mode 100644
index cbcce5c8164..00000000000
--- a/content/app/development/ux/components/Map/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: Map
-linktitle: Map
-description: # Brief description of what the component does
-schemaname: Map # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/Map/_index.nb.md b/content/app/development/ux/components/Map/_index.nb.md
deleted file mode 100644
index 0e96daf1d28..00000000000
--- a/content/app/development/ux/components/Map/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: Map
-linktitle: Map
-description: # Kort beskrivelse av komponenten
-schemaname: Map # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/NavigationBar/_index.en.md b/content/app/development/ux/components/NavigationBar/_index.en.md
deleted file mode 100644
index d8f5b2b2dc4..00000000000
--- a/content/app/development/ux/components/NavigationBar/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: NavigationBar
-linktitle: NavigationBar
-description: # Brief description of what the component does
-schemaname: NavigationBar # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/NavigationBar/_index.nb.md b/content/app/development/ux/components/NavigationBar/_index.nb.md
deleted file mode 100644
index b11469e50db..00000000000
--- a/content/app/development/ux/components/NavigationBar/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: NavigationBar
-linktitle: NavigationBar
-description: # Kort beskrivelse av komponenten
-schemaname: NavigationBar # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/NavigationButtons/_index.en.md b/content/app/development/ux/components/NavigationButtons/_index.en.md
deleted file mode 100644
index 47a4498a4dc..00000000000
--- a/content/app/development/ux/components/NavigationButtons/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: NavigationButtons
-linktitle: NavigationButtons
-description: # Brief description of what the component does
-schemaname: NavigationButtons # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/NavigationButtons/_index.nb.md b/content/app/development/ux/components/NavigationButtons/_index.nb.md
deleted file mode 100644
index 23611dd6432..00000000000
--- a/content/app/development/ux/components/NavigationButtons/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: NavigationButtons
-linktitle: NavigationButtons
-description: # Kort beskrivelse av komponenten
-schemaname: NavigationButtons # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/Paragraph/_index.en.md b/content/app/development/ux/components/Paragraph/_index.en.md
deleted file mode 100644
index 53c84dce180..00000000000
--- a/content/app/development/ux/components/Paragraph/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: Paragraph
-linktitle: Paragraph
-description: # Brief description of what the component does
-schemaname: Paragraph # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/Paragraph/_index.nb.md b/content/app/development/ux/components/Paragraph/_index.nb.md
deleted file mode 100644
index d7c5711a404..00000000000
--- a/content/app/development/ux/components/Paragraph/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: Paragraph
-linktitle: Paragraph
-description: # Kort beskrivelse av komponenten
-schemaname: Paragraph # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/Summary/_index.en.md b/content/app/development/ux/components/Summary/_index.en.md
deleted file mode 100644
index e7948ebd526..00000000000
--- a/content/app/development/ux/components/Summary/_index.en.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: Summary
-linktitle: Summary
-description: # Brief description of what the component does
-schemaname: Summary # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/Summary/_index.nb.md b/content/app/development/ux/components/Summary/_index.nb.md
deleted file mode 100644
index 73e12963be4..00000000000
--- a/content/app/development/ux/components/Summary/_index.nb.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: Summary
-linktitle: Summary
-description: # Kort beskrivelse av komponenten
-schemaname: Summary # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/_common-props-content/_INSTRUCTIONS.md b/content/app/development/ux/components/_common-props-content/_INSTRUCTIONS.md
deleted file mode 100644
index 45ebbe750ab..00000000000
--- a/content/app/development/ux/components/_common-props-content/_INSTRUCTIONS.md
+++ /dev/null
@@ -1,80 +0,0 @@
----
-hidden: true
----
-
-# Instruksjoner
-
-Innholdet i malen brukes av en partial (`get-content.html`) via shortcoden `property-docs.html`.
-* `get-content.html` finner seksjoner som starter med `` og slutter med ``
- og henter ut innholdet mellom disse (`*` = seksjonsnavn).
-* `property-docs.html` får innholdet fra `get-content.html` og viser det i riktig format.
- * Shortcoden kalles med argumentet `prop="{propName}"`. `propName` må samsvare med filnavn (se under).
-
-## Hvordan bruke malen
-1. **Filnavn**: Kopier malen (denne eller [_TEMPLATE.md](/app/development/ux/components/_common-props-content/_template)) og gi den navn på formatet `{propName}.{languageCode}.md`. Opprett en fil for hvert språk. Alle filer skal ligge direkte under `_common-props-content`.
-2. **Legg til innhold**: Legg til innhold mellom `begin`- og `end`-kommentarer. Se beskrivelse over hver seksjon. **NB! `begin`- og `end`-kommentarer må ikke endres eller slettes!**
-3. **Bilder**: Bilder skal ligge i mappen `/assets/images/component-settings/`. For å legge til bilder, bruk shortcode `image.html` med argument
- `file="component-settings/{screenshot.png}"`.
-4. **Legg til dokumentasjonen**: Bruk shortcode `property-docs` med hakeparenteser (`< >`) og argument `prop="{propName}"`. `propName` må samsvare med filnavn.
-
-# Innhold
-
-## Intro
-Denne seksjonen skal inneholde en overskrift med navnet på egenskapen og kodenavnet i parentes
- etterfulgt av en beskrivelse av egenskapen.
-
----
-
-### Egenskap (`egenskap`)
-
-
----
-
-## Innstillinger i Altinn Studio
-Innholdet i denne seksjonen vises i tab-en "Altinn Studio Designer".
- Hvis det ikke er noe innhold vises ikke tab-en i det hele tatt (fjern i så fall eksempelinnhold).
- Merk at bilder må legges til med shortcode!
-
----
-
-
-Innstillinger i Altinn Studio.
-
-
-{{% image file="component-settings/screenshot.png" %}}
-
-
----
-
-## Innstillinger i kode (JSON)
-Innholdet i denne seksjonen vises i tab-en "Kode".
- Hvis det ikke er noe innhold vises ikke tab-en i det hele tatt (fjern i så fall eksempelinnhold).
-
----
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines=""}
-{
- "id": "komponent-id",
- // property code
-
-}
-```
-
-
----
-
-## Mer
-Innholdet i denne seksjonen vises etter tab-visning og kan brukes til å legge til forklaring av innstillinger,
- bildeeksempler eller utdypinger.
-
----
-
-
-
-
----
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/_TEMPLATE.md b/content/app/development/ux/components/_common-props-content/_TEMPLATE.md
deleted file mode 100644
index 81c02955438..00000000000
--- a/content/app/development/ux/components/_common-props-content/_TEMPLATE.md
+++ /dev/null
@@ -1,53 +0,0 @@
----
-hidden: true
----
-
-# Instruksjoner
-
-1. **Filnavn**: Kopier malen og gi den navn på formatet `{propName}.{languageCode}.md`. Opprett en fil for hvert språk. Alle filer skal ligge direkte under `_common-props-content`.
-2. **Legg til innhold**: Legg til innhold mellom `begin`- og `end`-kommentarer. For å utelate seksjoner, la de være tomme. **NB! `begin`- og `end`-kommentarer må ikke endres eller slettes!**
-3. **Bilder**: Bilder må ligge i mappen `/assets/images/component-settings/`. For å legge til bilder, bruk shortcode `image.html` med argument
- `file="component-settings/{image.png}"`.
-4. **Legg til dokumentasjonen**: Bruk shortcode `property-docs` med hakeparenteser (`< >`) og argument `prop="{propName}"`. `propName` må samsvare med filnavn.
-
-For mer veiledning, se [_INSTRUCTIONS.md](/app/development/ux/components/_common-props-content/_instructions).
-
-# Innhold
-
-
-### Egenskap (`egenskap`)
-
-
-
-
-
-
-Innstillinger i Altinn Studio.
-
-
-{{% image file="component-settings/screenshot.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines=""}
-{
- "id": "komponent-id",
- // property code
-
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/autocomplete.en.md b/content/app/development/ux/components/_common-props-content/autocomplete.en.md
deleted file mode 100644
index a8720a96fbf..00000000000
--- a/content/app/development/ux/components/_common-props-content/autocomplete.en.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-hidden: true
----
-
-
-### Autocomplete (`autocomplete`)
-The HTML `autocomplete` attribute lets you specify what if any permission the user agent has to provide
- automated assistance in filling out form field values, as well as guidance to the browser as to the type of information expected in the field.
-
-
-
-
-
-{{% image file="component-settings/autocomplete.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4"}
-{
- "id": "komponent-id",
- ...
- "autocomplete": "given-name"
-
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/autocomplete.nb.md b/content/app/development/ux/components/_common-props-content/autocomplete.nb.md
deleted file mode 100644
index 4736e48c7ee..00000000000
--- a/content/app/development/ux/components/_common-props-content/autocomplete.nb.md
+++ /dev/null
@@ -1,39 +0,0 @@
----
-hidden: true
----
-
-
-### Automatisk fullføring (`autocomplete`)
-Automatisk fullføring (`autocomplete`) lar deg spesifisere om, og i hvilken grad, brukeragenten har tillatelse til å gi automatisert hjelp med utfylling av verdier i skjemafelter, samt gi veiledning til nettleseren om hvilken type informasjon som forventes i feltet.
-
-
-
-
-
-{{% image file="component-settings/autocomplete.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4"}
-{
- "id": "komponent-id",
- ...
- "autocomplete": "given-name"
-
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/dataModelBindings.en.md b/content/app/development/ux/components/_common-props-content/dataModelBindings.en.md
deleted file mode 100644
index 64b4a453052..00000000000
--- a/content/app/development/ux/components/_common-props-content/dataModelBindings.en.md
+++ /dev/null
@@ -1,47 +0,0 @@
----
-hidden: true
----
-
-
-### Data Model
-
-To store and manipulate the data collected by the component, the component must be linked to a field in a [data model](/app/development/data/data-modeling/#data-models).
- The option values are stored as strings.
-
-
-
-
-
-
-Select the field you want to link the component to from the dropdown menu.
- If there are no fields available, you must first [upload a data model](/app/development/data/data-modeling/#upload-and-display-data-model).
-
-
-{{% image file="component-settings/dataModelBindings.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4-6"}
-{
- "id": "komponent-id",
- ...
- "dataModelBindings": {
- "simpleBinding": "MyDataModel.SomeField"
- }
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/dataModelBindings.nb.md b/content/app/development/ux/components/_common-props-content/dataModelBindings.nb.md
deleted file mode 100644
index f3dfed28dfe..00000000000
--- a/content/app/development/ux/components/_common-props-content/dataModelBindings.nb.md
+++ /dev/null
@@ -1,47 +0,0 @@
----
-hidden: true
----
-
-
-### Datamodell
-
-For at det skal være mulig å lagre og manipulere informasjonen må komponenten kobles til et felt i en [datamodell](/nb/app/development/data/data-modeling/#datamodeller).
-Verdiene til alternativene lagres som streng.
-
-
-
-
-
-
-Velg feltet du ønsker å koble komponenten til fra nedtrekksmenyen.
- Hvis det ikke er noen felter tilgjengelig må du først [laste opp en datamodell](/nb/app/development/data/data-modeling/#laste-opp-og-vise-datamodell).
-
-
-{{% image file="component-settings/dataModelBindings.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4-6"}
-{
- "id": "komponent-id",
- ...
- "dataModelBindings": {
- "simpleBinding": "MyDataModel.SomeField"
- }
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/grid-short.en.md b/content/app/development/ux/components/_common-props-content/grid-short.en.md
deleted file mode 100644
index 9365dd0d9cc..00000000000
--- a/content/app/development/ux/components/_common-props-content/grid-short.en.md
+++ /dev/null
@@ -1,49 +0,0 @@
----
-hidden: true
----
-
-
-### Horizontal alignment with `grid`
-
-{{% notice info %}}
-`grid` settings are not yet supported in the form editor but can be configured manually.
-{{% /notice %}}
-
-The `grid` property controls horizontal alignment based on a 12-column layout.
- Items are allocated fractions of 12 which sets their width relative to the screen width.
- In the example below, we set the component's width to 2/12 of the screen width for all screen sizes (from `xs` and up).
-
-
-
-
-
-
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines=["4-6"]}
-{
- "id": "komponent-id",
- ...
- "grid": {
- "xs": 2,
- }
-}
-```
-
-
-
-
-
-You can also use `grid` to place items side by side.
-
-See [Components placed side by side (grid)](/app/development/ux/styling/#components-placed-side-by-side-grid) for details and examples.
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/grid-short.nb.md b/content/app/development/ux/components/_common-props-content/grid-short.nb.md
deleted file mode 100644
index 32da17837e8..00000000000
--- a/content/app/development/ux/components/_common-props-content/grid-short.nb.md
+++ /dev/null
@@ -1,49 +0,0 @@
----
-hidden: true
----
-
-
-### Horisontal justering med `grid`
-
-{{% notice info %}}
-Innstillinger for komponenten er ikke støttet i skjemaeditor ennå, men kan konfigureres manuelt.
-{{% /notice %}}
-
-`grid`-egenskapen kontrollerer horisontal justering av komponenten basert på en layout med 12 kolonner.
- Elementer tildeles brøkdeler av 12 som bestemmer deres bredde i forhold til skjermbredden.
- I eksemplet nedenfor setter vi komponentens bredde til 2/12 av skjermbredden for alle skjermstørrelser (fra `xs` og opp).
-
-
-
-
-
-
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines=["4-6"]}
-{
- "id": "komponent-id",
- ...
- "grid": {
- "xs": 2,
- }
-}
-```
-
-
-
-
-
-Du kan også bruke `grid` for å sidestille komponenter.
-
-Se [Sidestilte komponenter (grid)](/nb/app/development/ux/styling/#sidestilte-komponenter-grid) for detaljer og eksempler.
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/hidden.en.md b/content/app/development/ux/components/_common-props-content/hidden.en.md
deleted file mode 100644
index 9ba159c5a4a..00000000000
--- a/content/app/development/ux/components/_common-props-content/hidden.en.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-hidden: true
----
-
-
-### Hidden (`hidden`)
-
-Indicates whether the field should be hidden or not (default: `false`).
-
-
-
-
-
-
-{{% image file="component-settings/hidden.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4"}
-{
- "id": "komponent-id",
- ...
- "hidden": false
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/hidden.nb.md b/content/app/development/ux/components/_common-props-content/hidden.nb.md
deleted file mode 100644
index 30a595d37c2..00000000000
--- a/content/app/development/ux/components/_common-props-content/hidden.nb.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-hidden: true
----
-
-
-### Feltet skal skjules (`hidden`)
-
-Indikerer om feltet skal skjules eller ikke (standard: `false`).
-
-
-
-
-
-
-{{% image file="component-settings/hidden.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4"}
-{
- "id": "komponent-id",
- ...
- "hidden": false
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/layout.en.md b/content/app/development/ux/components/_common-props-content/layout.en.md
deleted file mode 100644
index 4a872b85005..00000000000
--- a/content/app/development/ux/components/_common-props-content/layout.en.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-hidden: true
----
-
-
-### Layout (`layout`)
-
-Displays the alternatives in a column (`column`) (default for more than two options) or row (`row`) (default for up to two options).
-
-
-
-
-
-
-{{% image file="component-settings/layout.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4"}
-{
- "id": "komponent-id",
- ...
- "layout": "row"
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/layout.nb.md b/content/app/development/ux/components/_common-props-content/layout.nb.md
deleted file mode 100644
index abf5d13bdf1..00000000000
--- a/content/app/development/ux/components/_common-props-content/layout.nb.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-hidden: true
----
-
-
-### Visning (`layout`)
-
-Viser alternativene som kolonne (`column`) (standard for mer enn to alternativer) eller rad (`row`) (standard for opp til to alternativer).
-
-
-
-
-
-
-{{% image file="component-settings/layout.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4"}
-{
- "id": "komponent-id",
- ...
- "layout": "row"
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/options-page.en.md b/content/app/development/ux/components/_common-props-content/options-page.en.md
deleted file mode 100644
index e4d61b49685..00000000000
--- a/content/app/development/ux/components/_common-props-content/options-page.en.md
+++ /dev/null
@@ -1,19 +0,0 @@
----
-hidden: true
----
-
-### Adding Options
-
-Options can be added manually or by using [code lists](/app/development/data/options).
-
-{{< property-docs prop="options" >}}
-
-{{< property-docs prop="optionsId" >}}
-
-{{< property-docs prop="source" >}}
-
-**Documentation for code lists**
-- [Link a Component to a Code List](/app/development/data/options/#connect-the-component-to-options-code-list)
-- [Static Code Lists](/app/development/data/options/static-codelists/)
-- [Dynamic Code Lists](/app/development/data/options/dynamic-codelists/)
-- [Code lists based on repeating groups from the data model](/app/development/data/options/repeating-group-codelists/)
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/options-page.nb.md b/content/app/development/ux/components/_common-props-content/options-page.nb.md
deleted file mode 100644
index 766342f51e3..00000000000
--- a/content/app/development/ux/components/_common-props-content/options-page.nb.md
+++ /dev/null
@@ -1,19 +0,0 @@
----
-hidden: true
----
-
-### Legge til alternativer
-
-Alternativer (options) kan legges til manuelt eller ved hjelp av [kodelister](/nb/app/development/data/options).
-
-{{< property-docs prop="options" >}}
-
-{{< property-docs prop="optionsId" >}}
-
-{{< property-docs prop="source" >}}
-
-**Dokumentasjon for kodelister**
-- [Koble en komponent til kodeliste](/nb/app/development/data/options/#koble-en-komponent-til-kodeliste)
-- [Statiske kodelister](/nb/app/development/data/options/static-codelists/)
-- [Dynamiske kodelister](/nb/app/development/data/options/dynamic-codelists/)
-- [Dynamiske kodelister fra repeterede grupper i datamodellen](/nb/app/development/data/options/repeating-group-codelists/)
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/options.en.md b/content/app/development/ux/components/_common-props-content/options.en.md
deleted file mode 100644
index e52c5020dab..00000000000
--- a/content/app/development/ux/components/_common-props-content/options.en.md
+++ /dev/null
@@ -1,48 +0,0 @@
----
-hidden: true
----
-
-
-#### Manually (`options`)
-
-
-
-
-
-
-Select "Manuelt" and click "Legg til flere" to add a new option. Choose or create a new text to add a label (`label`).
-
-The option comes with a pre-filled value (`value`), which is the data that is stored when the user makes a selection.
- The value is stored as a string and can be changed as you wish.
-
-{{% image file="component-settings/options-checkboxes.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4-9"}
-{
- "id": "komponent-id",
- ...
- "options": [
- {
- "label": "Alternativ 1",
- "value": "1"
- }
- ]
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/options.nb.md b/content/app/development/ux/components/_common-props-content/options.nb.md
deleted file mode 100644
index 5a82f4fc788..00000000000
--- a/content/app/development/ux/components/_common-props-content/options.nb.md
+++ /dev/null
@@ -1,48 +0,0 @@
----
-hidden: true
----
-
-
-#### Manuelt (`options`)
-
-
-
-
-
-
-Velg "Manuelt" og klikk "Legg til flere" for å til et nytt alternativ. Velg eller opprett ny tekst for å legge til etikett (`label`).
-
-Alternativet kommer med en forhåndsutfylt verdi (`value`), som er dataen som lagres når brukeren gjør et valg.
- Endre verdien til det som passer.
-
-{{% image file="component-settings/options-checkboxes.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4-9"}
-{
- "id": "komponent-id",
- ...
- "options": [
- {
- "label": "Alternativ 1",
- "value": "1"
- }
- ]
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/optionsId.en.md b/content/app/development/ux/components/_common-props-content/optionsId.en.md
deleted file mode 100644
index 2cfe3aa4552..00000000000
--- a/content/app/development/ux/components/_common-props-content/optionsId.en.md
+++ /dev/null
@@ -1,49 +0,0 @@
----
-hidden: true
----
-
-
-#### Code List (`optionsId`)
-
-A [code list](/app/development/data/options) is a predefined list of options.
-
-
-
-
-
-
-To add options from a code list, select "Kodeliste" and enter a code list ID.
- To use a custom (dynamic) code list, click "Bytt til egendefinert kodeliste" (switch to custom code list).
-
-{{% image file="component-settings/optionsId.png" %}}
-
-
-
-If you wish to [secure dynamic code lists](/app/development/data/options/dynamic-codelists/#secured-dynamic-options), you can check this option:
-
-{{% image file="component-settings/secure.png" %}}
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4-5"}
-{
- "id": "komponent-id",
- ...
- "optionsId": "land",
- "secure": true
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/optionsId.nb.md b/content/app/development/ux/components/_common-props-content/optionsId.nb.md
deleted file mode 100644
index 4327d96ec03..00000000000
--- a/content/app/development/ux/components/_common-props-content/optionsId.nb.md
+++ /dev/null
@@ -1,49 +0,0 @@
----
-hidden: true
----
-
-
-#### Kodeliste (`optionsId`)
-
-En [kodeliste](/nb/app/development/data/options) er en forhåndsdefinert liste med alternativer.
-
-
-
-
-
-
-For å legge til alternativer fra en kodeliste, velg 'Kodeliste' og angi en kodeliste ID.
- For å bruke en egendefinert (dynamisk) kodeliste, klikk på "Bytt til egendefinert kodeliste".
-
-{{% image file="component-settings/optionsId.png" %}}
-
-
-
-Om du ønsker å [sikre dynamiske kodelister](/nb/app/development/data/options/dynamic-codelists/#sikrede-dynamiske-kodelister) kan du huke av for dette:
-
-{{% image file="component-settings/secure.png" %}}
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4-5"}
-{
- "id": "komponent-id",
- ...
- "optionsId": "land",
- "secure": true
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/page-break.en.md b/content/app/development/ux/components/_common-props-content/page-break.en.md
deleted file mode 100644
index d63088a838a..00000000000
--- a/content/app/development/ux/components/_common-props-content/page-break.en.md
+++ /dev/null
@@ -1,43 +0,0 @@
----
-hidden: true
----
-
-
-### Page Break (`pageBreak`)
-
-Indicates whether a page break should be added before or after the component. Can be either: `auto` (default), `always`, or `avoid`.
-
-
-
-
-
-
-{{% image file="component-settings/pagebreak.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4-7"}
-{
- "id": "komponent-id",
- ...
- "pageBreak": {
- "breakBefore": "auto",
- "breakAfter": "auto"
- }
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/page-break.nb.md b/content/app/development/ux/components/_common-props-content/page-break.nb.md
deleted file mode 100644
index fdec43c9b15..00000000000
--- a/content/app/development/ux/components/_common-props-content/page-break.nb.md
+++ /dev/null
@@ -1,44 +0,0 @@
----
-hidden: true
----
-
-
-### Sideskift (`pageBreak`)
-
-Indikerer om en sideskift skal legges til før eller etter komponenten. Kan være enten: `auto` (standard), `always` (alltid) eller `avoid` (unngå).
-
-
-
-
-
-
-
-{{% image file="component-settings/pagebreak.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4-7"}
-{
- "id": "komponent-id",
- ...
- "pageBreak": {
- "breakBefore": "auto",
- "breakAfter": "auto"
- }
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/preselectedOptionsIndex.en.md b/content/app/development/ux/components/_common-props-content/preselectedOptionsIndex.en.md
deleted file mode 100644
index 463a7fafed9..00000000000
--- a/content/app/development/ux/components/_common-props-content/preselectedOptionsIndex.en.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-hidden: true
----
-
-
-### Preselected option (`preselectedOptionsIndex`)
-
-Sets a preselected value. Options are zero-indexed, so the first option is `0`, the second is `1`, and so on.
-
-
-
-
-
-
-{{% image file="component-settings/preselectedOptionsIndex.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4"}
-{
- "id": "komponent-id",
- ...
- "preselectedOptionsIndex": 0
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/preselectedOptionsIndex.nb.md b/content/app/development/ux/components/_common-props-content/preselectedOptionsIndex.nb.md
deleted file mode 100644
index bc4ba282250..00000000000
--- a/content/app/development/ux/components/_common-props-content/preselectedOptionsIndex.nb.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-hidden: true
----
-
-
-### Forhåndsvalgt verdi (`preselectedOptionsIndex`)
-
-Setter en forhåndsvalgt verdi. Alternativene er nullindeksert, så det første alternativet er `0`, det andre `1`, osv.
-
-
-
-
-
-
-{{% image file="component-settings/preselectedOptionsIndex.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4"}
-{
- "id": "komponent-id",
- ...
- "preselectedOptionsIndex": 0
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/readonly.en.md b/content/app/development/ux/components/_common-props-content/readonly.en.md
deleted file mode 100644
index 60c5182e1fd..00000000000
--- a/content/app/development/ux/components/_common-props-content/readonly.en.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-hidden: true
----
-
-
-### Field is read-only (`readOnly`)
-Disables the component when checked (`true`).
-
-
-
-
-
-{{% image file="component-settings/readOnly.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4"}
-{
- "id": "komponent-id",
- ...
- "readOnly": true
-}
-```
-
-
-
-
-
-
-{{% image file="component-settings/readOnly-example.png" %}}
-
-*Example read-only component*
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/readonly.nb.md b/content/app/development/ux/components/_common-props-content/readonly.nb.md
deleted file mode 100644
index 14a59d3ef80..00000000000
--- a/content/app/development/ux/components/_common-props-content/readonly.nb.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-hidden: true
----
-
-
-### Feltet skal være skrivebeskyttet (`readOnly`)
-Egenskapen `readOnly` deaktiverer komponenten når huket av (`true`).
-
-
-
-
-
-{{% image file="component-settings/readOnly.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4"}
-{
- "id": "komponent-id",
- ...
- "readOnly": true
-}
-```
-
-
-
-
-
-
-{{% image file="component-settings/readOnly-example.png" %}}
-
-*Eksempel skrivebeskyttet komponent*
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/renderAsSummary.en.md b/content/app/development/ux/components/_common-props-content/renderAsSummary.en.md
deleted file mode 100644
index 16cd83ad23c..00000000000
--- a/content/app/development/ux/components/_common-props-content/renderAsSummary.en.md
+++ /dev/null
@@ -1,36 +0,0 @@
----
-hidden: true
----
-
-
-### Summary (`renderAsSummary`)
-
-Indicates whether the field should be included in a summary or not (default: `false`).
-
-
-
-
-
-
-{{% image file="component-settings/renderAsSummary.png" %}}
-
-
-
-
-
-
-```json{hl_lines="4"}
-{
- "id": "komponent-id",
- ...
- "renderAsSummary": false
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/renderAsSummary.nb.md b/content/app/development/ux/components/_common-props-content/renderAsSummary.nb.md
deleted file mode 100644
index 9334a74683a..00000000000
--- a/content/app/development/ux/components/_common-props-content/renderAsSummary.nb.md
+++ /dev/null
@@ -1,36 +0,0 @@
----
-hidden: true
----
-
-
-### Oppsummering (`renderAsSummary`)
-
-Indikerer om feltet skal være med i oppsummering eller ikke (standard: `false`).
-
-
-
-
-
-
-{{% image file="component-settings/renderAsSummary.png" %}}
-
-
-
-
-
-
-```json{hl_lines="4"}
-{
- "id": "komponent-id",
- ...
- "renderAsSummary": false
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/required.en.md b/content/app/development/ux/components/_common-props-content/required.en.md
deleted file mode 100644
index acddfd12e27..00000000000
--- a/content/app/development/ux/components/_common-props-content/required.en.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-hidden: true
----
-
-
-### Required (`required`)
-
-Field is required when enabled (`true`) and a star is shown after the heading.
-
-
-
-
-
-
-{{% image file="component-settings/required.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4"}
-{
- "id": "komponent-id",
- ...
- "required": false
-}
-```
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/required.nb.md b/content/app/development/ux/components/_common-props-content/required.nb.md
deleted file mode 100644
index b2d06df14b3..00000000000
--- a/content/app/development/ux/components/_common-props-content/required.nb.md
+++ /dev/null
@@ -1,39 +0,0 @@
----
-hidden: true
----
-
-
-### Feltet skal være påkrevd (`required`)
-
-Krever at det gjøres et valg når aktivert (`true`), det vil da vises en stjerne ved overskriften.
-
-
-
-
-
-
-{{% image file="component-settings/required.png" %}}
-
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4"}
-{
- "id": "komponent-id",
- ...
- "required": false
-}
-```
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/source.en.md b/content/app/development/ux/components/_common-props-content/source.en.md
deleted file mode 100644
index 828779d8626..00000000000
--- a/content/app/development/ux/components/_common-props-content/source.en.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-hidden: true
----
-
-
-#### Source (`source`)
-
-One way to add options is by linking the component to a code list based on form data stored within the app itself.
- You can do this by adding a source (`source`); please refer to the [documentation](/app/development/data/options/repeating-group-codelists/) for instructions on how to configure this.
-
-
-
-
-
-Settings in Altinn Studio.
-
-{{% image file="component-settings/source.png" %}}
-
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4-9"}
-{
- "id": "komponent-id",
- ...
- "source": {
- "group": "some.group",
- "label": "dropdown.label",
- "value": "some.group[{0}].someField",
- "description": "",
- "helpText": ""
- }
-}
-...
-```
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/source.nb.md b/content/app/development/ux/components/_common-props-content/source.nb.md
deleted file mode 100644
index b6a45740001..00000000000
--- a/content/app/development/ux/components/_common-props-content/source.nb.md
+++ /dev/null
@@ -1,44 +0,0 @@
----
-hidden: true
----
-
-
-#### Kilde (`source`)
-
-En måte å legge til alternativer er å koble komponenten til en kodeliste basert på skjemadata lagret i selve appen.
- Dette gjør du ved å legge til en kilde (`source`); se [dokumentasjon](/nb/app/development/data/options/repeating-group-codelists/) for hvordan dette konfigureres.
-
-
-
-
-Innstillinger i Altinn Studio.
-
-{{% image file="component-settings/source.png" %}}
-
-
-
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4-9"}
-{
- "id": "komponent-id",
- ...
- "source": {
- "group": "some.group",
- "label": "dropdown.label",
- "value": "some.group[{0}].someField",
- "description": "",
- "helpText": ""
- }
-}
-...
-```
-
-
-
-
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/text-all.en.md b/content/app/development/ux/components/_common-props-content/text-all.en.md
deleted file mode 100644
index 567c818c5a1..00000000000
--- a/content/app/development/ux/components/_common-props-content/text-all.en.md
+++ /dev/null
@@ -1,60 +0,0 @@
----
-hidden: true
----
-
-
-### Text (`textResourceBindings`)
-
-
-
-
-
-
-You can create a new text by clicking on the plus sign or select an existing one by clicking on the magnifying glass.
- See [Adding and Editing Texts in an App](/app/development/ux/texts/#add-and-change-texts-in-an-application) for more information.
-
-{{% image file="component-settings/textResourceBindings-all.png" %}}
-
-
-
-
-
-
-Text can be added directly as a text string or by providing the key to a [text resource].(/app/development/ux/texts/#add-and-change-texts-in-an-application).
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4-10"}
-{
- "id": "komponent-id",
- "type": "Checkboxes",
- "textResourceBindings": {
- "title": "",
- "description": "",
- "help": "",
- "shortName": "",
- "tableTitle": ""
- }
-}
-```
-
-
-
-
-
-
-{{% image file="component-settings/text-anatomy.png" %}}
-
-
-{{% anatomy-list %}}
-1. **Ledetekst** (`textResourceBindings.title`): A heading with a question or instruction.
-2. **Beskrivelse** (`textResourceBindings.description`): Description. Text for further description or elaboration.
-3. **Hjelpetekst** (`textResourceBindings.help`): Help text. When help text is filled out, a question mark will appear next to the heading. Click on the question mark to display the text as a popup. Can be used for explanations, examples, use cases, etc.
-
-- **Kortnavn** (`textResourceBindings.shortName`): Short name. Overrides the title of the component used in the default `required` validation message.
-- **Tittel i tabell** (`textResourceBindings.tableTitle`): Table title. Overrides the title of the component used in column headers when the component is within repeating groups.
-{{% /anatomy-list %}}
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_common-props-content/text-all.nb.md b/content/app/development/ux/components/_common-props-content/text-all.nb.md
deleted file mode 100644
index 3778a9d1e3f..00000000000
--- a/content/app/development/ux/components/_common-props-content/text-all.nb.md
+++ /dev/null
@@ -1,61 +0,0 @@
----
-hidden: true
----
-
-
-### Tekst (`textResourceBindings`)
-
-
-
-
-
-
-Du kan opprette en ny tekst ved å klikke på pluss-tegnet eller velge en eksisterende ved å klikke på forstørrelsesglasset.
- Se [Legge til og endre tekster i en app](/nb/app/development/ux/texts/#legge-til-og-endre-tekster-i-en-app) for mer info.
-
-{{% image file="component-settings/textResourceBindings-all.png" %}}
-
-
-
-
-
-
-Tekst kan legges til direkte som en tekststreng eller ved å oppgi nøkkelen til en [tekstressurs](/nb/app/development/ux/texts/#legge-til-og-endre-tekster-i-en-app).
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="4-10"}
-{
- "id": "komponent-id",
- "type": "Checkboxes",
- "textResourceBindings": {
- "title": "",
- "description": "",
- "help": "",
- "shortName": "",
- "tableTitle": ""
- }
-}
-```
-
-
-
-
-
-
-{{% image file="component-settings/text-anatomy.png" %}}
-
-
-{{% anatomy-list %}}
-1. **Ledetekst** (`textResourceBindings.title`): Overskrift med spørsmål eller instruksjon.
-2. **Beskrivelse** (`textResourceBindings.description`): Tekst for ytterligere beskrivelse eller utdyping.
-3. **Hjelpetekst** (`textResourceBindings.help`): Når hjelpetekst er fylt ut vil et spørsmålstegn vises ved siden av ledeteksten. Klikk på spørsmålstegnet for å vise teksten som en popup.
-Kan brukes til forklaring, eksempler, brukssituasjoner osv.
-
-- **Kortnavn** (`textResourceBindings.shortName`): Overstyrer tittelen til komponenten som brukes i den standard `required` valideringsmeldingen.
-- **Tittel i tabell** (`textResourceBindings.tableTitle`): Overstyrer tittelen til komponenten som blir brukt i kolonneheader når komponenten befinner seg i repeterende grupper.
-{{% /anatomy-list %}}
-
-
\ No newline at end of file
diff --git a/content/app/development/ux/components/_component-template/_index.en.md b/content/app/development/ux/components/_component-template/_index.en.md
deleted file mode 100644
index de327102e2d..00000000000
--- a/content/app/development/ux/components/_component-template/_index.en.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: Component
-linktitle: Component
-description: # Brief description of what the component does
-schemaname: # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
-hidden: true # Remove when creating new component page from template
----
-
-
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-
-
-### Anatomy
-
-
-
-
-
-## Properties
-
-The following is an autogenerated list of the properties available for {{% title %}} based on the component's JSON schema file (linked below).
-
-{{% notice warning %}}
-We are currently updating how we implement components, and the list of properties may not be entirely accurate.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Configuration
-
-{{% notice warning %}}
-We are currently updating Altinn Studio Designer with more configuration options!
- The documentation is continuously updated, and there may be more settings available than what is described here, and some settings may be in beta version.
-{{% /notice %}}
-
-### Add component
-
-{{}}
-{{}}
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the list of components to the page area.
-Selecting the component brings up its configuration panel.
-
-{{}}
-{{}}
-
-Basic component:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Examples
-
-
diff --git a/content/app/development/ux/components/_component-template/_index.nb.md b/content/app/development/ux/components/_component-template/_index.nb.md
deleted file mode 100644
index d612ae47ddd..00000000000
--- a/content/app/development/ux/components/_component-template/_index.nb.md
+++ /dev/null
@@ -1,190 +0,0 @@
----
-title: Komponent
-linktitle: Komponent
-description: # Kort beskrivelse av komponenten
-schemaname: # Komponentens schema-navn, brukes for å automatisk generere liste med egenskaper fra komponentens JSON schema (erstatt med riktig navn i henhold til schema)
-weight: 10 # Ikke endre, komponentene sorteres alfabetisk
-toc: true
-hidden: true # Fjern for ny komponent
----
-
-
-
-{{% notice warning %}}
-🚧 Denne dokumentasjonen er under oppdatering.
-{{% /notice %}}
-
----
-
-## Bruk
-
-
-
-### Anatomi
-
-
-
-
-
-## Egenskaper
-
-Følgende er en liste over tilgjengelige egenskaper for {{% title %}}. Listen er automatisk generert basert på komponentens JSON schema (se link).
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket hvordan vi implementerer komponenter. Listen over egenskaper kan derfor være noe unøyaktig.
-{{% /notice %}}
-
-
-
-{{% component-props %}}
-
-## Konfigurering
-
-{{% notice warning %}}
-Vi oppdaterer for øyeblikket Altinn Studio med flere muligheter for innstillinger!
- Dokumentasjonen oppdateres fortløpende, men det kan være flere innstillinger tilgjengelig enn det som beskrives her og noen innstillinger kan være i betaversjon.
-{{% /notice %}}
-
-### Legg til komponent
-
-{{}}
-{{}}
-
-Du kan legge til en komponent i [Altinn Studio Designer](/nb/app/getting-started/) ved å dra den fra komponent-listen til sideområdet.
-Når du velger komponenten, vises innstillingspanelet for den.
-
-{{}}
-{{}}
-
-Grunnleggende komponent:
-
-{{< code-title >}}
-App/ui/layouts/{page}.json
-{{< /code-title >}}
-
-```json{hl_lines="6-"}
-{
- "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
- {
- "data": {
- "layout": [
- {
- // Basic component (required properties)
- }
- ]
- }
- }
-}
-```
-
-{{}}
-{{}}
-
-
-
-## Eksempler
-
-
diff --git a/content/app/development/ux/components/_index.en.md b/content/app/development/ux/components/_index.en.md
deleted file mode 100644
index 09dd8fd0f90..00000000000
--- a/content/app/development/ux/components/_index.en.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-title: Components
-description: Components are the building blocks of applications.
-weight: 10
----
-
-Components can be added and edited in the UI editor, see [Altinn Studio Designer](/app/getting-started/).
- Available settings are described for each component below.
-
-When building an application, the layout of each page is described by a `.json` file located in `/App/ui/layouts/`.
-Components added to the page are listed in the `layout` subsection in the file.
-
-Available components and their respective properties are defined in each component's JSON schema file.
-
-Properties common to multiple components are described in a separate file and referenced by the component files.
- These properties are described separately in [Common Component Properties](./commondefs/) below.
-
-{{}}
diff --git a/content/app/development/ux/components/_index.nb.md b/content/app/development/ux/components/_index.nb.md
deleted file mode 100644
index c6e13f6a5ba..00000000000
--- a/content/app/development/ux/components/_index.nb.md
+++ /dev/null
@@ -1,31 +0,0 @@
----
-title: Komponenter
-description: Komponenter er byggeklossene i applikasjoner.
-weight: 10
----
-
-Nedenfor er en tabell med layout-egenskaper for komponenter.
-Mer spesifikke egenskaper og definisjoner finner du i beskrivelsen for hver komponent og i filen [layout JSON schema](https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json).
-
-
-{{% expandlarge id="layout-komponent-egenskaper" header="Layout-egenskaper for komponenter" %}}
-
-| **Egenskap** | **Tittel** | **Type** | **Beskrivelse** |
-| ---------------------- | ------------------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------- |
-| `id` | id | string | Komponentens ID. Må være unik innenfor alle layouts/sider i et layout-set. Kan ikke ende med ``. |
-| `type` | Type | string (enum) | Komponenttype. |
-| `required` | Påkrevd | boolean | Boolsk verdi eller uttrykk som indikerer om komponenten er påkrevd når man fyller ut skjemaet. Standardverdi: `false`. |
-| `readOnly` | Kun lese | boolean | Boolsk verdi eller uttrykk som indikerer om komponenten skal presenteres som kun lese. Standardverdi: `false`.
Merk at selv med read-only felt i komponenter, kan det for øyeblikket være mulig å oppdatere feltet ved å endre requesten som går til APIet eller ved et direkte API kall |
-| `renderAsSummary` | Vis som sammendrag | boolean | Boolsk verdi eller uttrykk som indikerer om komponenten skal vises som et sammendrag. Standardverdi: `false`. |
-| `hidden` | Skjult | boolean | Boolsk verdi eller uttrykk som indikerer om komponenten skal skjules. Standardverdi: `false`. |
-| `textResourceBindings` | Tekstressursbindinger | object | Tekstressursbindinger for en komponent. |
-| `dataModelBindings` | Datamodellbindinger | object | Datamodellbindinger for en komponent |
-| `triggers` | Triggere | array | En array med handlinger som skal utløses når data tilknyttet denne komponenten endres. |
-| `labelSettings` | Innstillinger for etikett | object | En samling med innstillinger for hvordan komponentetiketten skal vises. |
-| `grid` | Grid | object | Innstillinger for komponentens rutenett (grid). Brukes til å kontrollere horisontal justering. |
-| `pageBreak` | Sideskift | object | Kun PDF: Verdi eller uttrykk som indikerer om et sideskift skal legges til før eller etter komponenten. |
-
-
-{{% /expandlarge %}}
-
-{{}}
diff --git a/content/app/development/ux/components/accordion/Accordion-closed-anatomy.png b/content/app/development/ux/components/accordion/Accordion-closed-anatomy.png
deleted file mode 100644
index acb17d5be74..00000000000
Binary files a/content/app/development/ux/components/accordion/Accordion-closed-anatomy.png and /dev/null differ
diff --git a/content/app/development/ux/components/accordion/Accordion-open-anatomy.png b/content/app/development/ux/components/accordion/Accordion-open-anatomy.png
deleted file mode 100644
index 414e3a21b0d..00000000000
Binary files a/content/app/development/ux/components/accordion/Accordion-open-anatomy.png and /dev/null differ
diff --git a/content/app/development/ux/components/accordion/Accordion-settings-panel.png b/content/app/development/ux/components/accordion/Accordion-settings-panel.png
deleted file mode 100644
index 2365dfc2ebd..00000000000
Binary files a/content/app/development/ux/components/accordion/Accordion-settings-panel.png and /dev/null differ
diff --git a/content/app/development/ux/components/accordion/Accordion-title-and-children.png b/content/app/development/ux/components/accordion/Accordion-title-and-children.png
deleted file mode 100644
index e8125f3a79a..00000000000
Binary files a/content/app/development/ux/components/accordion/Accordion-title-and-children.png and /dev/null differ
diff --git a/content/app/development/ux/components/accordion/_index.en.md b/content/app/development/ux/components/accordion/_index.en.md
deleted file mode 100644
index 4c8c1ce070d..00000000000
--- a/content/app/development/ux/components/accordion/_index.en.md
+++ /dev/null
@@ -1,240 +0,0 @@
----
-title: Accordion
-linktitle: Accordion
-description: A component that allows you to group content into collapsible sections.
-schemaname: Accordion # Component schema name used to autogenerate list of properties from json schema (replace with appropriate component name)
-weight: 10 # Do not change, the components will be sorted alphabetically
-toc: true
-hidden: false # Remove when creating new component page from template
----
-
-{{% notice warning %}}
-🚧 This documentation is a work in progress.
-{{% /notice %}}
-
----
-
-## Usage
-
-The Accordion component allows users to expand and collapse content sections by clicking on the header,
- allowing for a space-efficient and organized way to present information.
-
-### Anatomy
-
-![Accordion closed anatomy](Accordion-closed-anatomy.png "Closed Accordion")
-
-![Accordion open anatomy](Accordion-open-anatomy.png "Open Accordion")
-
-{{% anatomy-list %}}
-1. **Header**: The clickable section title that users interact with to expand or collapse the content.
-2. **Content Area**: The area that expands or collapses, revealing or hiding additional information when the header is clicked.
-{{% /anatomy-list %}}
-
-
-### Related
-
-- [`AccordionGroup`](../accordiongroup/)
-
-
-## Properties
-
-| **Property** | **Type** | **Description** |
-|--------------|------------------------------------------------|-----------------|
-| `children` | array | An array with the component ID of all components belonging to the group. **Enum:** `"Paragraph" \| "Button"` |
-| `textResourceBindings.title` | string | Clickable section title |
-
-
-
-## Configuration
-
-### Add component
-
-You can add a component in [Altinn Studio Designer](/app/getting-started/) by dragging it from the left-side panel to the middle page area.
-Selecting the component brings up its configuration panel on the right-hand side.
-
-### Settings in Altinn Studio Designer
-
-{{% notice warning %}}
-We are currently updating Altinn Studio with more configuration options!
- The documentation is continuously updated, but more settings may be available than described here, and some settings may be in beta.
-{{% /notice %}}
-
-{{}}
-{{