Mikäli olet tutustunut Power Platformiiin canvas -sovelluksia tekemällä, saattavat mallipohaiset (model-driven) -sovellukset tuntua tuskaisen rajoittuneilta.
Ja sitä ne ovatkin. Se on koko niiden idea ja kauneus. Mallipohjaiset sovellukset pohjautuvat tietomalliin. Sooloilujen ja viritysten teko on hankalaa tai mahdotonta. Toisaalta mallipohjaiset sovellukset ovat todella varmatoimisia. Niiden kanssa toimiessa ei tarvitse ihmetellä ja testata toimiiko lomakkeen tallennus vai ei. Se toimii.
Välillä näiden ihanien mallipohjaisten sovellusten toiminnallisuuksia on kuitenkin tarve rikastaa. Tällä kertaa tutustutaan yhteen tällaiseen tarpeesen.
Eli miten toteutetaan oman toiminnon käynnistys mallipohjaisen sovelluksen lomakkeelta?
Esimerkki – Ratkaisukortit (Solution Cards)
Tarkastellaan yksinkertaista sovellusta, jolla ylläpidetään tietoja organisaation käytössä olevista sovelluksista.

Kun sovelluksen tiedot on syötetty, lähetetään ne järjestelmään x. Milloin tiedot ovat valmiit lähetettäväksi? Sen päättää käyttäjä.
Käyttäjälle tulee siis tarjota keino käynnistää tietojen lähetys.
Toteutusvaihtoehtoja on useita.
Flow’n käynnistäminen lomakkeelta
Aloitetaan kaikkein yksinkertaisimmalla tavalla. Luodaan flow joka käynnistyy ratkaisukortin ollessa valittuna (When a record is selected). Flow lähettää kyseisen ratkaisukortin tiedot eteenpäin.

Nyt käyttäjä voi Flow-valikosta lähettää ratkaisun tiedot eteenpäin.

Helppoa, mutta käyttökokemus ei ole järin erikoinen. Eikä siihen voi vaikuttaa.

Käyttäjä ei myöskään saa mitään palautetta, onko tietojen lähetys onnistunut. Flow voi toki lähettää käyttäjälle esimerkiksi teams-viestin, mikäli lähetys menee pieleen. Mutta onhan se vähän kökköä.
Vipu (toggle)
Perinteinen tapa ratkaista tämäntyyppinen ongelma on lisätä ratkaisukortille uusi kyllä/ei -tyyppinen kenttä. Kentän (Ready for Sending) arvo ilmaisee ovatko lomakkeen tiedot valmiit eteenpäin lähetettäväksi.

Lisätään kenttä lomakkeelle ja muutetaan se vivuksi (toggle).

Käyttäjä merkitsee vivun avulla lomakkeen tiedot valmiiksi lähetetystä varten.

Tietojen lähetys tehdään flow’lla, joka käynnistyy vivun (tp_readyforsending) arvon muuttuessa.

Tarkalleen ottaen flow käynnistyy ainoastaan vivun muuttuessa arvoon true.
Trigger Conditions: @equals(triggerOutputs()?['body/tp_readyforsending'], true)

Kun tiedot on lähetetty eteenpäin, palautamme vivun alkuperäiseen tilaansa.

Toimii! Mutta voisiko tämän tehdä jotenkin toisin?
Lomakkeen merkitseminen valmiiksi komentopalkista (command bar)
Entä jos edellä esiteltyä vipua käytettäisiin komentopalkista? Otetaan ratkaisukortin komentopalkki muokattavaksi (Edit dommand bar).

Muokataan lomakkeen (Main form) valikkoa.

Lisätään (1) valikkoon PowerFx (2) painike.

Nimetään painike (1), vaihdetaan sen ikoni (2) sopivammaksi ja määritellään painike suorittamaan PowerFx komentoa (3).

Tämän jälkeen homma onkin tuttua canvas Power Appsista. Painiketta painettaessa (OnSelect) päivitetään rivin Ready for Sending -kentän arvoksi true (4).
OnSelect: Patch('Solution Cards', Self.Selected.Item, {'Ready for sending':true})
Käyttäjän painaessa painiketta (1), ratkaisukortti merkitään valmiksi lähetystä varten (2) ja tallennetaan. Mikäli käyttäjällä on lomakeella tallentamattomia muutoksia, tallentuvat ne samalla.

Valmis lähetettäväksi -vivun voi poistaa näkyvistä lomakkeelta.
Canvas -sovelluksen upottaminen lomakkeelle
Haluaisimme kertoa käyttäjälle heti painikkeen painamisen jälkeen, onnistuiko lähetys vai ei. Tämä onnistuu hyödyntämällä canvas-sovellusta.
Lisätään lomakkeelle yksinkertainen canvas-sovellus, jolla lähetys tehdään. Lisääminen on helpointa vanhasta käyttöliittymästä (classic) käsin.

Lomakkeelle lisätään sopivaan kohtaan kenttä (1, esim Name) ja muokataan kyseisen kentän ominaisuuksia (2, Change Properties).

Siirrytään Controls-välilehdelle (1), lisätään kontrolli ja valitaan Canvas app (2).

Vaihdetaan kontrolli käyttämään canvas-sovellusta (1) ja avataan se (2, Customize).

Tehdään responsiivinen canvas-sovellus, joka lähettää lomakkeen tiedot eteenpäin. Voimme näyttää käyttäjälle välittömästi palautteen lähetyksen onnistumisesta.

Näin meillä on mallipohjaisen sovelluksen lomakeelle upotettu painike.

Huomaa ettei painike ole näkyvillä uutta korttia luotaessa. Lomakkeelle upotettu canvas-sovellus näkyy vasta tietoja muokatessa (jolloin se tietää mihin Dataversen riviin se liittyy).

Dialogin avaaminen komentopalkista
Voimme avata komentopalkista oman dialogin (custom dialog). Dialogi on käytännössä sivu (custom page) -tyyppinen Power Apps.
Luodaan sellainen.

Yksinkertainen dialogimme näyttää tältä. Tämä Power Apps suorittaa varsinaisen lähetyksen ja kertoo käyttäjälle onnistuiko se.

Poimitaan luodun dialogin nimi talteen, tarvitsemme sitä JavaScriptissä, jolla dialogi avataan.

Luodaan javascript-tiedosto.
function openCustomPageDialog(primaryControl, firstSelectedItemId, selectedEntityTypeName)
{
// Centered Dialog
var pageInput = {
pageType: "custom",
name: "tp_dialogforsend_5d2c3",
entityName: selectedEntityTypeName,
recordId: firstSelectedItemId
};
var navigationOptions = {
target: 2,
position: 1,
height: {
value: 350,
unit: "px"
},
width: {
value: 350,
unit: "px"
},
title: "Send Data to system X"
};
Xrm.Navigation.navigateTo(pageInput, navigationOptions).then(
function () {
// Refresh the main form when the dialog is closed
primaryControl.data.refresh();
}
).catch (
function (error) {
// Handle error
}
);
}
Lisätään JavaScript ratkaisupakettiin omaksi resurssikseen (web resource).

Palataan muokkaamaan ratkaisukortin komentopalkkia. Vaihdetaan toiminnoksi JavaScriptin suorittaminen (1). Kirjastona (2) käytetään juuri luomaamme web-resurssia. Kutsuttava funktio (3) on JavaScriptistä löytyvä openCustomPageDialog.
Parametreina (4) välitetään PrimaryControl, FirstSelectedItemId ja SelectedEntityTypeName.

Nyt komentopalkista painiketta painettaessa näytölle avautuu rakentamamme dialogi.

Käyttäjän painaessa ”Lähetä” lähetämme tiedot eteenpäin ja kerromme samantien käyttäjälle onnistuiko lähetys.
Huomaa etteivät sivut (custom page) kokemukseni mukaan toimi, mikäli organisaatiossa on mcas (Microsoft Defender for Cloud Apps) käytössä.
Yhteenveto
Tämä oli jälleen oiva esimerkki siitä, miten saman ongelman voi ratkaista lukuisalla eri tavalla. Kaikissa on omat hyvät ja huonot puolensa.
Ja käsittelemättä jäi vielä kokonaan PCF-kontrollit (esim https://github.com/MscrmTools/PCF-Controls#action-button).