Informações de referência sobre o modelo de tela de reunião para aplicativos de tela

Para aplicativos de tela no Power Apps, entenda como cada controle significativo no modelo de tela de reunião contribui para a funcionalidade padrão geral da tela. Este mergulho profundo apresenta as fórmulas de comportamento e os valores de outras propriedades que determinam como os controles respondem à entrada do usuário. Para uma discussão de alto nível sobre a funcionalidade padrão dessa tela, consulte a visão geral da tela de reunião.

Este tópico destaca alguns controles significativos e explica as expressões ou fórmulas para as quais várias propriedades (como Items e OnSelect) desses controles são definidas:

Pré-requisito

Familiaridade com como adicionar e configurar telas e outros controles, conforme você cria um aplicativo no Power Apps.

Guia Convite

Controle LblInviteTab.

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

    showDetails é uma variável usada para determinar se o controle LblInviteTab ou o controle LblScheduleTab está selecionado. Se o valor de showDetails for verdadeiro, LblScheduleTab será selecionada; se for falso, LblInviteTab será selecionada. Isso significa que se o valor de _showDetails for verdadeiro (essa guia não está selecionada), a cor da guia corresponderá à de LblRecipientCount. Caso contrário, ele corresponderá ao valor de preenchimento de RectQuickActionBar.

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

    Define a variável _showDetails como falso, o que significa que o conteúdo da guia Convite está visível e o conteúdo da guia Agenda está oculto.

Guia Agendamento

Guia Agendar.

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

    showDetails é uma variável usada para determinar se o controle LblInviteTab ou o controle LblScheduleTab está selecionado. Se for verdadeiro, LblScheduleTab está selecionada; se for falso, LblInviteTab está. Isso significa que se o valor de _showDetails for verdadeiro (essa guia está selecionada), a cor da guia corresponderá ao valor de preenchimento de RectQuickActionBar. Caso contrário, ele corresponderá ao valor da cor de LblRecipientCount.

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

    Define a variável _showDetails como verdadeiro, o que significa que o conteúdo da guia Agenda está visível e o conteúdo da guia Convite está oculto.

Controle TextSearchBox.

Vários outros controles na tela dependem deste:

  • Se um usuário começar a digitar qualquer texto, PeopleBrowseGallery se tornará visível.
  • Se um usuário digitar um endereço de email válido, AddIcon se tornará visível.
  • Quando um usuário selecionar uma pessoa em PeopleBrowseGallery, o conteúdo da pesquisa será redefinido.

Ícone Adicionar

Controle AddIcon.

Esse controle permite que os usuários do aplicativo adicionem à lista de participantes pessoas que não existem na organização para a reunião que está sendo planejada.

  • Propriedade: Visible
    Valor: três verificações lógicas que devem ter resultado verdadeiro para que o controle seja visível:

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

    Linha por linha, esse bloco de código diz que o controle AddIcon só será visível se:

    • TextSearchBox contiver texto.
    • O texto em TextSearchBox é um endereço de email válido.
    • O texto em TextSearchBox ainda não existe na coleção MyPeople.
  • Propriedade: OnSelect
    Valor: uma instrução Collect para adicionar o usuário à lista de participantes, outra para atualizar os horários de reunião disponíveis e várias alternâncias de variáveis:

    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 )
    

    Selecione esse controle para adicionar o endereço de email válido (visível apenas se um endereço de email válido for digitado em TextSearchBox) à coleção MyPeople (essa coleção é a lista de participantes) e atualizar os horários de reunião disponíveis com a nova entrada de usuário.

    Em um nível baixo, esse bloco de código:

    1. Coleta o endereço de email na coleção MyPeople e o endereço de email nos campos DisplayName, UserPrincipalName e Mail.
    2. Redefine o conteúdo do controle TextSearchBox.
    3. Define a variável _showMeetingTimes como falso. Essa variável controla a visibilidade de FindMeetingTimesGallery, que exibe os horários de abertura para os participantes selecionados.
    4. Define a variável de contexto _loadMeetingTimes como verdadeiro. Essa variável define um estado de carregamento, que alterna a visibilidade de controles de estado de carregamento, como _LblTimesEmptyState, para indicar ao usuário que seus dados estão sendo carregados.
    5. Define _selectedMeetingTime como Blank(). _selectedMeetingTime é o registro selecionado do controle FindMeetingTimesGallery. Aqui está em branco porque a adição de outro participante pode significar que a definição anterior de _selectedMeetingTime não está disponível para esse participante.
    6. Define _selectedRoom como Blank(). _selectedRoom é o registro de sala selecionado em RoomBrowseGallery. As disponibilidades das salas são determinadas a partir do valor de _selectedMeetingTime. Com esse valor em branco, o valor de _selectedRoom não é mais válido, portanto, deve estar em branco.
    7. Define _roomListSelected como falso. Essa linha pode não ser aplicável a todos. No Office, você pode agrupar suas salas por diferentes "listas de salas". Se você tiver listas de salas, essa é a tela responsável por isso, permitindo que você selecione primeiro uma lista de salas antes de selecionar uma sala da lista. O valor de _roomListSelected é o que determina se um usuário (em um locatário apenas com listas de salas) visualiza salas em uma lista de salas ou o conjunto de listas de salas. Está definido como falso para forçar os usuários a selecionar novamente uma nova lista de salas.
    8. Usa a operação Office365.FindMeetingTimes para determinar e coletar os horários de reunião disponíveis para os participantes. Essa operação passa:
      • O UserPrincipalName de cada usuário selecionado no parâmetro RequiredAttendees.
      • MeetingDurationSelect.Selected.Minutes no parâmetro MeetingDuration.
      • MeetingDateSelect.SelectedDate + 8 horas no parâmetro Start. Oito horas são adicionadas porque, por padrão, a data/hora completa para o controle de calendário é 00:00 da data selecionada. Você provavelmente deseja recuperar as disponibilidades dentro do horário normal de trabalho. Um horário normal de início do trabalho seria 8:00.
      • MeetingDateSelect.SelectedDate + 17 horas no parâmetro End. 17 horas são adicionadas porque 12:00 + 17 = 17:00. Um horário normal de término do trabalho seria 5:00.
      • 15 no parâmetro MaxCandidates. Isso significa que a operação retorna apenas os 15 principais horários disponíveis para a data selecionada. Isso faz sentido, porque existem apenas dezesseis blocos de 30 minutos em um dia de trabalho de 8 horas, e uma reunião de 30 minutos é o mínimo que se pode definir nessa tela.
      • 1 no parâmetro MinimumAttendeePercentage. Essencialmente, a menos que nenhum participante esteja disponível, o horário da reunião é recuperado.
      • falso no parâmetro IsOrganizerOptional. O usuário do aplicativo não é um participante opcional para a reunião.
      • "Trabalho" no parâmetro ActivityDomain. Isso significa que os tempos recuperados são apenas aqueles dentro de um período normal de trabalho.
    9. A função ClearCollect também adiciona duas colunas: "StartTime" e "EndTime". Isso simplifica os dados retornados. O campo que contém os horários de início e término disponíveis é MeetingTimeSlot. Esse campo é um registro que contém os registros de início e término, os quais contêm os valores DateTime e TimeZone de suas respectivas sugestões. Em vez de tentar recuperar esse aninhamento de registros, adicionar as colunas "StartTime" e "EndTime" à coleção MeetingTimes traz os valores Início > DateTime e Término > DateTime para a coleção.
    10. Quando todas essas funções estiverem completas, a variável _loadingMeetingTimes será definida como falso, removendo o estado de carregamento, e _showMeetingTimes será definida como verdadeiro, exibindo FindMeetingTimesGallery.

Controle PeopleBrowseGallery.

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

Os itens dessa galeria são preenchidos por resultados de pesquisa da operação Office365.SearchUser. A operação leva o texto em Trim(**TextSearchBox**) como seu termo de pesquisa e retorna os 15 principais resultados com base nessa pesquisa.

TextSearchBox está encapsulado em uma função Trim porque uma pesquisa de usuário em espaços não é válida. A operação Office365Users.SearchUser está envolvida em uma função If(!IsBlank(Trim(TextSearchBox.Text)) ... ) porque recuperar os resultados da pesquisa antes da pesquisa de um usuário é um desperdício de desempenho.

Controle de título PeopleBrowseGallery.

  • Propriedade: Text
    Valor: ThisItem.DisplayName

    Exibe o nome de exibição da pessoa do seu perfil do Office 365.

  • Propriedade: OnSelect
    Valor: uma instrução Collect para adicionar o usuário à lista de participantes, outra para atualizar os horários de reunião disponíveis e várias alternâncias de variáveis:

    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 )
        )
    )
    

    Em um alto nível, selecionar esse controle adiciona a pessoa à coleção MyPeople (o armazenamento da lista de participantes do aplicativo) e atualiza os horários de reunião disponíveis com base na adição do novo usuário.

    Selecionar esse controle é muito semelhante a selecionar o controle AddIcon. A única diferença é a instrução Set(_selectedUser, ThisItem) e a ordem de execução das operações. Sendo assim, esta discussão não será tão profunda. Para uma explicação mais completa, leia a seção controle AddIcon.

    Selecionar esse controle redefine TextSearchBox. Então, se a seleção não estiver na coleção MyPeople, o controle:

    1. Define o estado de _loadMeetingTimes como verdadeiro e o estado de _showMeetingTimes como falso, deixa em branco as variáveis _selectedMeetingTime e _selectedRoom e atualiza a coleção MeetingTimes com a nova adição da coleção MyPeople.
    2. Define o estado de _loadMeetingTimes como falso e define _showMeetingTimes como verdadeiro. Se a seleção já estiver na coleção MyPeople, redefine apenas o conteúdo de TextSearchBox.

Controle MeetingPeopleGallery.

  • Propriedade: Items
    Valor: MyPeople

    A coleção MyPeople é a coleção de pessoas inicializadas ou adicionadas selecionando o controle Título de PeopleBrowseGallery.

  • Propriedade: Height
    Valor: lógica para permitir que a galeria expanda até uma altura máxima de 350:

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

    A altura dessa galeria se ajusta ao número de itens na galeria, com uma altura máxima de 350. A fórmula pega 76 como a altura de uma única linha de MeetingPeopleGallery, depois o multiplica pelo número de linhas. A propriedade WrapCount é definida como 2; portanto, o número de linhas verdadeiras é RoundUp(CountRows(MeetingPeopleGallery.AllItems) / 2, 0).

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

    Quando a altura máxima da galeria é atingida (350), a barra de rolagem fica visível.

Controle MeetingPeopleGallery Title.

  • Propriedade: OnSelect

    Valor: Set(_selectedUser, ThisItem)

    Define a variável selectedUser para o item selecionado em MeetingPeopleGallery.

Controle MeetingPeopleGallery iconRemove.

  • Propriedade: OnSelect
    Valor: uma instrução Remove para remover o usuário de uma lista de participantes, uma instrução Collect para atualizar os horários de reunião disponíveis e várias alternâncias de variáveis:

    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 )
    

    Em um alto nível, selecionar esse controle remove a pessoa da lista de participantes e atualiza os horários de reunião disponíveis com base na remoção dessa pessoa.

    Depois da primeira linha do código anterior, selecionar esse controle é quase idêntico a selecionar o controle AddIcon. Sendo assim, esta discussão não será tão profunda. Para uma explicação mais completa, leia a seção controle AddIcon.

    Na primeira linha do código, o item selecionado é removido da coleção MyPeople. O código então:

    1. Redefine TextSearchBox e, em seguida, remove a seleção da coleção MyPeople.
    2. Define o estado de _loadMeetingTimes como verdadeiro e o estado de _showMeetingTimes como falso, deixa em branco as variáveis _selectedMeetingTime e _selectedRoom e atualiza a coleção MeetingTimes com a nova adição da coleção MyPeople.
    3. Define o estado de _loadMeetingTimes como falso e define _showMeetingTimes como verdadeiro.

Seletor de data de reunião

Controle MeetingDateSelect.

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

    Uma data de reunião não pode ser escolhida até que pelo menos um participante tenha sido adicionado à coleção MyPeople.

  • Propriedade: OnChange
    Valor: Select( MeetingDateSelect )

    Alterar a data selecionada dispara o código na propriedade OnSelect para que o controle seja executado.

  • Propriedade: OnSelect
    Valor: uma instrução Collect para atualizar os horários de reunião disponíveis e várias alternâncias de variáveis:

    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 )
    

    Em um alto nível, selecionar esse controle atualiza os horários de reunião disponíveis. É importante porque, se um usuário altera a data, os horários disponíveis da reunião precisam ser atualizados para refletir as disponibilidades dos participantes naquele dia.

    Com exceção da instrução Collect inicial, é idêntico à funcionalidade OnSelect do controle AddIcon. Sendo assim, esta discussão não será tão profunda. Para uma explicação mais completa, leia a seção controle AddIcon.

    Selecionar esse controle redefine TextSearchBox. Ele então:

    1. Define o estado de _loadMeetingTimes como verdadeiro e o estado de _showMeetingTimes como falso, deixa em branco as variáveis _selectedMeetingTime e _selectedRoom e atualiza a coleção MeetingTimes com a nova seleção de datas.
    2. Define o estado de _loadMeetingTimes como falso e define _showMeetingTimes como verdadeiro.

Lista suspensa de duração da reunião

Controle MeetingDateSelect - duração.

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

    A duração de uma reunião não pode ser escolhida até que pelo menos um participante tenha sido adicionado à coleção MyPeople.

  • Propriedade: OnChange
    Valor: Select(MeetingDateSelect1)

    Alterar a duração selecionada dispara o código na propriedade OnSelect para que o controle MeetingDateSelect seja executado.

Controle FindMeetingTimesGallery.

  • Propriedade: Items
    Valor: MeetingTimes

    A coleção de possíveis horários de reunião recuperados da operação Office365.FindMeetingTimes.

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

    A galeria será visível apenas se _showMeetingTimes estiver configurado como verdadeiro, o usuário tiver selecionado o controle LblScheduleTab e houver pelo menos um participante adicionado à reunião.

Controle FindMeetingTimesGallery Title.

  • Propriedade: Text
    Valor: uma conversão do horário de início a ser exibida no horário local do usuário:

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

    O valor recuperado de StartTime está no formato UTC. Para converter de UTC para o horário local, a função DateAdd é aplicada. A função Text pega uma data/hora como seu primeiro argumento e a formata com base em seu segundo argumento. Você informa a conversão para o horário local de ThisItem.StartTime e a exibe como DateTimeFormat.ShortTime.

  • Propriedade: OnSelect
    Valor: várias instruções Collect para reunir salas de reunião e suas disponibilidades sugeridas, bem como várias alternâncias variáveis:

    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} )
    

    Em um alto nível, esse bloco de código reúne salas disponíveis para usuários que não possuem listas de salas, com base na data/hora selecionada para a reunião. Caso contrário, ele simplesmente recupera as listas de salas.

    Em um nível baixo, esse bloco de código:

    1. Define _selectedMeetingTime como o item selecionado. É usado para descobrir quais salas estão disponíveis durante esse período.
    2. Define a variável do estado de carregamento _loadingRooms como verdadeiro, ativando o estado de carregamento.
    3. Se a coleção RoomsLists estiver vazia, ele recupera as listas de salas do locatário do usuário e as armazena na coleção RoomsLists.
    4. Se o usuário não tiver listas de salas ou apenas uma lista de salas:
      1. A variável noRoomLists é definida como verdadeiro e essa variável é usada para determinar os itens exibidos no controle RoomBrowseGallery.
      2. A operação Office365.GetRooms() é usada para recuperar as cem primeiras salas do locatário. Elas são armazenadas na coleção AllRooms .
      3. A variável _allRoomsConcat é definida como uma cadeia de caracteres separada por ponto e vírgula dos 20 primeiros endereços de email das salas na coleção AllRooms. Isso ocorre porque Office365.FindMeetingTimes limita-se a procurar os horários disponíveis de 20 objetos pessoais em uma única operação.
      4. A coleção RoomTimeSuggestions usa Office365.FindMeetingTimes para recuperar as disponibilidades das primeiras 20 salas da coleção AllRooms, com base nos valores de horário da variável _selectedMeetingTime. Observe que & "Z" é usado para formatar corretamente o valor DateTime.
      5. A coleção AvailableRooms é criada. Ela é simplesmente a coleção RoomTimeSuggestions de disponibilidades dos participantes com duas colunas adicionais incluídas: "Endereço" e "Nome". "Endereço" é o endereço de email da sala, e "Nome" é o nome da sala.
      6. Então, a coleção AvailableRoomsOptimal é criada. Ela é apenas a coleção AvailableRooms com as colunas "Disponibilidade" e "Participante" removidas. Isso corresponde aos esquemas de AvailableRoomsOptimal e AllRooms. E permite que você use as duas coleções na propriedade Items de RoomBrowseGallery.
      7. _roomListSelected é definido como falso.
    5. O estado de carregamento, _loadingRooms, é configurado como falso depois que terminar a execução de todo o resto.

Controle RoomBrowseGallery.

  • Propriedade: Items
    Valor: logicamente definido como duas coleções internas de esquema idêntico, dependendo se o usuário selecionou uma lista de salas ou tem listas de salas em seu locatário:

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

    A galeria exibirá a coleção AvailableRoomsOptimal se _roomListSelected ou _noRoomLists for verdadeiro. Caso contrário, ela exibirá a coleção RoomsLists. Isso pode ser feito porque o esquema dessas coleções é idêntico.

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

    A galeria será visível apenas se as três instruções anteriores resultarem em verdadeiro.

Título de RoomBrowseGallery

Controle RoomBrowseGallery Title.

  • Propriedade: OnSelect
    Valor: um conjunto de instruções Collect e Set logicamente vinculadas que podem ou não ser disparadas, dependendo se o usuário está visualizando listas de salas ou 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 ações que ocorrem quando esse controle é selecionado dependem se um usuário está atualmente visualizando um conjunto de listas de salas ou um conjunto de salas. Se for a primeira opção, selecionar esse controle recupera as salas disponíveis no horário selecionado da lista de salas selecionadas. Se for a segunda, selecionar este controle define a variável _selectedRoom como o item selecionado. A declaração anterior é muito semelhante à instrução Select para FindMeetingTimesGallery Title.

    Em um nível baixo, o bloco de código anterior:

    1. Ativa o estado de carregamento das salas definindo _loadingRooms como verdadeiro.
    2. Verifica se uma lista de salas foi selecionada e se o locatário possui listas de salas. Se for o caso:
      1. Define _roomListSelected como verdadeiro e _selectedRoomList como o item selecionado.
      2. A variável _allRoomsConcat é definida como uma cadeia de caracteres separada por ponto e vírgula dos 20 primeiros endereços de email das salas na coleção AllRooms. Isso ocorre porque a operação Office365.FindMeetingTimes limita-se a procurar os horários disponíveis de 20 objetos pessoais em uma única operação.
      3. A coleção RoomTimeSuggestions usa a operação Office365.FindMeetingTimes para recuperar as disponibilidades das primeiras 20 salas da coleção AllRooms, com base nos valores de horário da variável _selectedMeetingTime. Observe que & "Z" é usado para formatar corretamente o valor DateTime.
      4. A coleção AvailableRooms é criada. Ela é simplesmente a coleção RoomTimeSuggestions de disponibilidades dos participantes com duas colunas adicionais incluídas: "Endereço" e "Nome". "Endereço" é o endereço de email da sala, e "Nome" é o nome da sala.
      5. Então, a coleção AvailableRoomsOptimal é criada. Ela é apenas a coleção AvailableRooms com as colunas "Disponibilidade" e "Participante" removidas. Isso corresponde aos esquemas de AvailableRoomsOptimal e AllRooms. E permite que você use as duas coleções na propriedade Items de RoomBrowseGallery.
      6. _roomListSelected é definido como falso.
    3. O estado de carregamento, _loadingRooms, é configurado como falso depois que terminar a execução de todo o resto.

Sinal de menor

Controle RoomsBackNav.

  • Propriedade: Visible
    Valor: _roomListSelected && _showDetails

    Esse controle será visível apenas se uma lista de salas tiver sido selecionada e a guia Agenda estiver selecionada.

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

    Quando _roomListSelected é definido como falso, altera o controle RoomBrowseGallery para exibir itens da coleção RoomsLists.

Ícone Enviar

Controle IconSendItem.

  • Propriedade: DisplayMode
    Valor: lógica para forçar o usuário a inserir determinados detalhes da reunião para que o ícone se torne editável.

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

    O ícone é selecionável apenas se o assunto da reunião for preenchido, houver pelo menos um participante para a reunião e o horário da reunião tiver sido selecionado. Caso contrário, ele estará desabilitado.

  • Propriedade: OnSelect

    Valor: código para enviar o convite da reunião aos participantes selecionados 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 )
    )
    

    Em um nível baixo, esse bloco de código:

    1. Define _myCalendarName como o calendário na operação Office365.CalendarGetTables () com um DisplayName de "Calendário".
    2. Agenda a reunião com todos os valores de entrada das várias seleções feitas pelo usuário em toda a tela, usando a operação Office365.V2CalendarPostItem.
    3. Redefine todos os campos de entrada e variáveis usados na criação da reunião.

Observação

Dependendo da sua região, o calendário desejado pode não ter o nome de exibição "Calendário". Acesse o Outlook para ver qual é o título do seu calendário e faça as alterações apropriadas no aplicativo.

Próximas etapas

Observação

Você pode nos falar mais sobre suas preferências de idioma para documentação? Faça uma pesquisa rápida. (Observe que esta pesquisa está em inglês)

A pesquisa levará cerca de sete minutos. Nenhum dado pessoal é coletado (política de privacidade).