Date picker

Release dato: 03.10.2024

Sist oppdatert: 19.06.2025

Date picker (datovelger) lar brukeren velge en dato, flere datoer eller et datointervall. Brukeren kan enten skrive dato direkte i feltet, eller velge fra en kalender.

Date picker passer godt i skjemaer der datoen har betydning for videre steg, og nÄr du vil tilby bÄde fritekst og visuell kalender.

Har du noen innspill til komponenten?Gi oss beskjed!

Test komponenten

Kodebygger

PktDatepicker

Innhold
Utseende
StÞrrelsen pÄ komponenten
Funksjonalitet
Ukedager (1-7) som ikke kan velges. Kommaseparert i Elements, en liste i React.
Datoer som ikke kan velges. Kommaseparert i Elements, en liste i React.
Tidligste dato som kan velges, som ISO-dato
Seneste dato som kan velges, som ISO-dato
StĂžrste antall datoer som kan velges ved flervalg. Viser en teller. 0 betyr ingen grense.
Tilgjengelighet
Spesifiserer ID-en til elementet som beskriver feltet.
Teknisk
Navn som brukes i skjema ved innsending
ID-en til skjemaet feltet hÞrer til, nÄr feltet ligger utenfor skjemaet
Formatet datoene vises i, i taggene ved flervalg
MÄneden kalenderen Äpner pÄ, som ISO-dato
Valgte datoer i ISO-format. Kommaseparert ved flervalg og datotidsrom. React godtar ogsÄ en liste.
ISO-datostreng som overstyrer dagens dato i kalenderen. Nyttig for snapshot-tester.
Unik identifikasjon for datovelgeren. PÄkrevd i React. Elements lager en id hvis den mangler.
<PktDatepicker
label="Velg dato"
multiple />

Relaterte komponenter

Varianter

Date picker finnes i to hovedvarianter. Du kan kombinere disse med ulike skins og farger.

VariantBruk
Enkel datoLar deg velge én spesifikk dato
Flere datoerLar deg velge flere datoer samtidig
Periode/intervallLar deg velge en periode med start- og sluttdato
Eksempler pÄ layout-variantene av datepickerEksempler pÄ layout-variantene av datepickerEksempler pÄ layout-variantene av datepicker

StĂžrrelser

Date pickere kan brukes i tre ulike stĂžrrelser:

StĂžrrelserBruk
Medium (default)Standard, og skal brukes som hovedregel
SmallFor trange flater, som tabeller og kompakte skjema
XSmallFor ekstra trange flater, som kompakte tabeller og informasjonstette fagsystemer
Eksempel pÄ date picker i forskjellige stÞrrelser

Retningslinjer for bruk

Bruk date picker nÄr

  • du vil la brukeren velge en dato eller et datointervall
  • det er behov for bĂ„de fritekst og kalender
  • datoen er av betydning for videre steg i skjema eller prosess

UnngÄ date picker nÄr

  • datoen ikke har betydning for oppgaven
  • brukeren kun trenger Ă„ velge mellom fĂ„, spesifikke datoer (da kan select eller radiobutton vĂŠre bedre)

Forklar hva brukeren kan gjĂžre

Bruk hjelpetekst og label for Ă„ forklare format eller regler, f.eks. maks antall datoer eller begrensede valg. Beskriv hva som skal velges.

GjĂžr slik

Skriv forklarende label og hjelpetekst som hjelper brukeren Ă„ fylle inn riktig og forventet innhold

UnngÄ

UnngÄ uklare etiketter som kan forvirre

Responsivitet

Date picker tilpasser seg automatisk skjermstÞrrelsen. Kalenderen skalerer ned pÄ smÄ skjermer, slik at det fortsatt er lett Ä velge dato.

Vi anbefaler at du tester date picker i lÞsningen din pÄ ulike skjermstÞrrelser, bÄde i stÄende og liggende visning, for Ä sikre at kalender, valgte datoer og eventuelle feilmeldinger vises tydelig.

Datepicker pÄ mobil

Universell utforming

Label skal alltid vĂŠre synlig

Alle skjemaelementer mÄ ha en synlig label (etikett). Den skal beskrive hva brukeren skal gjÞre, for eksempel «Velg dato for avreise».

Dersom etiketten skjules visuelt, skal den likevel vÊre tilgjengelig for skjermlesere ved Ä bruke skjulte klasser (for eksempel pkt-sr-only). Dette sikrer at brukere med skjermleser forstÄr hva feltet handler om.

Dato mÄ kunne velges med tastatur

Date picker mÄ fungere uten mus. Brukeren skal kunne:

  • Åpne kalenderen med tastatur
  • Navigere mellom datoer med piltaster
  • Velge en dato med Enter
  • Lukke kalenderen med Esc

Dette er sÊrlig viktig for personer som bruker tastaturnavigasjon eller spesialutstyr. SÞrg ogsÄ for at det er tydelig hvilken dato som har fokus i kalenderen.

Skjermlesere mÄ kunne lese valgt dato

NÄr brukeren velger en dato, mÄ denne informasjonen leses opp av skjermleser. Kalenderen mÄ ha riktige ARIA-roller og -attributter, som aria-labelog aria-selected. Bruk ogsÄ ARIA Live-regioner forsiktig, slik at skjermleseren varsler valgte datoer pÄ en kontrollert mÄte.

Hvis komponenten har feil, mÄ feilmeldingen knyttes til inputfeltet med aria-describedby.

Vis hjelpetekster for datoformat og regler

Datoformatet mÄ forklares tydelig i komponenten. Bruk hjelpetekst som forklarer:

  • Hvilket datoformat som skal brukes (f.eks. dd.mm.yyyy)
  • Om det er begrensninger i valg av datoer
  • Om brukeren kan velge flere datoer eller en periode

UnngÄ Ä kun vise denne informasjonen i placeholder, bruk alltid synlig tekst.

Les mer om universell utforming av date picker:

Anatomi

ElementBeskrivelse
1. Etikett (label)Tekst som forteller hva brukeren skal gjĂžre
2. HjelpetekstTilleggsinformasjon som forklarer datoformat, regler eller begrensninger (valgfritt)
3. InputfeltFeltet der brukeren kan skrive inn dato manuelt, eller hvor valgt dato vises
4. KalenderikonÅpner kalenderen ved klikk
5. Kalender (med navigasjon og datoer)Viser valgt mÄned
6. Dagens datoDatoen som er dagens dato, markert i kalenderen
7. Valgt dato/valgt periodeDatoen eller perioden brukeren har valgt, markert i kalenderen og vist i inputfeltet
Datepicker anatomi.

Implementasjon i kode

Hvordan ta komponenten i bruk?

import @oslokommune/punkt-elements/dist/pkt-datepicker.js;
import { PktDatepicker } from '@oslokommune/punkt-react';
<script src="https://punkt-cdn.oslo.kommune.no/20/elements/pkt-datepicker.js" type="module"></script>

Bruk i skjema

I Elements fungerer Date picker nÊr identisk med <select> i skjemaer. For én dato sendes én verdi ut i skjemaet (som vanlig select). For flere datoer og perioder sendes én verdi per dato (som select multiple), ogsÄ nÄr feltet er forhÄndsutfylt.

I React sendes alle datoene som én kommaseparert verdi, for eksempel 2024-06-10,2024-06-20. Trenger du datoene som en array, bruk onValueChange, som kalles med en string[].

HendelseshÄndtering

Date picker for Ă©n enkel dato har en change-hendelse som sendes ut nĂ„r ny dato velges (onChange i React). Denne er en “standard” hendelse som sendes ut fra alle input-elementer, som returnerer en Event med target.value som inneholder datoen.

For Date picker med flere datoer, enten som periode eller frittstÄende datoer, bÞr man bruke hendelsen value-change (onValueChange i React). Denne hendelsen sender ut en CustomEvent med detail som inneholder en array av datostrenger.

Testing

Elements: Dersom du skal skrive tester med JSDOM eller liknende er det viktig at du lar komponenten bli rendret ferdig fĂžr du tester den. Dette kan gjĂžres ved Ă„ kjĂžre denne kodelinjen fĂžr testene kjĂžres:

await window.customElements.whenDefined("pkt-datepicker");

Om du bruker data-testid for Ä hente ut elementer i testene, vil attributten videresendes til selve skjemaelementet. Dersom du heller Þnsker Ä bruke data-testid pÄ elementet <pkt-datepicker>, mÄ du sette attributten skipForwardTestid pÄ elementet.

Egenskaper

PktDatepicker

Props

Prop:
name?
Type:
string
Beskrivelse:
Navn som brukes i skjema ved innsending
Prop:
form?
Type:
string
Beskrivelse:
ID-en til skjemaet feltet hÞrer til, nÄr feltet ligger utenfor skjemaet
Prop:
label
Type:
string
Beskrivelse:
Tekst som vises over feltet. PÄkrevd i React. Elements bruker «Datovelger» hvis den mangler.
Prop:
helptext?
Type:
string
Beskrivelse:
Hjelpetekst som vises over feltet
Prop:
helptextDropdown?
Type:
string
Beskrivelse:
Hjelpetekst som vises i en lukket boks man kan Äpne
Prop:
helptextDropdownButton?
Status:
Deprecated Bruk strings={{ forms: { readMore: '
' } }} eller setPktStrings().
Type:
string
Beskrivelse:
Tekst pÄ knappen som Äpner og lukker den utvidede hjelpeteksten
Prop:
dateformat?
Type:
string
Standardverdi:
"dd.MM.yyyy"
Beskrivelse:
Formatet datoene vises i, i taggene ved flervalg
Prop:
currentmonth?
Type:
ISOdatestring
Beskrivelse:
MÄneden kalenderen Äpner pÄ, som ISO-dato
Prop:
value?
Type:
ISOdatestring
Beskrivelse:
Valgte datoer i ISO-format. Kommaseparert ved flervalg og datotidsrom. React godtar ogsÄ en liste.
Prop:
excludeweekdays?
Type:
string
Beskrivelse:
Ukedager (1-7) som ikke kan velges. Kommaseparert i Elements, en liste i React.
Prop:
excludedates?
Type:
ISOdatestring
Beskrivelse:
Datoer som ikke kan velges. Kommaseparert i Elements, en liste i React.
Prop:
min?
Type:
ISOdatestring
Beskrivelse:
Tidligste dato som kan velges, som ISO-dato
Prop:
max?
Type:
ISOdatestring
Beskrivelse:
Seneste dato som kan velges, som ISO-dato
Prop:
weeknumbers?
Type:
boolean
Standardverdi:
false
Beskrivelse:
Viser ukenummer i kalenderen
Prop:
withcontrols?
Type:
boolean
Standardverdi:
false
Beskrivelse:
Viser nedtrekkslister for mÄned og Är i kalenderen
Prop:
multiple?
Type:
boolean
Standardverdi:
false
Beskrivelse:
Lar brukeren velge flere datoer
Prop:
maxlength?
Type:
number
Beskrivelse:
StĂžrste antall datoer som kan velges ved flervalg. Viser en teller. 0 betyr ingen grense.
Prop:
range?
Type:
boolean
Standardverdi:
false
Beskrivelse:
Lar brukeren velge en fra-dato og en til-dato
Prop:
showRangeLabels?
show-range-labels?
Type:
boolean
Standardverdi:
false
Beskrivelse:
Viser «Fra» og «Til» foran feltene i et datotidsrom
Prop:
today?
Type:
ISOdatestring
Beskrivelse:
ISO-datostreng som overstyrer dagens dato i kalenderen. Nyttig for snapshot-tester.
Prop:
calendarOpen?
calendar-open?
Type:
boolean
Standardverdi:
false
Beskrivelse:
Om kalenderen er Äpen
Prop:
hasError?
Type:
boolean
Standardverdi:
false
Beskrivelse:
Indikerer om feltet har en feil
Prop:
errorMessage?
Type:
string
Beskrivelse:
Tekst som vises under feltet ved feiltilstand
Prop:
disabled?
Type:
boolean
Standardverdi:
false
Beskrivelse:
Indikerer om feltet er deaktivert
Prop:
fullwidth?
Type:
boolean
Standardverdi:
false
Beskrivelse:
Indikerer om feltet skal ta opp full bredde
Prop:
inputSize?
input-size?
Type:
"xsmall" | "small" | "medium"
Standardverdi:
"medium"
Beskrivelse:
StÞrrelsen pÄ komponenten
Prop:
required?
Type:
boolean
Standardverdi:
false
Beskrivelse:
Er feltet pÄkrevd?
Prop:
requiredTag?
Type:
boolean
Standardverdi:
false
Beskrivelse:
Viser en merking som indikerer at feltet er pÄkrevd
Prop:
requiredText?
Status:
Deprecated Bruk strings={{ forms: { required: '
' } }} eller setPktStrings().
Type:
string
Beskrivelse:
Tekst som vises i pÄkrevd-merkingen
Prop:
optionalTag?
Type:
boolean
Standardverdi:
false
Beskrivelse:
Viser en merking som indikerer at feltet er valgfritt
Prop:
optionalText?
Status:
Deprecated Bruk strings={{ forms: { optional: '
' } }} eller setPktStrings().
Type:
string
Beskrivelse:
Tekst som vises i valgfritt-merkingen
Prop:
tagText?
Type:
string
Beskrivelse:
Tekst som vises i en tag ved siden av label
Prop:
useWrapper?
Type:
boolean
Standardverdi:
true
Beskrivelse:
Indikerer at feltet skal ha synlig label og hjelpetekst
Prop:
id
Type:
string
Beskrivelse:
Unik identifikasjon for datovelgeren. PÄkrevd i React. Elements lager en id hvis den mangler.
Prop:
ariaDescribedby?
aria-describedby?
Type:
string
Beskrivelse:
Spesifiserer ID-en til elementet som beskriver feltet.
Prop:
inline?
Type:
boolean
Standardverdi:
false
Beskrivelse:
Angir om feltet skal flyte med teksten
Prop:
hasFieldset?
Type:
boolean
Beskrivelse:
Bruk fieldset og legend i stedet for label.
Prop:
counter?
Type:
boolean
Beskrivelse:
Viser teller under feltet. SlÄs pÄ av seg selv nÄr det finnes en grense Ä telle mot; sett til false for Ä skru den av.

Events

Event:
change
Type:
Event
Beskrivelse:
Fyres nÄr en dato velges. Verdien ligger pÄ elementet som kommaseparerte ISO-datoer. I range-modus fyres den nÄr perioden er komplett eller tÞmt, ikke nÄr bare fra-datoen er fylt inn.
Event:
value-change
Type:
CustomEvent
Beskrivelse:
Returnerer verdien i event.detail: en ISO-dato som streng for én dato, en array med ISO-datoer ved flervalg og datotidsrom. Fyres ved hver verdiendring, ogsÄ nÄr bare fra-datoen er fylt inn.
Event:
focus
Type:
FocusEvent
Beskrivelse:
Fyres én gang nÄr fokus gÄr inn i datovelgeren: feltet, kalenderknappen eller kalenderen. Flytting mellom dem fyrer ingenting.
Event:
blur
Type:
FocusEvent
Beskrivelse:
Fyres én gang nÄr fokus forlater datovelgeren, ogsÄ fra kalenderen. relatedTarget er elementet som fÄr fokus.
Event:
onChange
Type:
(e: ChangeEvent<HTMLInputElement>) => void
Beskrivelse:
Fyres nÄr en dato velges. e.target.value inneholder kommaseparerte ISO-datoer. I range-modus fyres den nÄr perioden er komplett eller tÞmt, ikke nÄr bare fra-datoen er fylt inn.
Event:
onFocus
Type:
(e: FocusEvent<HTMLInputElement>) => void
Beskrivelse:
Kalles én gang nÄr fokus gÄr inn i datovelgeren: feltet, kalenderknappen eller kalenderen. Flytting mellom dem kaller den ikke.
Event:
onBlur
Type:
(e: FocusEvent<HTMLInputElement>) => void
Beskrivelse:
Kalles én gang nÄr fokus forlater datovelgeren, ogsÄ fra kalenderen. e.target er det skjulte feltet med name, som i onChange, sÄ register() fra react-hook-form fungerer.
Event:
onValueChange
Type:
(values: string[]) => void
Beskrivelse:
Kalles med en string[] med valgte datoer i ISO-format, ved hver verdiendring, ogsÄ nÄr bare fra-datoen er fylt inn.

OBS! dateformat er standard formatteringsstreng for visning av datoer. Denne brukes for Ă„ sette “menneskeleselig” format pĂ„ datoene i tags ved flervalgsmodus.