PowerApps -ratkaisussa tarvitsee usein kontrollin, josta käyttäjä voi valita yhden tai usean käyttäjän. Tällaista kontrollia kutsutaan people pickeriksi.

PowerApps luo lomakkeelle automaattisesti people pickerin. Mikäli tietovarastona on SharePoint-lista, jossa on People-tyyppinen sarake.

Mutta aina tietovarastona ei ole SharePoint-lista.

Jolloin ovatkin alkaneet ongelmat. Aiemmassa kirjoituksessani esittelin kikan, jolla people picker on helppo lisätä mille tahansa lomakkeelle.

Kikkojen aika on kuitenkin ohi. Vihdoin people pickerin voi tehdä järkevästi. Nimittäin käyttämällä Combo box -kontrollia ja siitä löytyvää henkilö (Person) asettelua.

Screenshot 2019-01-10 at 20.52.39.png

Katsotaan miten people picker toteutetaan sen avulla.

SharePoint-listan ja PowerAppsin luonti

Luodaan SharePoint-lista, jossa on kentät

  • UserName
  • UserEmail
  • Users

Screenshot 2019-01-10 at 21.00.22.png

Tämän jälkeen tehdään PowerApps olemassa olevan SharePoint-listan pohjalta.

screenshot 2019-01-10 at 21.02.17

Valitaan oikea sivusto ja sieltä lista.

Screenshot 2019-01-10 at 21.05.09.png

Siirrytään luodussa sovelluksessa muokkausnäytölle (EditScreen1) ja poistetaan lomakkeelta turhat kentät (UserEmail ja Attachments).Screenshot 2019-01-10 at 21.07.45.png

Kentät ovat lomakkeella korttien (DataCard) sisällä, eikä niitä oletusarvoisesti pääse juuri muokkaamaan. Avataan korttien (Title ja Users) lukitus valitsemalla kortti ja klikkaamalla Advanced -osiosta löytyvää lukon kuvaa.

Screenshot 2019-01-10 at 21.10.08.png

Henkilön valitseminen ComboBoxin avulla

Lisätään lomakkeen Title-korttiin Combo box, jonka asettelu vaihdetaan muotoon ”henkilö”.

Screenshot 2019-01-10 at 21.16.42.png

Voidaksemme etsiä käyttäjiä Azure Ad:sta, tarvitsemme yhdistimen (connector), joka sen osaa tehdä. Käytännössä lisäämme tietolähteisiin (Data sources) Office365Users -yhdistimen.

Screenshot 2019-01-10 at 21.19.51.png

Tämän jälkeen voimme lisätä Combo boxin tietojoukokoksi (Items) Office365:n käyttäjiin kohdistuvan haun tulosjoukon. Hakuehtona käytetään ComboBoxin hakukenttään syötettyä tekstiä.

Office365Users.SearchUser({searchTerm:ComboBox1.SearchText, top:50})

Screenshot 2019-01-10 at 21.22.49.png

Nyt kontrolli tietää mitä tietoja se voi hyödyntää. Määritellään hakukentäksi (SearchField) henkilön näyttönimi. Sama tieto esitetään Combo boxissa (Primary text).

Screenshot 2019-01-10 at 21.28.01.png

Ja toimiihan se!

Screenshot 2019-01-10 at 21.31.45.png

Optimointi – Oletushaun poistaminen

Nyt kontrolli tekee ensimmäisen haun heti kun käyttäjä siirtää siihen kohdistimen. Tämä turha haku voidaan poistaa lisäämällä Items-kenttään ehto, joka rajaa haun tehtäväksi ainoastaan mikäli hakukentässä on arvo.

If(!IsBlank(ComboBox1.SearchText),...

Screenshot 2019-01-13 at 18.21.11.png

Valitun henkilön tallennus

Käyttäjä voi nyt kätevästi poimia haluamansa käyttäjän. Olisi tietysti hyvä jos valinta myös tallentuisi. Tämä onnistuu vaihtamalla kortin päivitys (Update) arvoksi seuraava kaava.

ComboBox1.Selected.Mail

Screenshot 2019-01-10 at 21.34.41.png

Eli tallennetaan SharePoint-listalle Combo boxista valitun henkilön sähköpostiosoite.

Tallennetun rivin muokkaaminen

Kun tallennettua riviä muokataan, tulee Combo boxiin ladata oletusarvoksi aiemmin tallentamamme käyttäjä. Oletusarvo määritellään DefaultSelectedItems -ominaisuudessa. Käytännössä tehdään haku tallennetulla arvolla (Parent.Default). Hakutulosta voidaan käyttää sellaisenaan Combo boxin oletusarvona.

If(
EditForm1.Mode = FormMode.Edit,
Office365Users.SearchUser({searchTerm: Parent.Default, top: 1})
)

peoplepicker default selectr item.png

Optimointi  – Tallennetaan myös käyttäjän näyttönimi

Haluamme näyttää listanäkymässä tallennettujen henkilöiden nimet sähköpostiosoitteiden sijaan. Tämä onnistuu hakemalla kunkin rivin kohdalla käyttäjän näyttönimi.

Kuulostaa hitaalta.

Tallennetaankin käyttöliittymää varten myös henkilön näyttönimi.

Muokataan ratkaisua siten, että Title-kenttään tallennetaan käyttäjän näyttönimi ja UserEmail-kenttään käyttäjän sähköposti.

peoplepicker save both.png

Näin saadaan ilman kallista kyselyä myös galleriaan näkyviin henkilön näyttönimi.

peoplepicker gallery.png

Optimointi – Käyttäjätiedon esivalinta ilman hakua

Kun sekä näyttönimi että email ovat tallessa, voidaan Combo boxin oletusvalinta tehdä käsin, ilman hakua Azure AD käyttäjätietoihin.

If(EditForm1.Mode = FormMode.Edit,
{
   DisplayName: Title,  
   Claims: "i:0#.f|membership|" & Lower(UserEmail),
   Department: "",
   Email: UserEmail,
   JobTitle: "",
   Picture: ""
} )

peoplepicker default items with claims.png

Usean käyttäjän tallentaminen

Mikäli käyttäjä voi poimia kontrollista usean käyttäjän, monimutkaistuu ratkaisu hieman.

Luodaan Combo box myös Users-kentälle. Nyt valittujen käyttäjien sähköpostit tallennetaan yhteen kenttään pilkulla erotettuna.

Concat(ComboBox2.SelectedItems, Mail, ",")

peoplepicker save several.png

Ja näin ne kaikki ovat tallessa.

peoplepicker saved items.png

Tallennetun rivin muokkaaminen (usea käyttäjä)

Tämä onkin hieman kinkkisempää. Nyt kentässä (Users) on pilkulla erotettuna usean käyttäjän sähköpostiosoite.

Lisätään rivin muokkauspainikkeeseen hieman koodia.

peoplepicker initilaize collection.png

Koodissa

  • Ladataan taulukkomuotoiseen muuttujaan (UserArray) kaikki Users-kentän sähköpostiosoitteet.
  • Tyhjennetään kokoelma UserCollection
  • Käydään läpi kaikki UserArray-taulukossa olevat sähköpostiosoitteet. Jokaisen kohdalla tehdään haku Office365-käyttäjiin (Office365Users.SearchUser) ja lisätään hakutuloksen ensimmäinen osuma UserCollection-kokoelmaan.

peoplepicker initilaize collection2.png

Lopuksi kokoelmassa on kaikki tallennetut käyttäjät ja voimme asettaa sen Combo boxin DefaultSelectedItems arvoksi.

peoplepicker several default items

Kokoelman voisi muodustaa myös ilman Office365Users hakuja. Tällöin jokaisesta käyttäjästä tallentaa sähköpostin lisäksi myös näyttönimi.

Siivoaminen

Saatat ihmetellä miksi näyttökuvissa on näkyvillä sekä lomakkeen alkuperäiset kentät (Title, UserEmail, Users), että Combo boxit, joilla arvot oikeasti valitaan. Syy on yksinkertainen. Tekovaiheessa on hyvä pitää kaikki kentät näkyvillä.

Näin hahmottaa paremmin, mitä sovelluksessa tapahtuu. Varsinkin tilanteissa, jossa sovellus ei toimi kuten sen mielestäsi pitäisi toimia.

Siistitty versio näyttää tältä.

Screenshot 2019-01-13 at 18.49.35.png