Valitsen sovelluksissa ja verkkosivuilla kalenterista usein väärän päivän. Syynä on esitettävässä kalenterissa viikon alkaminen maanantain sijaan sunnuntaina. Toisin kuin mihin olemme pienestä pitäen tottuneet.

Power Appsissa on sama ongelma.

kalenteri

Onneksi Power Appsin päivävalinta (date picker) -kontrollin asetuksista löytyy StartOfWeek ominaisuus. Vaihtamalla arvo maanantaiksi (StartOfWeek.Monday), muuttuu kalenteri meille tuttuun muotoon.

kalenteri asetukset

Tältäosin asia on kunnossa.

Kalenteri-sivupohja

Power Appsissa on mainiota valmiita sivupohjia eri tarpeisiin. Esimerkiksi kalenteri-sivu.

kalenteri template

Sivulla voi selata valitsemansa Office 365 Outlook -kalenterin tapahtumia.

kalenteri template live

Esimerkiksi käyttämämme tuntikirjaustyökalu on toteutettu muokkaamalla tätä samaista sivupohjaa.

hour reporting final

Huomaat varmaan pienen ärsyttävän yksityiskohdan alkuperäisessä mallissa.

Kyllä. Viikko alkaa sunnuntaista.

kalenteri template starting date

Viikon ensimmäisen päivän muuttaminen

Tämä pitää tietenkin korjata.

Kalenterin päivät ovat käytännössä yksi galleria, joka sisältää

  • otsikon (päivän numero)
  • ympyrän (valittu päivä)
  • pikkuympyrän (onko päivälle tehty kalenterimerkintöjä)

kalenteri template structure

Kalenterin päivien esittämistä varten on käytössä kolme muuttujaa

  • _firstDayOfMonth (näytettävän kuukauden ensimmäinen päivä)
  • _lastDayOfMonth (näytettävän kuukauden viimeinen päivä)
  • _firstDayInView (galleriassa näytetävä ensimmäinen päivä (aina sunnuntai), kuvassa 29. maaliskuuta)

Näiden muuttujien arvot alustetaan joka kerta kun

  • alasvetovalikosta valitaan Outlook-kalenteri
  • siirrytään kuluvaan päivään
  • siirrytään edelliseen kuukauteen
  • siirrytään seuraavaan kuukauteen

kalenteri updated variables

Haluamme muuttaa viikon ensimmäisen päivän sunnuntaista maanantaiksi. Eli kaikkialla, missä _firstDayInView-muuttuja alustetaan, vähennetään siitä yksi.

Alkuperäinen

Set(_firstDayInView, 
DateAdd(_firstDayOfMonth, -(Weekday(_firstDayOfMonth) - 2 + 1), Days))

Korjattu

Set(_firstDayInView,
DateAdd(_firstDayOfMonth,-(Weekday(_firstDayOfMonth)-2),Days)))

Näin gallerian ensimmäisen näytettävä päivä vaihtuu sunnuntaista maanantaihin.

Huom! Viikonpäivien otsikot ovat edelleen väärät, päivämäärät ovat jo oikeat.

kalenteri maaliskuu

Paitsi jos kuukausi alkaa sunnuntaista. Tällöin olemme onnistuneet hukkaamaan yhden päivän.

kalenteri maaliskuu2

Täsmennetään logiikkaa seuraavasti

  • mikäli viikon ensimmäinen päivä on sunnuntai (Weekday(_firstDayOfMonth)=1)
    • näkymän ensimmäinen päivä on kuusi päivää aikaisempi kuin kuukauden ensimmäinen päivä
  • muutoin
    • näkymän ensimmäinen päivä on alunperin laskemamme
If(Weekday(_firstDayOfMonth)=1,
  Set(_firstDayInView,
  DateAdd(_firstDayOfMonth,-6,Days)),
  Set(_firstDayInView,
  DateAdd(_firstDayOfMonth,-(Weekday(_firstDayOfMonth)-2),Days))
)

Nyt myös maaliskuu näkyy oikein

kalenteri maaliskuu3

Viikonpäivien otsikot

Korjataan vielä viikonpäivien otsikot. Alkuperäisessä ratkaisussa käytetään kalenterin WeekDaysShort-funktiota.

kalenteri weekdays

Tyydymme korvaamaan sen kovakoodatulla taulukolla.

Items: ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]

Kalenterin viimeinen rivi

Enää yksi yksityiskohta jäljellä. Muutosten jälkeen kalenterin viimeiseltä viikolta puuttuu aina yksi päivä. Eli päivän esittämän otsikon (title) visible-arvossa on jotain pielessä.

kalenteri vika päivä puuttuu

Lisätään kaavaan -1 (lihavoitu), niin sekin on kunnossa.

Visible: !(DateAdd(_firstDayInView,ThisItem.Value,Days) - 
         Weekday(DateAdd(_firstDayInView,ThisItem.Value-1,Days)) > 
         _lastDayOfMonth)

Näin meillä on kalenteri, joka näyttää ja tuntuu oikealta.