Lag ny kopi
Denne siden beskriver hvordan man konfigurerer lag ny kopi funksjonaliteten i en app.
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.
Konfigurasjon
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.
applicationmetadata.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.
applicationmetadata.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.
Validering
Validering er nyttig hvis tjenesteeier ønsker å begrense når brukere kan kopiere instanser, for eksempel basert på tidsfrister eller endringer i applikasjonen.
ICopyInstanceValidator kan implementeres i applikasjonskoden for å legge til egendefinert validering som bare kjøres i tilfeller der man ønsker å kopiere fra instans. Interfacet tar inn en IInstanceDataAccessor basert på kildeinstansen som argument og returnerer en InstantiationValidationResult.
Hvis valideringen returnerer Valid = false, vil brukeren få en feilmelding og kopieringen avbrytes.
Eksempler
Instansiering av kopi ikke tillatt dersom det har gått mer enn 10 dager siden fristen for innsending.
using System;
using System.Threading.Tasks;
using Altinn.App.Core.Features;
using Altinn.App.Core.Models.Validation;
namespace Altinn.App.models;
public class CopyInstanceValidator : ICopyInstanceValidator
{
private const int NumberOfDaysAfterDueDate = 10;
public async Task<InstantiationValidationResult> Validate(IInstanceDataAccessor sourceInstanceDataAccessor)
{
if (sourceInstanceDataAccessor.Instance.DueBefore.HasValue)
{
var deadline = sourceInstanceDataAccessor.Instance.DueBefore.Value.AddDays(NumberOfDaysAfterDueDate);
if (DateTimeOffset.UtcNow > deadline)
{
return new InstantiationValidationResult
{
Valid = false,
Message = "ERROR: Too long since due date"
};
}
}
return null;
}
}
Instansiering av kopi ikke tillatt etter fastsatt dato.
using System;
using System.Threading.Tasks;
using Altinn.App.Core.Features;
using Altinn.App.Core.Models.Validation;
namespace Altinn.App.models;
public class CopyInstanceValidator : ICopyInstanceValidator
{
private static readonly DateTime CopiesNotAllowedAfter = new(2026, 6, 30);
public async Task<InstantiationValidationResult> Validate(IInstanceDataAccessor sourceInstanceDataAccessor)
{
if (DateTime.UtcNow > CopiesNotAllowedAfter)
{
return new InstantiationValidationResult
{
Valid = false,
Message = "ERROR: Not allowed to copy instances after 2026-06-30"
};
}
return null;
}
}
Instansiering av kopi ikke tillatt dersom applikasjonsversjonen er forandret fra den som ble brukt for kildeinstansen.
using System.Linq;
using System.Threading.Tasks;
using Altinn.App.Core.Features;
using Altinn.App.Core.Internal.App;
using Altinn.App.Core.Models.Validation;
namespace Altinn.App.models;
public class CopyInstanceValidator(IAppMetadata appMetadata) : ICopyInstanceValidator
{
public async Task<InstantiationValidationResult> Validate(IInstanceDataAccessor sourceInstanceDataAccessor)
{
var appVersionDataValue = sourceInstanceDataAccessor
.Instance
.DataValues
.SingleOrDefault(x => x.Key == "appVersion");
var application = await appMetadata.GetApplicationMetadata();
if (appVersionDataValue != null && appVersionDataValue.Value.Equals(application.VersionId) == false)
{
return new InstantiationValidationResult
{
Valid = false,
Message = "ERROR: Application version differs from the version that the source instance was created with"
};
}
return null;
}
}