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.
Katsotaan miten people picker toteutetaan sen avulla.
SharePoint-listan ja PowerAppsin luonti
Luodaan SharePoint-lista, jossa on kentät
- UserName
- UserEmail
- Users
Tämän jälkeen tehdään PowerApps olemassa olevan SharePoint-listan pohjalta.
Valitaan oikea sivusto ja sieltä lista.
Siirrytään luodussa sovelluksessa muokkausnäytölle (EditScreen1) ja poistetaan lomakkeelta turhat kentät (UserEmail ja Attachments).
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.
Henkilön valitseminen ComboBoxin avulla
Lisätään lomakkeen Title-korttiin Combo box, jonka asettelu vaihdetaan muotoon ”henkilö”.
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.
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})
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).
Ja toimiihan se!
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),...
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
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}) )
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.
Näin saadaan ilman kallista kyselyä myös galleriaan näkyviin henkilön näyttönimi.
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: "" } )
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, ",")
Ja näin ne kaikki ovat tallessa.
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.
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.
Lopuksi kokoelmassa on kaikki tallennetut käyttäjät ja voimme asettaa sen Combo boxin DefaultSelectedItems arvoksi.
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ä.