Esikatselu
<DatePickerV2 labelText="Lorem Ipsum" />
Käyttötarkoitus
Päivämäärävalitsin (DatePickerV2) tarjoaa käyttäjälle päivämäärän syöttökentän ja kalenterinäkymän päivämäärän valitsemiseen.
Päivämäärän voi syöttää muodoissa pp.kk.vvvv
, p.k.vvvv
, ppkkvvvv
sekä vvvv-kk-pp
.
- Estä päivät tai aikavälit, joita käyttäjä ei saa valita.
- Jos käytät päivämäärävalitsinta tilanteessa, jossa on tarve syöttää päivämäärä usean vuoden päähän, aseta rajoitus päivämääräväliin. Tällöin käyttäjälle tulee kuukausi- ja vuosivalikot näkyviin.
- Harkitse käytätkö päivämäärävalitsinta, jos on tarve syöttää päivämäärää usean vuoden päähän. Tällöin kannattaa useimmiten käyttää tavallista tekstikenttää (Input).
- Jos käyttäjän tulee syöttää hänelle tuttu päivämäärä, esimerkiksi oma syntymäaika, kannattaa käyttää tavallista tekstikenttää (Input).
Saavutettavuus
Komponenttiin sisältyvä kalenteri tukee näppäimistönavigaatiota kohdistuksen ollessa kalenterinäkymän päivämäärävalinnoissa. Huom. ruudunlukijan käyttö saattaa vaikuttaa näppäimistönavigaation toimintatapaan.
|
Nuoli vasemmalle | Siirry edelliseen päivään. |
Nuoli oikealle | Siirry seuraavaan päivään. |
Nuoli ylös | Siirry edelliseen viikkoon. |
Nuoli alas | Siirry seuraavaan viikkoon. |
Page Up | Siirry edelliseen kuukauteen. |
Page Down | Siirry seuraavaan kuukauteen. |
Shift + Page Up | Siirry edelliseen vuoteen. |
Shift + Page Down | Siirry seuraavaan vuoteen. |
Home | Siirry viikon alkuun. |
End | Siirry viikon loppuun. |
Ruudunlukijalle tarkoitettuja tekstejä voi muokata komponentin localization
-propin avulla. Saman propin avulla voi toteuttaa kalenterinäkymän lokalisointia mikäli käyttöliittymä näytetään jollain muulla kielellä kuin suomeksi.
Tarkemmat ohjeet localization
-propin käytöstä löydät kalenterin lokalisointi osiosta.
Päivämäärän valinta
Oletuksena päivämäärä on asettamatta ja kalenteri avautuu kuluvan kuukauden kohdalta.
<DatePickerV2
labelText="Päivämäärä"
helpText="Ilmoita päivämäärä muodossa pp.kk.vvvv"
onChange={(dateValue, validity) => console.log("onChange", dateValue, validity)}
onSelect={(dateValue, validity) => console.log("onSelect", dateValue, validity)}
onError={(dateValue, validity) => console.log("onError", dateValue, validity)}
onBlur={(e, validity) => console.log("onBlur:", e, validity)}
/>
Oletuspäivän asettaminen
Komponentille voi määrittää oletuksena valitun päivämäärän. Oletusarvon ollessa käytössä kalenteri avataan aina oletuksena annetun päivämäärän kuukauden kohdalta. Oletusarvon voi antaa Date
-objektina tai vvvv-kk-pp
-muotoisena tekstiarvona.
<DatePickerV2
defaultValue={new Date(2022, 3, 12)}
onChange={(dateValue, validity) => console.log("onChange", dateValue, validity)}
labelText="Päivämäärä"
helpText="Ilmoita päivämäärä muodossa pp.kk.vvvv"
showWeekNumbers
/>
Valinnan estäminen tietyiltä päiviltä tai aikaväleiltä
Valinta voidaan estää tietyiltä päiviltä tai aikaväleiltä. Estettyä päivää ei pysty valitsemaan kalenterista ja jos sen syöttää käsin, tulee käyttäjälle esittää virheilmoitus.
Valinta voidaan estää:
- yksittäisiltä päiviltä,
- tietyltä aikaväliltä,
- ennen tiettyä päivämäärää,
- tietyn päivämäärän jälkeen, tai
- tietyiltä viikonpäiviltä.
<DatePickerV2
calendarDefaultMonth="2022-06"
onChange={(dateValue, validity) => console.log("onChange", dateValue, validity)}
disabledDates={[
"2022-06-10",
"2022-06-12",
{ from: "2022-06-10", to: "2022-06-28" },
{ after: "2022-07-15" },
{ before: "2022-05-15" },
{ dayOfWeek: [0, 6] }, // 0 (sunday) ... 6 (saturday)
]}
labelText="Päivämäärä"
helpText="Ilmoita päivämäärä muodossa pp.kk.vvvv"
/>
Päivämäärien validointi ja virheviestien asettaminen
Virhetilan asettaminen
Komponentin voi asettaa virhetilaan errorText
ja invalid
-proppien avulla.
<DatePickerV2
labelText="Päivämäärä"
helpText="Ilmoita päivämäärä muodossa pp.kk.vvvv"
errorText="Virheellinen päivämäärä. Ilmoita päivämäärä muodossa pp.kk.vvvv."
invalid
/>
Esimerkki virheenkäsittelyn toteuttamisesta
Komponentti palauttaa kaikkien tapahtumien (onChange
, onSelect
, onError
ja onBlur
) mukana validity
-objektin,
josta löytyy validoinnin tila, virheen tyyppi ja virheviesti, sekä päivämäärä ISO ja Date-muotoisena tietona
(silloin kun input-kentän arvosta voidaan muodostaa päivämäärä). Sisäinen validointi kattaa komponentin tarjoamien proppien validoinnin.
Tarvittaessa sisäisen validoinnin voi jättää huomiotta, koska komponentti ei itse aseta itseään virhetilaan, vaan se tehdään
errorText
ja invalid
-proppien avulla.
Alta löytyy karkea esimerkki dynaamisen virheentarkistuksen toteuttamisesta:
function DatePickerV2Example() {
const [error, setError] = useState("");
const handleError = (validity) => {
if (validity.isValid) {
setError("");
} else {
setError(validity.error.message);
}
};
return (
<DatePickerV2
required
onChange={(dateValue, validity) => {
console.log("onChange", dateValue, validity);
handleError(validity);
}}
onBlur={(e, validity) => {
console.log("onBlur", e.target.value, validity);
handleError(validity);
}}
disablePast
invalid={!!error}
errorText={error}
labelText="Päivämäärä"
helpText="Syötä kenttään mennyt päivämäärä, tai siirry pois tyhjästä kentästä, niin saat virheilmoituksen esiin."
/>
);
}
Päivämäärien validointi getDateValidator-funktiolla
Myös komponentin käyttämää getDateValidator
-funktiota voi hyödyntää validoinnin toteuttamiseen.
Funktiolle annetaan samat validointisäännöt (required
, fromDate
, toDate
, disabledDates
, disablePast
), kuin komponentille.
Tätä voi hyödyntää esimerkiksi React Hook Formin validate
-funktiossa. Oletusvirheilmoituksia voi päivittää errorTexts
-objektin kautta.
function DatePickerV2Example() {
const defaultValue = new Date("2022-12-10");
const validationProps = {
fromDate: new Date("2023-01-01"),
toDate: new Date("2023-12-31"),
required: true,
};
const validationResult = getDateValidator({
...validationProps,
errorTexts: { notInRangeFrom: "Päivämäärä ei ole sallitulla aikavälillä." },
}).validate(defaultValue);
return (
<DatePickerV2
calendarDefaultMonth="2023-10"
defaultValue={defaultValue}
labelText="Päivämäärä"
helpText="Ilmoita päivämäärä muodossa pp.kk.vvvv"
errorText={validationResult.error.message}
invalid={!validationResult.isValid}
{...validationProps}
/>
);
}
Validoinnin palauttamat arvot
|
isValid | Kertoo onko päivämäärä hyväksytty arvo (oikea päivämäärä ja läpäisee validoinnit). |
valueAsDate | Päivämäärä Date -objektina, silloin kun input-kentän syötteestä pystytään muodostamaan päivämäärä. |
valueAsISO | Päivämäärä ISO-muotoisena tekstinä (esim. 2023-10-30), silloin kun input-kentän syötteestä pystytään muodostamaan päivämäärä. |
error.type | Virheen tyyppi: dateDisabled , invalidFormat , notInRangeFrom , notInRangeTo , required |
error.message | Oletusvirheviesti, jota voi päivittää localization -propin kautta. |
Vuosi- ja kuukausivalikon näyttäminen
Vuosi- ja kuukausivalikon saa näkyviin, kun valinnan rajoittaa tietylle aikavälille. Valittavia päivämääriä voidaan rajoittaa tietylle välille fromDate
- ja toDate
-proppien avulla.
Vuosi- ja kuukausivalikkojen näyttämisen voi tarvittaessa estää asettamalla showDropdownNavigation
-propin arvoksi false
.
<DatePickerV2
labelText="Päivämäärä"
helpText="Ilmoita päivämäärä muodossa pp.kk.vvvv"
fromDate="2020-01"
toDate="2024-12"
// showDropdownNavigation={false}
/>
Viikkonumeroiden näyttäminen
Kalenteriin saa halutessa viikkonumerot näkyviin showWeekNumbers
-propilla.
<DatePickerV2 labelText="Päivämäärä" helpText="Ilmoita päivämäärä muodossa pp.kk.vvvv" showWeekNumbers />
Päivämääräarvon näyttäminen etunollien kanssa
Input-kentässä näytettävä päivämääräarvo voidaan tarvittaessa esittää etunollien kanssa asettamalla showLeadingZeros
-propin arvoksi true
. Oletuksena etunollia ei näytetä.
<DatePickerV2 labelText="Päivämäärä" defaultValue="2022-01-01" showLeadingZeros={true} />
Estetty kenttä
Kentän voi tarvittaessa asettaa estetyksi, eli disabloiduksi. Tällöin päivämäärää ei pääse syöttämään tekstinä, eikä kalenterin kautta.
<DatePickerV2 disabled labelText="Päivämäärä" />
Kokovaihtoehdot
<>
<DatePickerV2 labelText="Päivämäränvalinta xs-koossa" size="xs" />
<DatePickerV2 labelText="Päivämäränvalinta sm-koossa" size="sm" />
<DatePickerV2 labelText="Päivämäränvalinta md-koossa (oletus)" />
</>
Päivämääräarvon päivittäminen komponentin ulkopuolelta
Tarvittaessa päivämääräarvon voi päivittää tai tyhjentää komponentin ulkopuolelta antamalla value
-arvon.
Ref
-propin kautta pääsee käsiksi input-elementtiin, joka mahdollistaa esimerkiksi kohdistuksen siirtämisen kenttään.
function DatePickerV2Example() {
const ref = React.useRef();
const [value, setValue] = useState("");
return (
<>
<DatePickerV2
ref={ref}
onChange={(dateValue, validity) => {
console.log("onChange", dateValue, validity);
setValue(dateValue);
}}
labelText="Päivämäärä"
helpText="Ilmoita päivämäärä muodossa pp.kk.vvvv"
value={value}
/>
<ButtonGroup horizontal>
<Button onClick={() => setValue("1.1.2023")}>Aseta arvo</Button>
<Button onClick={() => setValue("")} appearance="outline">
Tyhjennä
</Button>
<Button onClick={() => ref.current.focus()} appearance="outline">
Kohdista kenttään
</Button>
</ButtonGroup>
</>
);
}
Kaksipalstainen asettelu
Kaksipalstaisessa asettelussa tulostetaan leftCol
-propilla kentän nimilappu ja aputeksti Column
-komponentin sisään.
<DatePickerV2
labelText="Päivämäärä"
helpText="Ilmoita päivämäärä muodossa pp.kk.vvvv"
fromDate={new Date(2022, 7)}
toDate={new Date(2022, 10, 30)}
leftCol={(children) => <Column md="4">{children}</Column>}
/>
Kalenterin lokalisointi
Lokalisointia tulee tehdä, jos käyttöliittymä näytetään jollain muulla kielellä kuin suomeksi tai jos suomenkielisiä ruudunlukijalle luettavia tekstejä halutaan muuttaa.
Kalenterinäkymän lokalisointi onnistuu localization
-propin avulla. Propin sallima lokalisaatio-objekti sisältää locale
-arvon, joka on tyypiltään date-fns
-kirjaston Locale
.
Lisäksi localization
-objektin kautta pääsee muokkaamaan kalenteriin liittyvien toimintojen ruudunlukijoille annettavia label-tekstejä.
Funktio-muotoisten lokalisaatio-objektin labelien saama parametri riippuu käyttötapauksesta. Tarkempia tietoja
labeleista ja niiden parametreista selviää tutkimalla omassa koodieditorissa komponentin saamia tyypityksiä.
<DatePickerV2
labelText="Date"
helpText="Enter the date as dd.mm.yyyy"
placeholder="dd.mm.yyyy"
localization={{
ariaStatusClearDate: "Selected date removed",
labelClearDate: "Clear date",
labelMonthDropdown: () => "Month",
labelWeekNumber: (week) => `Week ${week}`,
labelYearDropdown: () => "Year",
labelNext: () => "Go to next month",
labelPrevious: () => "Go to previous month",
labelToggleCalendar: "Choose a date",
labelCloseCalendar: "Close the calendar",
labelSelected: "selected",
labelGoToCurrentDay: "Go to current day",
locale: enGB, // import { enGB } from "date-fns/locale/en-GB";
errorTexts: {
dateDisabled: "The selected date is not allowed. Choose another date.",
invalidFormat: "Invalid date. Enter the date as dd.mm.yyyy.",
notInRangeFrom: "Invalid date. Check that the day is within the allowed range.",
notInRangeTo: "Invalid date. Check that the day is within the allowed range.",
required: "The date is mandatory. Enter the date as dd.mm.yyyy.",
},
}}
/>
Tekniset rajoitteet
- Kontrolloituna komponenttina käytettäessä päivämääräarvo tulee antaa
value
-propille pp.kk.vvvv
-muodossa (samassa muodossa kuin input-kentässä).