Power Fx liitännäiset (plugins) julkaistiin keväällä kokeellisena (experimental) ominaisuutena . Plugineja on voinut tehdä Dataversen varmaan aina, mutta nyt niitä voi tehdä Power Fx:llä. Vieläpä kansalaiskehittäjätyyliin, eli helpolla.

Pluginit ovat käytännössä koodinpätkiä, joita suoritetaan Dataversessä pilvessä (ei siis loppukäyttäjän selaimessa). Ne voivat käynnistyä automaattisesti riviä lisättäessä, muokattaessa tai se poistettaessa Dataversessä (Automated plugin). Plugini voi olla myös erikseen käynnistettävä (Instant plugin).

Dataverse Accelerator

Power Fx pluginien tekeminen edellyttää Dataverse Acceleratorin asennusta. Ei erityisen hankalaa. Asennuksen jälkeen ympäristöstä löytyy Dataverse Accelerator App.

Sovelluksella pääsee luomaan näitä mystisiä plugineja.

Mutta mitä ihmettä näillä plugineilla voi tehdä?

Tutustutaan niihin muutama esimerkin avulla.

Automaattisesti käynnistyvä plugin (Automated)

Lomakkeen tietojen validointi

Teemme lomakkeella tilauksia. Yksi lomakkeen tiedoista on tilaajan y-tunnus (business id).

Ennen lomakkeen tietojen tallennusta, haluamme varmistaa y-tunnuksen olevan oikeassa muodossa.

Tämän voisi tehdä JavaScriptillä, mutta luodaan sen sijaan automaattisesti käynnistyvä plugin joka käynnistyy kun tilausta ollaan luomassa (Created).

Luonnin yhteydessä tarkistetaan säännöllisellä lauseella onko y-tunnus on muodossa 1234567-1. Mikäli ei ole, näytetään käyttäjälle virheilmoitus.

If(
   !IsMatch(ThisRecord.cra3a_businessid, "^\d{7}-\d{1}$"), 
   Error({ Kind: ErrorKind.Validation , Message: "Not valid Business Id"})
   )

Tämä tehdään ennen tietojen tallennusta (Pre-operation). Käytännössä estämme lomakkeen tallentamisen, mikäli y-tunnus ei ole oikeassa muodossa.

Kas näin.

Toisin kuin JavaScript, plugin estää tietojen tallennuksen kaikkialla. Kaikilla lomakkeilla, mutta myös canvas -sovelluksissa. Virheilmoitus ei tosin ole yhtä selvä.

Lokirivin luominen

Voimme tehdä pluginissa (lähes) kaikkea minkä Power Fx mahdollistaa. Alla luodaan lokitauluun (Log) uusi rivi tilausrivin (Order) luonnin yhteydessä.

Vastaavalla tavalla voisimme esimerkiksi

  • Täyttää tietyt lomakkeen tiedot tallennuksen jälkeen täytettyjen tietojen / jonkun muun tietueen tietojen pohjalta
  • Luoda muita rivejä ja liittää ne tähän riviin (esim. vakio tilausrivin kuten käsittely- tai postimaksun)
  • Riviä poistettaessa poista omalla logiikalla myös muita rivejä
  • jne

Manuaalisesti käynnistyvä plugin (Instant)

Manuaalisesti käynnistyvä plugin on ikäänkuin funktio, jota voi kutsua eri paikoista. Sille voi välittää parametreja (input parameters) ja se voi palauttaa kutsujalleen arvoja (output parameters).

Katsotaan tästäkin pari esimerkkiä.

Merkkijonon katkaisu

Tehdään plugin, joka katkaisee merkkijonon sen ollessa liian pitkä (yli 12 merkkiä).

Annetaan pluginille nimi ja kuvaus.

Tämän jälkeen määritellään parametrit.

  • Sisään tulee Title (string)
  • Kutsujalle palautetaan ShortTitle (string)

Koodi on yksinkertainen.

{ShortTitle: If(Len(Title)>12, Left(Title,10) &"..", Title)}

Miten pluginia kutsutaan canvas appsista?

Sovellukseen tulee lisätä tietolähteeksi Environments. Ympäristön pluginit löytyvät sieltä.

Lisätään sovellukseen tekstin syöttökenttä (Text input), jonka arvon muuttuessa (OnChange) kutsutaan pluginia. Paluuarvo (ShortTitle) tallennetaan muuttujaan (locShortText).

UpdateContext(    {locShortText:Environment.cra3a_GetFirst10Character({Title:Self.Text}).ShortTitle}
)

Lisätään näytölle otsikkokenttä (label), jossa näytetään muuttujan arvo.

Toimii!

Miksi emme lisää pluginin kutsua suoraan tekstikentän arvoksi? Koska emme voi. Pluginia voi käyttää ainoastaan tapahtuman (OnSelect, OnUpdate, OnChange jne) yhteydessä.

Tämä esimerkki kannattaisi tosin oikeasti toteuttaa komponenttina. Pluginit suoritetaan Dataversessä, ei selaimessa. Eli Dataverseen lähtee kysely aina käyttäjän muokatessa tekstikentän arvoa.

Toisaalta voin käyttää samaa pluginia flow’ssa. Perform an unbound action -toiminnolla.

Lopputulos on tietenkin sama.

Sovelluksen sisäiset ilmoitukset (In-app notifications)

Tälle on yllättävän usein käyttöä. Kuvitellaan tilanne, jossa model-driven appsin lomakkeelta käynnistetään flow.

Flow’n suoritus kestää pitkään (useita minuutteja) ja haluamme ilmoittaa käyttäjälle aikanaan flow’n suorituksen päättymisestä.

Luodaan plugin, joka lähettää käyttäjälle ilmoituksen.

Plugin saa parametrina

  • Ilmoituksen saavan käyttäjän Azure tunnisteen (UserAADObjectId)
  • Onnistuiko flow’n suoritus (succeed)
  • Miltä tietueelta flow käynnistettiin (rowItemGuid)

Ilmoitus lähetetään seuraavalla Power Fx komennolla.

XSendAppNotification(
    "Long running operation is now done", 
    LookUp(Users, 'Azure AD Object ID'= GUID(UserAADObjectId)),
    If(succeed,
       "All good, ready to go!", 
       "Background flow failed. Please try again."
      ),
    [
 	XCreateSidePaneActionForEntity(
     	  "View Item",
 	  rowItemGuid,
 	  "Test Table Item",
 	  "cra3a_testtableplugins",
 	  LookUp(
            'test table plugins',
            'test table plugins'=GUID(rowItemGuid)
           ).'test table plugins'
     	 )
    ]
)

Sovelluksen sisäiset ilmoitukset eivät ole käytössä oletuksena. Laitetaan ne päälle model-drivn appsin asetuksista.

Nyt voimme flow’n lopussa lähettää ilmoituksen sen käynnistäneelle käyttäjälle.

Kas näin!

Yhteenveto

Power Fx pluginit ovat edelleen kokeellinen ominaisuus. Älä käytä niitä missään oikeassa ympäristössä.

Valmistuttuan ne ovat mainio lisä Power Platform -tekijän työkalupalettiin. Cloud flow’n, perinteisten työnkulkujen, mukautettujen toimintojen jne lisäksi.

Ne ovat myös mainio esimerkki siitä, miten Power Fx leviää Power Platformissa kaikkialle.

Sitä on siis hyödyllistä osata.