Slanje obavijesti timu kada se status radnje stavke ažurira u oglednoj aplikaciji Kontrolne točke

Primjer aplikacije Kontrolne točke za Microsoft Teams korisnicima omogućuje praćenje napretka dovršetka radnih stavki u projektima kroz kontrolne točke. Iako aplikacija omogućuje ažuriranje i održavanje radnih stavki, trenutno nema standardnih obavijesti o ažuriranjima radnih stavki za tim.

U ovom ćemo članku saznati kako stvoriti Power Automate tok za slanje obavijesti o prilagodljivoj kartici timu (u kojem je aplikacija instalirana) kada se promijeni status radne stavke.

Preduvjeti

Da bismo dovršili ovu vježbu, potrebna nam je mogućnost prijave u Teams koja će biti dostupna kao dio odabranih pretplata na Microsoft 365, a također ćemo morati imati instaliran predložak servisa Power Apps za Kontrolne točke za Teams. Ova se aplikacija može instalirati s usluge https://aka.ms/TeamsInspection.

Prijava u aplikaciju Kontrolne točke

  1. Odaberite ikonu Power Apps s lijeve strane i idite na karticu Izrada.

  2. S lijevog izbornika aplikacije odaberite tim u kojem je instalirana aplikacija Kontrolne točke.

  3. Odaberite Instalirane aplikacije pa odaberite Kontrolne točke za otvaranje aplikacije. Otvorit će se aplikacija Kontrolne točke.

Dodavanje uvjeta za pozivanje Power Automate toka

  1. Na prikazu stabla u lijevom oknu odaberite zaslon Projekti.

  2. Na zaslonu pritisnite tipku Alt i odaberite za otvaranje bilo kojeg projekta. Otvorit će se zaslon Dodavanje/uređivanje radne stavke.

  3. Odaberite gumb Gotovo.

  4. Odaberite svojstvo OnSelect gumba Gotovo.

  5. Prilikom odabira gumba Gotovo, zajedno s ostalim ažuriranjima koja se izvode u pozadini, također želimo pokrenuti tok koji bi timu poslao ažuriranje prilagodljive kartice ako se ažurira status radne stavke. Da biste to učinili, dodajte sljedeće na vrh formule OnSelect:

    If(
    
        locEditWorkItem,
    
        //adding code to call a flow when status changes
    
            If(
    
                locSelectedWorkItem.'Work Item Status'.'Project Work Item Status' \<\>
                cmbAddWorkItemStatus.Selected.'Project Work Item Status',
    
        true //your flow call will come here
    
    ); 
    
  6. Kopirajte cijeli kod iz svojstva OnSelect gumba Gotovo i zalijepite ga u uređivač teksta za kasniju upotrebu.

  7. Odaberite ... (elipsa) pored mogućnosti Postavke na gornjoj vrpci pa odaberite Power Automate.

  8. Otvorit će se skočni prozor Podaci s mogućnošću za Stvaranje novog toka.

  9. Odaberite gumb Stvaranje novog toka. Otvorit će se prozor preglednika sa zaslonom novog Power Automate toka.

  10. Ažurirajte naziv toka na - "Pošalji obavijest o prilagodljivoj kartici kad se promijeni status radnog naloga".

  11. Odaberite mogućnost za pokretanje servisa Power Apps s popisa okidača. Stvara se novi tok i korak servisa Power Apps se učitava na zaslon.

Stvaranje Power Automate toka

  1. Nakon što ste slijedili korake u prethodnom odjeljku, odaberite gumb +Novo za korak.

  2. Odaberite radnju Dohvati redak prema ID-u pa odaberite Naziv tablice kao Radne stavke projekta.

  3. U odjeljku ID retka otvorite dinamički sadržaj i odaberite mogućnost Upitaj u servisu Power Apps.

  4. Preimenujte korak u "Dohvati zapis o radnoj stavci".

  5. Ponovno odaberite gumb +Dalje za korak i odaberite radnju Dohvati redak prema ID-u pa odaberite Naziv tablice kao Statusi radne stavke.

  6. U odjeljku ID retka otvorite dinamički sadržaj i odaberite Status radne stavke (vrijednost).

  7. Preimenujte korak u Dohvati zapis o statusu radne stavke.

  8. Dodajte još jedan korak odabirom koraka +Novo.

  9. Dodajte radnju Inicijaliziraj varijablu.

    • Preimenujte korak u Inicijaliziraj varijablu - naslov kartice

    • Naziv - "varCardTitle"

    • Vrsta - "Niz"

    • Vrijednost = Ažuriranje statusa za radnu stavku {a zatim odaberite Naziv radne stavke dinamičkog sadržaja dodan u koraku 3}

  10. Dodajte još jedan korak odabirom koraka +Novo.

  11. Dodajte radnju Inicijaliziraj varijablu.

    • Preimenujte korak u Inicijaliziraj varijablu - veza pregleda
    • Naziv - "varReviewWorkItemLink"
    • Vrsta - "Niz"
    • Vrijednost - ostavite prazno - dodat će se kasnije.

    Napomena

    Nakon dodavanja novog koraka možete vidjeti upozorenje u alatu za provjeru toka. Ovo je upozorenje očekivano jer se tok poziva iz aplikacije Power Apps i dodavanje novog koraka toku koji se poziva iz aplikacije Power Apps može prekinuti vezu s aplikacijom. Kasnije u vježbi zamijenit ćemo vezu s tokom kako bismo ispravili ovo upozorenje.

  12. Za radnju Pregled veze radne stavke koristit ćemo vezu do aplikacije. Da biste pronašli ovu vezu, otvorite tim u kojem je instalirana aplikacija Kontrolne točke i kopirajte vezu za karticu na kojoj je aplikacija instalirana. Možete kopirati vezu na karticu otvaranjem kartice, a zatim odabirom ... (elipse) u gornjem desnom kutu.

    Vaš URL će izgledati slično sljedećem primjeru:

    https://teams.microsoft.com/l/entity/GUID/_djb2_msteams_prefix_956529380?context=%7B%22subEntityId%22%3Anull%2C%22channelId%22%3A%2219%3AGUID%40thread.tacv2%22%7D&groupId=GUID&tenantId=GUID

  13. Za nastavak kopirajte dio URL-a koji slijedi nakon context=, te upotrijebite URL dekoder kao što je https://www.urldecoder.org/ za dekodiranje URL-a.

  14. Kopirajte taj dekodirani tekst i vratite se na Power Automate tok.

  15. Vratite se na Inicijaliziraj varijablu- Pregled veze radne stavke ste.

  16. Postavite polje Vrijednost na prethodno kopirani dekodirani tekst URL-a.

  17. Dodajte novi korak radnjom Sastavi i u polje Unosi zalijepite sljedeći isječak.

    replace(replace(replace(variables('varReviewWorkItemLink'),'{','%7B'),'"','%22'),'}','%7D')
    
  18. Dodajte još jedan korak odabirom koraka +Novi korak.

  19. Odaberite radnju Objavi prilagodljivu karticu u čavrljanju ili na kanalu (Pretpregled).

    • Objavi kao - korisnik

    • Objavi na - kanalu

    • Tim - {tim u kojem je vaša aplikacija instalirana}

    • Kanal - Općenito

    • Prilagodljiva kartica - zalijepite sljedeći JSON kôd:

      Napomena

      Sljedeći JSON kod sadrži dinamičke reference na vrijednosti iz prethodnih koraka toka. Oni bi se trebali automatski riješiti u ispravnu referencu, ali ako se to ne dogodi, ručno ih ažurirajte ispravnom referencom. Na primjer, @{outputs('Get_Work_Item_Status_record')?['body/msft_name']} upućuje na stupac naziva iz koraka Dohvati status radne stavke.

      {
                  "type": "AdaptiveCard",
                  "body": [
                  {
      
                         "type": "TextBlock",
      
             "size": "large",
      
             "weight": "Bolder",
      
             "text": "Status Update for
             @{outputs('Get_Work_Item_record')?['body/msft_name']}",
      
             "wrap": true
      
             },
      
             {
      
             "type": "TextBlock",
      
             "text": "Status for Work Item
             '@{outputs('Get_Work_Item_record')?['body/msft_name']}' has been updated to
             @{outputs('Get_Work_Item_Status_record')?['body/msft_name']}",
      
             "wrap": true
      
             }
      
             ],
      
             "actions": [
      
             {
      
             "type": "Action.OpenUrl",
      
             "title": "View @{variables('varCardTitle')}",
             //Update the part of the following URL before "context=" with the URL copied in step 12. 
             "url":
             "[https://teams.microsoft.com/l/entity/040880f4-0c68-4c38-8821-d5efd2b6ddbe/_djb2_msteams_prefix_956529380?context=@{outputs('Compose](https://teams.microsoft.com/l/entity/040880f4-0c68-4c38-8821-d5efd2b6ddbe/_djb2_msteams_prefix_956529380?context=@%7boutputs('Compose)')}"
      
             }
      
             ],
      
             "$schema": "<http://adaptivecards.io/schemas/adaptive-card.json>",
      
             "version": "1.2"
      
             }
      
  20. Spremite tijek.

Pokretanje toka iz servisa Power Apps

  1. Nakon što se tok spremi, vratite se u Teams i otvorite aplikaciju u servisu Power Apps.

  2. U prikazu stabla odaberite zaslon Dodavanje/uređivanje radne stavke.

  3. Odaberite gumb Ažuriraj.

  4. Ažurirajte svojstvo OnSelect kako bi se osiguralo pokretanje toka.

  5. Kopirajte formulu s mjesta gdje ste je ranije zalijepili u svojstvo OnSelect.

  6. U prvom uvjetu Ako dodanom na vrhu zamijenite "true" funkcijom pokretanja koja se koristi za aktiviranje okidača toka. Pogledajte primjer u nastavku.

    If(
    
    locEditWorkItem,
    
    //adding code to call a flow when status changes
    
    If(
    
    locSelectedWorkItem.'Work Item Status'.'Project Work Item Status' \<\>
    cmbAddWorkItemStatus.Selected.'Project Work Item Status',
    SendAdaptivecardnotificationwhenthestatusoftheworkorderchanges.Run(locSelectedWorkItem.'Project Work item') //your flow call will come here
    
    );
    
    //end code
    

Ažuriranje zaslona za učitavanje

  1. Na prikazu stabla odaberite Zaslon za učitavanje.

  2. Proširite zaslon za učitavanje, a zatim conLoading_HiddenHelper ispod njega.

  3. Odaberite mjerač vremena tmrLoadingDelay i odaberite svojstvo OnTimerEnd.

  4. Ako se aplikacija otvara putem veze prilagodljive kartice, trebala bi izravno otvoriti ažurirani zapis radne stavke, što znači da bi nam trebao način da provjerimo prenosi li se ID radne stavke u aplikaciju.

  5. Formulu stranice za učitavanje potrebno je ažurirati tako da uključuje broj radne stavke, pa moramo ažurirati svojstvo OnTimerEnd na sljedeće:

    If(
        gblAppLoaded,// && !IsBlankOrError(gblAppStyles),
        If(
            !IsBlank(Param("subEntityId")), //check if the parameter is blank or not
            If( //if the parameter is not blank, check if the user is on a mobile device or desktop/web and then populate the relevant variables and collections to make deep linking work
                (!IsBlank(Param("hostClientType")) && (Param("hostClientType") = "android" Or Param("hostClientType") = "ios")) || (IsBlank(Param("hostClientType")) && (Acceleration.X > 0 || Acceleration.Y > 0 || Acceleration.Z > 0)) Or tglAdmin_Mobile.Value, 
                //project cover colors
                ClearCollect(
                    colMobileProjectCoverColors,
                    {
                        Color: "#F4B9B9",
                        Theme: "default",
                        Base: "Color1"
                    },
                    {
                        Color: "#94BFFF",
                        Theme: "default",
                        Base: "Color2"
                    },
                    {
                        Color: "#E6F0FF",
                        Theme: "default",
                        Base: "Color3"
                    },
                    {
                        Color: "#5AC6CC",
                        Theme: "default",
                        Base: "Color4"
                    },
                    {
                        Color: "#C5E9EA",
                        Theme: "default",
                        Base: "Color5"
                    },
                    {
                        Color: "#F0F9FA",
                        Theme: "default",
                        Base: "Color6"
                    },
                    {
                        Color: "#EE6F99",
                        Theme: "default",
                        Base: "Color7"
                    },
                    {
                        Color: "#F495BF",
                        Theme: "default",
                        Base: "Color8"
                    },
                    {
                        Color: "#F4D2DC",
                        Theme: "default",
                        Base: "Color9"
                    },
                    {
                        Color: "#CEF0CD",
                        Theme: "default",
                        Base: "Color10"
                    },
                    {
                        Color: "#BDBDE6",
                        Theme: "default",
                        Base: "Color11"
                    },
                    {
                        Color: "#E2E2F6",
                        Theme: "default",
                        Base: "Color12"
                    },
                    {
                        Color: "#F4F4FC",
                        Theme: "default",
                        Base: "Color13"
                    },
                    {
                        Color: "#FBF6D9",
                        Theme: "default",
                        Base: "Color14"
                    },
                    {
                        Color: "#791818",
                        Theme: "dark",
                        Base: "Color1"
                    },
                    {
                        Color: "#053385",
                        Theme: "dark",
                        Base: "Color2"
                    },
                    {
                        Color: "#6264A7",
                        Theme: "dark",
                        Base: "Color3"
                    },
                    {
                        Color: "#002F31",
                        Theme: "dark",
                        Base: "Color4"
                    },
                    {
                        Color: "#025C5F",
                        Theme: "dark",
                        Base: "Color5"
                    },
                    {
                        Color: "#03787C",
                        Theme: "dark",
                        Base: "Color6"
                    },
                    {
                        Color: "#461525",
                        Theme: "dark",
                        Base: "Color7"
                    },
                    {
                        Color: "#CC3D6D",
                        Theme: "dark",
                        Base: "Color8"
                    },
                    {
                        Color: "#EA5788",
                        Theme: "dark",
                        Base: "Color9"
                    },
                    {
                        Color: "#043615",
                        Theme: "dark",
                        Base: "Color10"
                    },
                    {
                        Color: "#33344A",
                        Theme: "dark",
                        Base: "Color11"
                    },
                    {
                        Color: "#6264A7",
                        Theme: "dark",
                        Base: "Color12"
                    },
                    {
                        Color: "#464775",
                        Theme: "dark",
                        Base: "Color13"
                    },
                    {
                        Color: "#FFAA44",
                        Theme: "dark",
                        Base: "Color14"
                    }
                );
    
    //local table of character widths, used for auto width labels
    ClearCollect(
                    colMobileCharsWidth,
                    staticCharWidths
                );
    
    //stock project cover images
    ClearCollect(
                    colMobileStockImages,
                    {appStockImage: Blank()},
                    {appStockImage: ProjectCover_Future},
                    {appStockImage: ProjectCover_Work},
                    {appStockImage: ProjectCover_Shapes},
                    {appStockImage: ProjectCover_Design},
                    {appStockImage: ProjectCover_Flow},
                    {appStockImage: ProjectCover_Abstract},
                    {appStockImage: ProjectCover_Mountain},
                    {appStockImage: ProjectCover_Vision},
                    {appStockImage: ProjectCover_DarkShapes},
                    {appStockImage: ProjectCover_Morning},
                    {appStockImage: ProjectCover_Sublime},
                    {appStockImage: ProjectCover_Tech},
                    {appStockImage: ProjectCover_Neon},
                    {appStockImage: ProjectCover_City}
                );
                Set(
                    gblMobileProject,
                    LookUp(
                        'Project Work Items',
                        'Project Work item' = GUID(Param("subEntityId"))
                    ).Project
                );
                ClearCollect(
                    colMobileWorkItems,
                    Filter(
                        'Project Work Items',
                        Project.Project = gblMobileProject.Project
                    )
                );
                UpdateContext(
                    {
                        locMobileCompletionStatus: First(
                            Sort(
                                'Project Work Item Statuses',
                                Sequence,
                                Ascending
                            )
                        )
                    }
                );
                Clear(colMobileWorkItemStatuses);
                ForAll(
                    Sort(
                        Filter(
                            'Project Work Item Statuses',
                            'Project Work Item Status' <> locMobileCompletionStatus.'Project Work Item Status'
                        ),
                        Sequence,
                        Ascending
                    ),
                    Collect(
                        colMobileWorkItemStatuses,
                        {
                            Name: ThisRecord.Name,
                            Color: ThisRecord.Color,
                            'Color Dark': ThisRecord.'Color Dark',
                            'Project Work Item Status': ThisRecord.'Project Work Item Status',
                            Sequence: ThisRecord.Sequence
                        }
                    )
                );
                Collect(
                    colMobileWorkItemStatuses,
                    {
                        Name: locMobileCompletionStatus.Name,
                        Color: locMobileCompletionStatus.Color,
                        'Color Dark': locMobileCompletionStatus.'Color Dark',
                        'Project Work Item Status': locMobileCompletionStatus.'Project Work Item Status',
                        Sequence: locMobileCompletionStatus.Sequence
                    }
                );
                Navigate(
                    'Mobile Work Item Details Screen',
                    ScreenTransition.None,
                    {
                        locMobileSelectedWorkItem: LookUp(
                            'Project Work Items',
                            'Project Work item' = GUID(Param("subEntityId"))
                        ),
                        locMobileShowWorkItemDetail: true,
                        locMobileShowSearchWorkItem: false,
                        locMobileNavToDetailFromAbout: true
                    }
                ),
                Set(
                    gblProject,
                    LookUp(
                        'Project Work Items',
                        'Project Work item' = GUID(Param("subEntityId"))
                    ).Project
                );
                UpdateContext(
                    {
                        locCompletionStatus: First(
                            Sort(
                                'Project Work Item Statuses',
                                Sequence,
                                Ascending
                            )
                        )
                    }
                );
                Clear(colWorkItemStatuses);
                ForAll(
                    Sort(
                        Filter(
                            'Project Work Item Statuses',
                            'Project Work Item Status' <> locCompletionStatus.'Project Work Item Status'
                        ),
                        Sequence,
                        Ascending
                    ),
                    Collect(
                        colWorkItemStatuses,
                        {
                            Name: ThisRecord.Name,
                            Color: ThisRecord.Color,
                            'Color Dark': ThisRecord.'Color Dark',
                            'Project Work Item Status': ThisRecord.'Project Work Item Status',
                            Sequence: ThisRecord.Sequence
                        }
                    )
                );
                Collect(
                    colWorkItemStatuses,
                    {
                        Name: locCompletionStatus.Name,
                        Color: locCompletionStatus.Color,
                        'Color Dark': locCompletionStatus.'Color Dark',
                        'Project Work Item Status': locCompletionStatus.'Project Work Item Status',
                        Sequence: locCompletionStatus.Sequence
                    }
                );
                Navigate(
                    'Add/Edit Work Item',
                    ScreenTransition.None,
                    {
                        locEditWorkItem: true,
                        locSelectedWorkItem: LookUp(
                            'Project Work Items',
                            'Project Work item' = GUID(Param("subEntityId"))
                        ),
                        locAddProject: false,
                        locExpandProjectList: true,
                        locProjectSortOrder: true,
                        locSortWorkItemBy: "eta",
                        locShowSearchWorkItem: false,
                        locAddWorkItem: false,
                        locProjectStatusSelection: "Milestone status",
                        locWorkItemSortOrder: true
                    }
                )
            ),
            If( //if the parameter is blank, check if the user is on a mobile device or desktop/web and redirect the user accordingly 
                (!IsBlank(Param("hostClientType")) && (Param("hostClientType") = "android" Or Param("hostClientType") = "ios")) || (IsBlank(Param("hostClientType")) && Acceleration.X > 0) Or tglAdmin_Mobile.Value,
                Navigate(
                    'Mobile Projects Screen',
                    ScreenTransition.None
                ),
                Navigate(
                    'Projects Screen',
                    ScreenTransition.None,
                    {
                        locShowFirstRun: gblFirstRun,
                        locShowPowerAppsPrompt: gblRecordUserSettings.'Display Splash (Power Apps)' = 'Display Splash (Power Apps) (Project User Settings)'.Yes
                    } 
                )
            )
        )
    )
    
    

Objava aplikacije Kontrolne točke

Sve promjene u aplikaciji Kontrolne točke su dovršene. Aplikaciju sada možete objaviti odabirom gumba Objavi u aplikaciji Teams u gornjem desnom kutu.

Testiranje Power Automate toka

  1. Idite u Teams i otvorite aplikaciju Kontrolne točke.

  2. Otvorite postojeću radnu stavku i ažurirajte status na drugu vrijednost.

  3. Obavijest o prilagodljivoj kartici prima se na kanalu Teams na kojem je aplikacija instalirana.

Pogledajte također