Compartir por


Información de referencia acerca do modelo de pantalla da reunión para aplicacións de lenzo

Para aplicacións de lenzo en Power Apps, obteña información sobre como contribúe cada control significativo do modelo da pantalla da reunión á funcionalidade predefinida xeral da pantalla. Esta información presenta as fórmulas de comportamento e os valores doutras propiedades que determinan como responden os controis á entrada do usuario. Para manter un debate a alto nivel sobre a funcionalidade predefinida desta pantalla, consulte a visión xeral da pantalla da reunión.

Este tema resalta algúns controis significativos e explica as expresións ou fórmulas nas que as diversas propiedades (como Elementos e OnSelect) destes controis se establecen:

Requisito previo

Familiarícese con como engadir e configurar pantallas e outros controis ao crear unha aplicación en Power Apps.

Separador Convidar

Control LblInviteTab.

  • Propiedade: Cor
    Valor: If( _showDetails, LblRecipientCount.Color, RectQuickActionBar.Fill )

    _showDetails é unha variable que se usa para determinar se se seleccionou o control LblInviteTab ou o control LblScheduleTab. Se o valor de _showDetails é true, selecciónase LblScheduleTab; se o valor é false, selecciónase LblInviteTab. Iso significa que se o valor de _showDetails é true (este separador non se selecciona), a cor do separador coincide coa de LblRecipientCount. En caso contrario, coincide co valor de enchemento de RectQuickActionBar.

  • Propiedade: OnSelect
    Valor: Set( _showDetails, false )

    Configura a variable _showDetails en false, o que significa que o contido do separador Convidar é visible e o contido do separador Programar ocúltase.

Separador de programación

Separador de programación.

  • Propiedade: Cor
    Valor: If( !_showDetails, LblRecipientCount.Color, RectQuickActionBar.Fill )

    _showDetails é unha variable que se usa para determinar se se seleccionou o control LblInviteTab ou o control LblScheduleTab. Se é true, selecciónase LblScheduleTab; se é false, selecciónase LblInviteTab. Isto significa que se _showDetails é true (este separador selecciónase), a cor do separador coincide co valor de enchemento de RectQuickActionBar. En caso contrario, coincide co valor de cor de LblRecipientCount.

  • Propiedade: OnSelect
    Valor: Set( _showDetails, true )

    Configura a variable _showDetails en true, o que significa que o contido do separador Programar é visible e o contido do separador Convidar ocúltase.

Cadro de busca de texto

Control TextSearchBox.

Hai varios controis máis na pantalla que teñen unha dependencia nesta:

  • Se un usuario comeza a escribir un texto, PeopleBrowseGallery pasa a estar visible.
  • Se un usuario escribe un enderezo de correo electrónico válido, AddIcon pasa a estar visible.
  • Cando un usuario selecciona unha persoa dentro de PeopleBrowseGallery, restablécese o contido de busca.

Icona Engadir

Control AddIcon.

Este control permite aos usuarios engadir persoas que non existen dentro da súa organización á lista de participantes da reunión que se está a compor.

  • Propiedade: Visible
    Valor: tres comprobacións lóxicas que todos deben avaliar en true para que o control sexa visible:

    !IsBlank( TextSearchBox.Text ) &&
        IsMatch( TextSearchBox.Text, Match.Email ) &&
        Not( Trim( TextSearchBox.Text ) in MyPeople.UserPrincipalName )
    

    Liña por liña, este bloque de código indica que o control AddIcon só é visible se:

    • TextSearchBox contén texto.
    • O texto de TextSearchBox é un enderezo de correo electrónico válido.
    • O texto de TextSearchBox xa non existe na colección MyPeople.
  • Propiedade: OnSelect
    Valor: unha instrución Collect para engadir o usuario á lista de participantes, outra para actualizar as horas de reunión dispoñibles e varias alternancias da variable:

    Collect( MyPeople,
        { 
            DisplayName: TextSearchBox.Text, 
            UserPrincipalName: TextSearchBox.Text, 
            Mail: TextSearchBox.Text
        }
    );
    Concurrent(
        Reset( TextSearchBox ),
        Set( _showMeetingTimes, false ),
        UpdateContext( { _loadMeetingTimes: true } ),
        Set( _selectedMeetingTime, Blank() ),
        Set( _selectedRoom, Blank() ),
        Set( _roomListSelected, false ),
        ClearCollect( MeetingTimes, 
            AddColumns(
                'Office365'.FindMeetingTimes(
                    { 
                        RequiredAttendees: Concat(MyPeople, UserPrincipalName & ";")
                        MeetingDuration: MeetingDurationSelect.Selected.Minutes,
                        Start: Text( DateAdd( MeetingDateSelect.SelectedDate, 8, Hours ), UTC ),
                        End: Text( DateAdd( MeetingDateSelect.SelectedDate, 17, Hours ), UTC ),
                        MaxCandidates: 15, 
                        MinimumAttendeePercentage:1, 
                        IsOrganizerOptional: false, 
                        ActivityDomain: "Work"
                    }
                ).MeetingTimeSuggestions,
                "StartTime", MeetingTimeSlot.Start.DateTime, 
                "EndTime", MeetingTimeSlot.End.DateTime
            )
        )
    );
    UpdateContext( { _loadingMeetingTimes: false } );
    Set( _showMeetingTimes, true )
    

    Ao seleccionar este control, engádese o enderezo de correo electrónico válido (visible só se se escribe un enderezo de correo electrónico válido en TextSearchBox) á colección MyPeople (esta colección é a lista de participantes) e, a seguir, actualízanse as horas de reunión dispoñibles coa nova entrada de usuario.

    A un nivel baixo, este bloque de código:

    1. Recompila o enderezo de correo electrónico na colección MyPeople, recompilando o enderezo de correo electrónico nos campos DisplayName, UserPrincipalName e Mail.
    2. Restablece o contido do control TextSearchBox.
    3. Configura a variable _showMeetingTimes en false. Esta variable controla a visibilidade de FindMeetingTimesGallery, que mostra as horas abertas para que os participantes seleccionados se reúnan.
    4. Configura a variable de contexto _loadMeetingTimes en true. Esta variable configura un estado de carga, que alterna a visibilidade dos controis do estado de carga, como _LblTimesEmptyState, para indicarlle ao usuario que se están a cargar os seus datos.
    5. Configura _selectedMeetingTime en Blank(). _selectedMeetingTime é o rexistro seleccionado do control FindMeetingTimesGallery. Está en branco porque a adición doutro participante pode significar que a definición anterior de _selectedMeetingTime non está dispoñible para ese participante.
    6. Configura _selectedRoom en Blank(). _selectedRoom é o rexistro de sala seleccionado de RoomBrowseGallery. A dispoñibilidade da sala determínase a partir do valor de _selectedMeetingTime. Con ese valor en branco, o valor _selectedRoom xa non é válido, polo que debe estar en branco.
    7. Configura _roomListSelected en false. É posible que esta liña non sexa aplicable a todos. En Office, pode agrupar as salas por diferentes "listas de salas". Se ten listas de salas, esta pantalla dá conta diso, o que lle permite seleccionar primeiro unha lista de salas para poder seleccionar unha sala desa lista. O valor de _roomListSelected é o que determina se un usuario (nun arrendatario só con listas de salas) visualizará as salas dunha lista de salas ou o conxunto de listas de salas. Configúrase en false para forzar aos usuarios a volver seleccionar unha nova lista de salas.
    8. Usa a operación Office365.FindMeetingTimes para determinar e recompilar as horas de reunión dispoñibles para os participantes. Esta operación pasa:
      • O valor de UserPrincipalName de cada usuario seleccionado no parámetro RequiredAttendees.
      • MeetingDurationSelect.Selected.Minutes no parámetro MeetingDuration.
      • MeetingDateSelect.SelectedDate + 8 horas no parámetro Start. Engádense oito horas porque, por defecto, a data e hora completas para o control do calendario é ás 12:00 a.m. da data seleccionada. Probablemente queira recuperar a dispoñibilidade dentro do horario laboral normal. Unha hora de inicio do traballo normal sería ás 8:00 a.m.
      • MeetingDateSelect.SelectedDate + 17 horas no parámetro End. Engádense 17 horas porque 12:00 a.m. + 17 = 5:00 p.m. Unha hora de finalización do traballo normal sería ás 5:00 p.m.
      • 15 no parámetro MaxCandidates. Isto significa que a operación devolve só as 15 horas principais dispoñibles para a data seleccionada. Isto ten sentido porque só hai dezaseis fragmentos de 30 minutos nunha xornada de traballo de 8 horas, e unha reunión de 30 minutos é a mínima que se pode configurar nesta pantalla.
      • 1 no parámetro MinimumAttendeePercentage. Basicamente, a menos que non estea dispoñible ningún participante, recupérase a hora de reunión.
      • false no parámetro IsOrganizerOptional. O usuario da aplicación non é un participante opcional para esta reunión.
      • "Traballo" no parámetro ActivityDomain. Isto significa que as horas que se recuperan só son as que están dentro dun período de horario laboral normal.
    9. A función ClearCollect tamén engade dúas columnas: "StartTime" e "EndTime". Isto simplifica os datos devoltos. O campo que contén as horas de inicio e finalización é MeetingTimeSlot. Este campo é un rexistro que contén os rexistros de Inicio e Finalización, que á súa vez conteñen os valores de DateTime e TimeZone da súa respectiva suxestión. En lugar de tentar recuperar este aniñamento de rexistro, se se engaden as columnas "StartTime" e "EndTime"á colección MeetingTimes, lévanse os valores de Inicio > DataHora e Finalización > DataHora á superficie da colección.
    10. Unha vez concluídas estas funcións, a variable _loadingMeetingTimes configúrase en false, eliminando o estado de carga, e _showMeetingTimes configúrase en true, mostrando FindMeetingTimesGallery.

Galería de exploración de persoas

Control PeopleBrowseGallery.

  • Propiedade: Items
    Valor:
    If( !IsBlank( Trim( TextSearchBox.Text ) ), 
        'Office365Users'.SearchUser( { searchTerm: Trim(TextSearchBox.Text), top: 15 } )
    )
    

Os elementos desta galería están cubertos con resultados da operación Office365.SearchUser A operación leva o texto en Trim(**TextSearchBox**) como termo de busca e devolve os 15 primeiros resultados en función desa busca.

TextSearchBox axústase nunha función Trim porque unha busca do usuario en espazos non é válida. A operación Office365Users.SearchUser axústase nunha función If(!IsBlank(Trim(TextSearchBox.Text)) ... ) porque recuperar os resultados de busca antes de que un usuario realice a busca é un desperdicio de desempeño.

Título da galería de exploración de persoas

Control do título de PeopleBrowseGallery.

  • Propiedade: Text
    Valor: ThisItem.DisplayName

    Amosa o nome de visualización da persoa desde o seu perfil de Office 365.

  • Propiedade: OnSelect
    Valor: unha instrución Collect para engadir o usuario á lista de participantes, outra para actualizar as horas de reunión dispoñibles e varias alternancias da variable:

    Concurrent(
        Reset( TextSearchBox ),
        Set( _selectedUser, ThisItem ),
        If( Not( ThisItem.UserPrincipalName in MyPeople.UserPrincipalName ), 
            Collect( MyPeople, ThisItem ); 
            Concurrent(
                Set( _showMeetingTimes, false ),
                UpdateContext( { _loadMeetingTimes: true } ),
                Set( _selectedMeetingTime, Blank() ),
                Set( _selectedRoom, Blank() ),
                Set( _roomListSelected, false ),
                ClearCollect( MeetingTimes, 
                    AddColumns(
                        'Office365'.FindMeetingTimes(
                            {
                                RequiredAttendees: Concat( MyPeople, UserPrincipalName & ";" ),
                                MeetingDuration: MeetingDurationSelect.Selected.Minutes,
                                Start: Text( DateAdd( MeetingDateSelect.SelectedDate, 8, Hours ), UTC ),
                                End: Text( DateAdd( MeetingDateSelect.SelectedDate, 17, Hours ), UTC ),
                                MaxCandidates: 15, 
                                MinimumAttendeePercentage: 1, 
                                IsOrganizerOptional: false, 
                                ActivityDomain: "Work"
                            }
                        ).MeetingTimeSuggestions,
                        "StartTime", MeetingTimeSlot.Start.DateTime, 
                        "EndTime", MeetingTimeSlot.End.DateTime
                    )
                )
            );
            UpdateContext( { _loadingMeetingTimes: false } );
            Set( _showMeetingTimes, true )
        )
    )
    

    A un nivel elevado, ao seleccionar este control engádese a persoa á colección MyPeople (o almacenamento da aplicación da lista de participantes) e actualízanse as horas de reunión dispoñibles en función da adición do novo usuario.

    A selección deste control é moi similar á selección do control AddIcon; a única diferenza é a instrución Set(_selectedUser, ThisItem) e a orde de execución das operacións. Así, esta discusión non será tan profunda. Para obter unha explicación máis completa, lea a sección Control AddIcon.

    Se selecciona este control, restablécese TextSearchBox. Entón, se a selección non está na colección MyPeople, o control:

    1. Configura o estado de _loadMeetingTimes en true e o estado de _showMeetingTimes en false, deixa en branco as variables _selectedMeetingTime e _selectedRoom e actualiza a colección MeetingTimes coa nova adición á colección MyPeople.
    2. Configura o estado de _loadMeetingTimes en false e _showMeetingTimes en true. Se a selección xa está na colección MyPeople, só restablece o contido de TextSearchBox.

Galería de persoas da reunión

Control MeetingPeopleGallery.

  • Propiedade: Items
    Valor: MyPeople

    A colección MyPeople é a colección das persoas inicializadas ou engadidas ao seleccionar o control Título de PeopleBrowseGallery.

  • Propiedade: Altura
    Valor: lóxica para permitir que a galería creza ata unha altura máxima de 350:

    Min( 
        76 * RoundUp( CountRows( MeetingPeopleGallery.AllItems ) / 2, 0 ),
        350
    )
    

    A altura desta galería axústase ao número de elementos da galería, ata unha altura máxima de 350. A fórmula ten 76 como altura dunha única fila de ReuniónPersonaXalería e, despois, multiplícase polo número de filas. A propiedade WrapCount está configurada en 2, polo que o número de filas verdadeiras é RoundUp(CountRows(MeetingPeopleGallery.AllItems) / 2, 0).

  • Propiedade: ShowScrollbar
    Valor: MeetingPeopleGallery.Height >= 350

    Cando se alcanza a altura máxima da galería (350), a barra de desprazamento é visible.

Título da galería de persoas da reunión

Control do título de MeetingPeopleGallery.

  • Propiedade: OnSelect

    Valor: Set(_selectedUser, ThisItem)

    Configura a variable _selectedUser para o elemento seleccionado en ReuniónPersonaXalería.

iconRemove da galería de persoas da reunión

Control de iconRemove de MeetingPeopleGallery.

  • Propiedade: OnSelect
    Valor: unha instrución Remove para eliminar o usuario da lista de participantes e outra Collect para actualizar as horas de reunión dispoñibles e varias alternancias da variable:

    Remove( MyPeople, LookUp( MyPeople, UserPrincipalName = ThisItem.UserPrincipalName ) );
    Concurrent(
        Reset( TextSearchBox ),
        Set( _showMeetingTimes, false ),
        UpdateContext( { _loadMeetingTimes: true } ),
        Set( _selectedMeetingTime, Blank() ),
        Set( _selectedRoom, Blank() ),
        Set( _roomListSelected, false ),
        ClearCollect( MeetingTimes, 
            AddColumns(
                'Office365'.FindMeetingTimes(
                    {
                        RequiredAttendees: Concat( MyPeople, UserPrincipalName & ";" ), 
                        MeetingDuration: MeetingDurationSelect.Selected.Minutes,
                        Start: Text( DateAdd( MeetingDateSelect.SelectedDate, 8, Hours ), UTC ), 
                        End: Text( DateAdd( MeetingDateSelect.SelectedDate, 17, Hours ), UTC ),
                        MaxCandidates: 15, 
                        MinimumAttendeePercentage: 1, 
                        IsOrganizerOptional: false, 
                        ActivityDomain: "Work"
                    }
                ).MeetingTimeSuggestions,
                "StartTime", MeetingTimeSlot.Start.DateTime, 
                "EndTime", MeetingTimeSlot.End.DateTime
            )
        )
    );
    UpdateContext( { _loadingMeetingTimes: false } );
    Set( _showMeetingTimes, true )
    

    A un nivel alto, ao seleccionar este control elimínase a persoa da lista de participantes e actualízanse as horas de reunión dispoñibles en función da eliminación desta persoa.

    Despois da primeira liña do código anterior, seleccionar deste control é case idéntico a seleccionar o control AddIcon. Así, esta discusión non será tan profunda. Para obter unha explicación máis completa, lea a sección do control AddIcon.

    Na primeira liña de código, o elemento seleccionado elimínase da colección MyPeople. A seguir, o código:

    1. Restablece TextSearchBox e, a continuación, elimina a selección da colección MyPeople.
    2. Configura o estado de _loadMeetingTimes en true e o estado de _showMeetingTimes en false, deixa en branco as variables _selectedMeetingTime e _selectedRoom e actualiza a colección MeetingTimes coa nova adición á colección MyPeople.
    3. Configura o estado de _loadMeetingTimes en false e _showMeetingTimes en true.

Selector de data da reunión

Control MeetingDateSelect.

  • Propiedade: DisplayMode
    Valor: If( IsEmpty(MyPeople), DisplayMode.Disabled, DisplayMode.Edit )

    Non se pode elixir unha data para unha reunión ata que polo menos un participante se engada á colección MyPeople.

  • Propiedade: OnChange
    Valor: Select( MeetingDateSelect )

    Se cambia a data seleccionada, desencadéase o código na propiedade OnSelect deste control para executarse.

  • Propiedade: OnSelect
    Valor: unha instrución Collect para actualizar as horas de reunión dispoñibles e varias alternancias da variable:

    Concurrent(
        Reset( TextSearchBox ),
        Set( _showMeetingTimes, false ),
        UpdateContext( { _loadingMeetingTimes: true } ),
        Set( _selectedMeetingTime, Blank() ),
        Set( _selectedRoom, Blank() ),
        Set( _roomListSelected, false ),
        ClearCollect( MeetingTimes, 
            AddColumns(
                'Office365'.FindMeetingTimes(
                    {
                        RequiredAttendees: Concat( MyPeople, UserPrincipalName & ";" ), 
                        MeetingDuration: MeetingDurationSelect.Selected.Minutes,
                        Start: Text( DateAdd( MeetingDateSelect.SelectedDate, 8, Hours ), UTC ), 
                        End: Text( DateAdd( MeetingDateSelect.SelectedDate, 17, Hours ), UTC ),
                        MaxCandidates: 15, 
                        MinimumAttendeePercentage: 1, 
                        IsOrganizerOptional: false, 
                        ActivityDomain: "Work"
                    }
                ).MeetingTimeSuggestions,
                "StartTime", MeetingTimeSlot.Start.DateTime, 
                "EndTime", MeetingTimeSlot.End.DateTime
            )
        )
    );
    UpdateContext( { _loadingMeetingTimes: false } );
    Set( _showMeetingTimes, true )
    

    A un nivel alto, seleccionar este control actualiza as horas de reunión dispoñibles. É valioso porque se un usuario cambia a data, as horas de reunión dispoñibles deben actualizarse para reflectir a dispoñibilidade dos participantes para ese día.

    Con excepción da instrución inicial Recompilar, isto é idéntico á funcionalidade OnSelect do control AddIcon. Así, esta discusión non será tan profunda. Para obter unha explicación máis completa, lea a sección Control AddIcon.

    Se selecciona este control, restablécese TextSearchBox. Entón:

    1. Configura o estado de _loadMeetingTimes en true e o estado de _showMeetingTimes en false, deixa en branco as variables _selectedMeetingTime e _selectedRoom e actualiza a colección MeetingTimes coa nova selección de data.
    2. Configura o estado de _loadMeetingTimes en false e _showMeetingTimes en true.

Menú despregable da duración da reunión

Control MeetingDateSelect: duración.

  • Propiedade: DisplayMode
    Valor: If( IsEmpty(MyPeople), DisplayMode.Disabled, DisplayMode.Edit )

    Non se pode elixir unha duración para unha reunión ata que polo menos un participante se engada á colección MyPeople.

  • Propiedade: OnChange
    Valor: Select(MeetingDateSelect1)

    Se cambia a duración seleccionada, desencadéase o código na propiedade OnSelect do control MeetingDateSelect para executarse.

Buscar galería de horas da reunión

Control FindMeetingTimesGallery.

  • Propiedade: Items
    Valor: MeetingTimes

    Colección de posibles horas da reunión recuperadas a partir da operación Office365.FindMeetingTimes.

  • Propiedade: Visible
    Valor: _showMeetingTimes && _showDetails && !IsEmpty( MyPeople )

    A galería só é visible se _showMeetingTimes está configurado en true, o usuario seleccionou o control LblScheduleTab e se engadiu polo menos un participante á reunión.

Título de Buscar galería de horas da reunión

Control do título de FindMeetingTimesGallery.

  • Propiedade: Text
    Valor: unha conversión da hora de inicio que se mostrará na hora local do usuario:

    Text(
        DateAdd(
            DateTimeValue( ThisItem.StartTime ),
            - TimeZoneOffset(), 
            Minutes
        ),
        DateTimeFormat.ShortTime
    )
    

    O valor recuperado de StartTime está en formato UTC. Para converter de UTC á hora local, aplícase a función DateAdd. A función Text toma unha data e hora como primeiro argumento e formátaa segundo o seu segundo argumento. O usuario pásaa á conversión horaria local de ThisItem.StartTime e móstraa como DateTimeFormat.ShortTime.

  • Propiedade: OnSelect
    Valor: varias instrucións Collect para recompilar salas de reunións e as súas suxestións de dispoñibilidades, así como varias alternancias de variables:

    Set( _selectedMeetingTime, ThisItem );
    UpdateContext( { _loadingRooms: true } );
    If( IsEmpty( RoomsLists ),
        ClearCollect( RoomsLists, 'Office365'.GetRoomLists().value) );
    If( CountRows( RoomsLists ) <= 1,
        Set( _noRoomLists, true );
        ClearCollect( AllRooms, 'Office365'.GetRooms().value );
        Set( _allRoomsConcat, Concat( FirstN( AllRooms, 20 ), Address & ";" ) );
        ClearCollect( RoomTimeSuggestions, 
            'Office365'.FindMeetingTimes(
                {
                    RequiredAttendees: _allRoomsConcat, 
                    MeetingDuration: MeetingDurationSelect.Selected.Minutes,
                    Start: _selectedMeetingTime.StartTime & "Z", 
                    End: _selectedMeetingTime.EndTime & "Z", 
                    MinimumAttendeePercentage: "1",
                    IsOrganizerOptional: "false", 
                    ActivityDomain: "Unrestricted"
                }
            ).MeetingTimeSuggestions
        );
        ClearCollect( AvailableRooms, 
            AddColumns(
                AddColumns(
                    Filter( 
                        First( RoomTimeSuggestions ).AttendeeAvailability,
                        Availability="Free"
                    ), 
                    "Address", Attendee.EmailAddress.Address
                ), 
                "Name", LookUp( AllRooms, Address = Attendee.EmailAddress.Address ).Name 
            )
        );
        ClearCollect( AvailableRoomsOptimal, 
            DropColumns(
                DropColumns( AvailableRooms, "Availability" ), 
                "Attendee" 
            )
        ),
        Set( _roomListSelected, false) 
    );
    UpdateContext( {_loadingRooms: false} )
    

    A un nivel alto, este bloque de código recompila as salas dispoñibles para usuarios que non teñen listas de salas en función da data e hora seleccionadas para a reunión. En caso contrario, simplemente recupera as listas de salas.

    A un nivel baixo, este bloque de código:

    1. Configura _selectedMeetingTime no elemento seleccionado. Utilízase para atopar que salas están dispoñibles nese tempo.
    2. Define a variable de estado de carga de _loadingRooms en true, activando o estado de carga.
    3. Se a colección RoomsLists está baleira, recupera as listas de salas do arrendatario do usuario e almacénaas na colección RoomsLists.
    4. Se o usuario non ten ningunha lista de salas ou ten unha única lista de salas:
      1. A variable noRoomLists configúrase en true e úsase para determinar os elementos que se mostran no control RoomBrowseGallery.
      2. A operación Office365.GetRooms() úsase para recuperar as primeiras 100 salas do arrendatario. Estas almacénanse na colección AllRooms.
      3. A variable _allRoomsConcat configúrase nunha cadea separada por punto e coma dos 20 primeiros enderezos de correo electrónico das salas da colección AllRooms. Isto é debido a que Office365.FindMeetingTimes limítase a buscar as horas dispoñibles de 20 obxectos persoais nunha única operación.
      4. A colección RoomTimeSuggestions usa Office365.FindMeetingTimes para recuperar a dispoñibilidade das 20 primeiras salas da colección AllRooms en función dos valores de hora da variable _selectedMeetingTime. Teña en conta que & "Z" se usa para dar formato correctamente ao valor DateTime.
      5. Créase a colección AvailableRooms. Esta é simplemente a colección Suxestións RoomTime de dispoñibilidade dos participantes con dúas columnas adicionais: "Enderezo" e "Nome". "Address" é o enderezo de correo electrónico da sala e "Name" é o nome da sala.
      6. A seguir, créase a colección AvailableRoomsOptimal. Esta é simplemente a colección AvailableRooms coas columnas "Dispoñibilidade" e "Participante" eliminadas. Ao facer isto, coincide cos esquemas de AvailableRoomsOptimal e AllRooms. Isto permítelle usar ambas coleccións na propiedade Elementos de RoomBrowseGallery.
      7. _roomListSelected está configurado en false.
    5. O estado de carga, _loadingRooms, está configurado en false unha vez que todo o demais se acabou de executar.

Galería de exploración de salas

Control RoomBrowseGallery.

  • Propiedade: Items
    Valor: configúrase loxicamente en dúas coleccións internas de esquema idéntico, segundo se o usuario seleccionou unha lista de salas ou ten listas de salas no seu arrendatario:

    Search(
        If( _roomListSelected || _noRoomLists, AvailableRoomsOptimal, RoomsLists ),
        Trim(TextMeetingLocation1.Text), 
        "Name", 
        "Address"
    )
    

    Esta galería mostra a colección AvailableRoomsOptimal se _roomListSelected ou _noRoomLists teñen o valor true. Se non, mostra a colección RoomsLists. Pódese facer porque o esquema destas coleccións é idéntico.

  • Propiedade: Visible
    Valor: _showDetails && !IsBlank( _selectedMeetingTime ) && !_loadingRooms

    A galería só é visible se as tres afirmacións anteriores se avalían en true.

Título de RoomBrowseGallery

Control do título de RoomBrowseGallery.

  • Propiedade: OnSelect
    Valor: conxunto das instrucións Collect e Set ligadas loxicamente, que pode desencadearse ou non en función de se o usuario está a ver salas ou listas de salas:

    UpdateContext( { _loadingRooms: true } );
    If( !_roomListSelected && !noRoomLists,
        Set( _roomListSelected, true );
        Set( _selectedRoomList, ThisItem.Name );
        ClearCollect( AllRooms, 'Office365'.GetRoomsInRoomList( ThisItem.Address ).value );
        Set( _allRoomsConcat, Concat( FirstN( AllRooms, 20 ), Address & ";" ) );
        ClearCollect( RoomTimeSuggestions, 
            'Office365'.FindMeetingTimes(
                {
                    RequiredAttendees: _allRoomsConcat, 
                    MeetingDuration: MeetingDurationSelect.Selected.Minutes,
                        Start: _selectedMeetingTime.StartTime & "Z", 
                    End: _selectedMeetingTime.EndTime & "Z", 
                    MinimumAttendeePercentage: "1",
                    IsOrganizerOptional: "false", 
                    ActivityDomain: "Unrestricted"
                }
            ).MeetingTimeSuggestions
        );
        ClearCollect( AvailableRooms, 
            AddColumns(
                AddColumns(
                    Filter(
                        First( RoomTimeSuggestions ).AttendeeAvailability, 
                        Availability = "Free"
                    ),
                    "Address", Attendee.EmailAddress.Address 
                ), 
                "Name", LookUp( AllRooms, Address = Attendee.EmailAddress.Address ).Name
            )
        );
        ClearCollect( AvailableRoomsOptimal, 
            DropColumns(
                DropColumns( AvailableRooms, "Availability" )
            ), 
            "Attendee" )
        ),
        Set( _selectedRoom, ThisItem )
    );
    UpdateContext( {_loadingRooms: false} )
    

    As accións que se producen cando se selecciona este control dependen de se un usuario está a ver actualmente un conxunto de listas de salas ou un conxunto de salas. Se é o primeiro, ao seleccionar este control recupéranse as salas que están dispoñibles no momento seleccionado da lista de salas seleccionada. Se é o último, ao seleccionar este control configúrase a variable _selectedRoom no elemento seleccionado. A instrución anterior é moi similar á instrución Select para Tíutlo de FindMeetingTimesGallery.

    A un nivel baixo, o bloque de código anterior:

    1. Activa o estado de carga das salas _loadingRooms en true.
    2. Verifica se se seleccionou unha lista de salas e se o arrendatario ten listas de salas. Se é así:
      1. Configura _roomListSelected en true e _selectedRoomList no elemento seleccionado.
      2. A variable _allRoomsConcat configúrase nunha cadea separada por punto e coma dos 20 primeiros enderezos de correo electrónico das salas da colección AllRooms. Isto é debido a que a operación Office365.FindMeetingTimes limítase a buscar as horas dispoñibles de 20 obxectos persoais nunha única operación.
      3. A colección RoomTimeSuggestions usa a operación Office365.FindMeetingTimes para recuperar a dispoñibilidade das 20 primeiras salas da colección AllRooms en función dos valores de hora da variable _selectedMeetingTime. Teña en conta que & "Z" se usa para dar formato correctamente ao valor DateTime.
      4. Créase a colección AvailableRooms. Esta é simplemente a colección Suxestións RoomTime de dispoñibilidade dos participantes con dúas columnas adicionais: "Enderezo" e "Nome". "Address" é o enderezo de correo electrónico da sala e "Name" é o nome da sala.
      5. A seguir, créase a colección AvailableRoomsOptimal. Esta é simplemente a colección AvailableRooms coas columnas "Dispoñibilidade" e "Participante" eliminadas. Ao facer isto, coincide cos esquemas de AvailableRoomsOptimal e AllRooms. Isto permítelle usar ambas coleccións na propiedade Elementos de RoomBrowseGallery.
      6. _roomListSelected está configurado en false.
    3. O estado de carga, _loadingRooms, está configurado en false unha vez que todo o demais se acabou de executar.

Comiñas angulares posteriores

Control RoomsBackNav.

  • Propiedade: Visible
    Valor: _roomListSelected && _showDetails

    Este control só é visible se se seleccionou tanto unha lista de salas como o separador Programar.

  • Propiedade: OnSelect
    Valor: Set( _roomListSelected, false )

    Cando _roomListSelected está configurado en false, cambia o control RoomBrowseGallery para mostrar elementos da colección RoomsLists.

Icona Enviar

Control IconSendItem.

  • Propiedade: DisplayMode
    Valor: lóxica para obrigar ao usuario a introducir certos detalles da reunión antes de que a icona poida ser editable.

    If( Len( Trim( TextMeetingSubject1.Text ) ) > 0
        && !IsEmpty( MyPeople ) && !IsBlank( _selectedMeetingTime ),
        DisplayMode.Edit, DisplayMode.Disabled
    )
    

    A icona só é seleccionable se se enche o asunto da reunión, se hai polo menos un asistente á reunión e se seleccionou unha hora de reunión. Se non, está desactivada.

  • Propiedade: OnSelect

    Valor: código para enviar o convite á reunión aos asistentes seleccionados e limpar todos os campos de entrada:

    Set( _myCalendarName, LookUp( 'Office365'.CalendarGetTables().value, DisplayName = "Calendar" ).Name );
    Set( _myScheduledMeeting, 
        'Office365'.V2CalendarPostItem( _myCalendarName,
            TextMeetingSubject1.Text, 
            Text(DateAdd(DateTimeValue( _selectedMeetingTime.StartTime), -TimeZoneOffset(), Minutes) ),
            Text(DateAdd(DateTimeValue( _selectedMeetingTime.EndTime), -TimeZoneOffset(), Minutes) ),
            {
                RequiredAttendees: Concat( MyPeople, UserPrincipalName & ";" ) & _selectedRoom.Address, 
                Body: TextMeetingMessage1.Text, 
                Location: _selectedRoom.Name, 
                Importance: "Normal", 
                ShowAs: "Busy", 
                ResponseRequested: true
            }
        )
    );
    Concurrent(
        Reset( TextMeetingLocation1 ),
        Reset( TextMeetingSubject1 ),
        Reset( TextMeetingMessage1 ),
        Clear( MyPeople ),
        Set( _selectedMeetingTime, Blank() ),
        Set( _selectedRoomList, Blank() ),
        Set( _selectedRoom, Blank() ),
        Set( _roomListSelected, false )
    )
    

    A un nivel baixo, este bloque de código:

    1. Configura _myCalendarName no calendario na operación Office365.CalendarGetTables() cun DisplayName de "Calendario".
    2. Programa a reunión con todos os valores de entrada das distintas seleccións que o usuario realizou ao longo da pantalla mediante a operación Office365.V2CalendarPostItem.
    3. Restablece todos os campos de entrada e variables empregados na creación da reunión.

Nota

Dependendo da súa rexión, é posible que o calendario que queira non teña un nome para mostrar de "Calendario". Vaia a Outlook para ver cal é o título do calendario e realice o cambio adecuado na aplicación.

Pasos seguintes

Nota

Pode indicarnos as súas preferencias para o idioma da documentación? Realice unha enquisa breve. (teña en conta que esa enquisa está en inglés)

Esta enquisa durará sete minutos aproximadamente. Non se recompilarán datos persoais (declaración de privacidade).