# Skift dawa-autocomplete2 ud

Adressefeltet `dawa-autocomplete2` har ikke givet forslag, siden DAWA lukkede 1. oktober 2026. `@grundfast/dawa-autocomplete` har samme funktion, samme indstillinger, samme objekt i `select` og samme CSS-klasser, men spørger Grundfasts DAWA-kompatible autocomplete. Du skifter importen og tilføjer en offentlig nøgle — resten af koden bliver stående.

## Skiftet

1. **Skift pakken** — Fjern den gamle pakke og installér den nye.

```bash
npm uninstall dawa-autocomplete2
npm install @grundfast/dawa-autocomplete
```

2. **Opret en offentlig nøgle** — Feltet kalder Grundfast direkte fra browseren, så det bruger en **offentlig nøgle** (`gf_pub_live_…`). Opret den under [Nøgler i dashboardet](https://grundfast.dk/dashboard/keys): vælg **Offentlig** og skriv de domæner, feltet skal virke på, fx `butik.dk`, `www.butik.dk` og `localhost:5173`. Byg og test med en offentlig testnøgle (`gf_pub_test_`), som aldrig faktureres.

3. **Ret importen og giv feltet nøglen** — Det er de to linjer, der ændrer sig. `select`, `adgangsadresserOnly`, `params` og de andre indstillinger bliver stående.

```js
import { dawaAutocomplete } from 'dawa-autocomplete2';

dawaAutocomplete(document.getElementById('adresse'), {
  select: function (valgt) {
    gemAdresse(valgt.tekst, valgt.data.id);
  },
});
```

```js
import { dawaAutocomplete } from '@grundfast/dawa-autocomplete';

dawaAutocomplete(document.getElementById('adresse'), {
  apiKey: 'gf_pub_live_...',
  select: function (valgt) {
    gemAdresse(valgt.tekst, valgt.data.id);
  },
});
```

Bruger du `require`, er det det samme: `require('@grundfast/dawa-autocomplete').dawaAutocomplete`. Kan du ikke sætte nøglen i koden, kan den stå på feltet som `data-grundfast-key="gf_pub_live_..."`.

## Med et script-tag

Indlæste du widgetten fra et CDN, så skift de to URL’er. Den globale `dawaAutocomplete.dawaAutocomplete(...)` er den samme som før.

**Før**

```html
<script src=".../dawa-autocomplete2/1.0.2/dawa-autocomplete2.min.js"></script>
<script>
  dawaAutocomplete.dawaAutocomplete(document.getElementById('adresse'), {
    select: function (valgt) { console.log(valgt.tekst); }
  });
</script>
```

**Efter**

```html
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@grundfast/dawa-autocomplete@1/dist/css/dawa-autocomplete.css">
<script src="https://cdn.jsdelivr.net/npm/@grundfast/dawa-autocomplete@1/dist/dawa-autocomplete.min.js"></script>
<script>
  dawaAutocomplete.dawaAutocomplete(document.getElementById('adresse'), {
    apiKey: 'gf_pub_live_...',
    select: function (valgt) { console.log(valgt.tekst); }
  });
</script>
```

`@1` i URL’en giver dig rettelser i version 1 automatisk. Vil du låse en bestemt version, så skriv den fulde, fx `@1.0.0`.

## Det, der er det samme

- **Funktionen og det, den returnerer.** `dawaAutocomplete(input, options)` giver et objekt med `selected()`, `id(uuid)` og `destroy()`.
- **Indstillingerne.** `select`, `adgangsadresserOnly`, `type`, `params`, `minLength`, `multiline`, `id`, `debounce`, `fuzzy`, `supplerendebynavn`, `stormodtagerpostnumre`, `retryDelay`, `render` og `baseUrl`. `params` sendes med som før, fx `{ kommunekode: '101' }` eller `{ postnr: '8000' }`.
- **Forløbet.** Vejnavn, så husnummer, så etage og dør — med markøren der, hvor næste del af adressen skal skrives, og piletaster, Enter og Tab som før.
- **Markup og klasser.** `ul.dawa-autocomplete-suggestions`, `li.dawa-autocomplete-suggestion` og `dawa-selected` på den markerede. Dit eget stylesheet virker uændret. Har du brugt pakkens, så importér `@grundfast/dawa-autocomplete/css` — den gamle sti `dist/css/dawa-autocomplete2.css` findes også.

## Det, select får

`select` får forslaget, præcis som API’et sender det, i samme form som før: `type`, `tekst`, `forslagstekst`, `caretpos` og adressen i `data`.

**select(valgt)**

```json
{
  "type": "adresse",
  "tekst": "Jægersborggade 10, st. tv, 2200 København N",
  "forslagstekst": "Jægersborggade 10, st. tv\n2200 København N",
  "caretpos": 43,
  "stormodtagerpostnr": false,
  "data": {
    "id": "0a3f509f-1325-32b8-e044-0003ba298018",
    "status": 1,
    "darstatus": 3,
    "vejkode": "3472",
    "vejnavn": "Jægersborggade",
    "adresseringsvejnavn": "Jægersborggade",
    "husnr": "10",
    "etage": "st",
    "dør": "tv",
    "supplerendebynavn": null,
    "postnr": "2200",
    "postnrnavn": "København N",
    "stormodtagerpostnr": null,
    "stormodtagerpostnrnavn": null,
    "kommunekode": "0101",
    "adgangsadresseid": "0a3f507a-a100-32b8-e044-0003ba298018",
    "x": 12.5449906,
    "y": 55.6921031,
    "href": "https://api.grundfast.dk/dawa/adresser/0a3f509f-1325-32b8-e044-0003ba298018"
  }
}
```

1. **Samme id’er** Adresse-id’erne er DAR’s egne, de samme som DAWA brugte. Id’er, du allerede har gemt, peger stadig på den samme adresse — også med indstillingen `id`.
2. **Peger på Grundfast** `href` går til `/dawa` hos Grundfast. Kalder din server den, skal den sende en hemmelig nøgle med.
3. **WGS84** Længde- og breddegrad, som DAWA gav dem som standard.

Nogle felter kan ikke længere udfyldes efter DAWA og er altid `null`. Hvilke, står i [DAWA efter DAWA](https://grundfast.dk/docs/dawa-migrering#dawa-efter-dawa).

## Det, der er nyt

- **`apiKey`** — den offentlige nøgle. Den sendes som `?token=` på et almindeligt `GET`, så browseren ikke laver et CORS-preflight først.
- **En `baseUrl`, der stadig peger på DAWA,** bliver skiftet til Grundfast, og konsollen siger det. Peger den på din egen proxy, bruges den som før.
- **En indstilling, pakken ikke kender,** giver én advarsel i konsollen og ignoreres — feltet virker stadig.
- **En afvist nøgle prøves ikke igen.** Konsollen får API’ets begrundelse én gang, og listen forbliver tom, så kunden kan skrive adressen i hånden. Fejl på serveren og `429` prøves igen efter `retryDelay`, højst tre gange.
- **Skærmlæsere.** Feltet får `role="combobox"`, `aria-expanded` og `aria-activedescendant`, og Escape lukker listen.

## Hvad koster det?

Hvert opslag er ét kald på din konto, ligesom alle andre kald — se [priserne](https://grundfast.dk/priser). Feltet spørger først fra to tegn (`minLength`), og mens ét opslag kører, venter kun det nyeste tastetryk, så hurtig tastning ikke giver et kald pr. tegn. Vil du spare flere kald, så sæt `debounce`, fx `150`. En offentlig nøgle har desuden en grænse på 120 kald i minuttet pr. besøgende.

## Hvis der ikke kommer forslag

Åbn browserens konsol. Pakken skriver en linje, der begynder med `[@grundfast/dawa-autocomplete]`, med årsagen. Du kan også prøve nøglen fra en terminal — kaldet er det samme, feltet laver, og `Origin` er dit domæne:

```bash
curl -G "https://api.grundfast.dk/dawa/autocomplete" \
  --data-urlencode "q=Jægersborggade 10" \
  --data-urlencode "token=$GRUNDFAST_PUBLIC_KEY" \
  -H "Origin: https://butik.dk"
```

- `no apiKey` — feltet fik ingen nøgle. Sæt `apiKey` eller `data-grundfast-key`.
- `403 … origin … is not allowed` — domænet står ikke på nøglen. Ret listen i dashboardet; det slår igennem inden for et halvt minut. Reglerne for `www`, underdomæner og porte står under [Offentlige nøgler](https://grundfast.dk/docs/adressefelt#offentlige-noegler).
- `SECRET key` — du har brugt en hemmelig nøgle (`gf_live_`). Den kan alle læse i sidens kildekode, så tilbagekald den og opret en offentlig.

> **Har du ikke selv bygget formularen?** Er dit adressefelt i en webshop eller et formularmodul, er Grundfasts eget [adressefelt](https://grundfast.dk/docs/adressefelt) nemmere: ét script-tag, der også udfylder postnummer, by og BFE-nummer i formularens egne felter. Pakken her er til kode, der allerede kalder `dawaAutocomplete`.

Kalder din server også DAWA direkte, så se [Migrér fra DAWA](https://grundfast.dk/docs/dawa-migrering): samme stier under `https://api.grundfast.dk/dawa`, med en hemmelig nøgle.
