Updated billing contact Q4 business review summary Mostrar mais Delivery schedule Re: Question about the November order Question about the November order Renewal kickoff
O Timeline componente mostra linhas de várias tabelas como uma única lista, a mais recente primeiro: por padrão, as notas de um registro, comunicações no portal e outras atividades. Coloque dentro de um RecordContext e ele lista as linhas sobre esse registro: quem escreveu cada um e quando, seu corpo em texto enriquecido cortado para algumas linhas até Mostrar mais, e seu anexo para download. Ele lê uma página de cada vez, com Carregar mais para o restante e Atualizar para ler novamente. A busca funciona como uma grade: o texto corresponde desde o início de um assunto ou texto, ou qualquer lugar após um início *, e um dia ou um ano, com >, <, ou >= <= antes dele, encontra as linhas desses dias. Com mais de uma tabela, um menu ao lado da busca escolhe qual mostrar.
<RecordContext table="account" queryParameterName="id">
<Timeline />
</RecordContext><RecordContext TableName="account" QueryParameterName="id">
<Timeline />
</RecordContext>As notas, mensagens e compromissos sobre Schmeler and Sons, a demonstração da conta mostra na página de detalhes da conta. Uma das suas notas é interna — seu texto não começa com *WEB* — então não está listada. Escolha as tabelas que ela mostra, ou restringia-as com filtros de Editar (AllowFiltering), no menu Filtro, e faça login para salvá-las lá como uma visualização sua própria (AllowSavedViews).
Uma nota só chega ao portal quando seu texto começa com *WEB*, para que a equipe possa manter anotações internas nos registros que os clientes veem. Ligações telefônicas, tarefas e outras atividades seguem a mesma regra em sua descrição, exceto os tipos não filtrados — comunicações no portal, por padrão. O servidor aplica isso a todas as consultas, incluindo grades e joins, então nenhuma regra de acesso à tabela pode ampliá-la. O portal nunca mostra o prefixo e o adiciona a uma nota ou atividade criada pelo portal. Uma nota cujo título nomeia seu autor é Note created on … by Name [contact:id] mostrada como escrita por esse contato. Configurado SecurityOptions.PortalVisibility.Prefix para usar outro prefixo, ou para null mostrar cada nota e atividade, e adicionar uma tabela para UnfilteredActivities mostrar cada atividade. Funcionários que fizeram login no portal como eles mesmos são exceção: eles veem cada nota e atividade que seus papéis de segurança permitem ler, como fariam no Dynamics, com seu texto armazenado, então adicionam o prefixo eles mesmos a uma nota destinada ao portal.
builder.Services.Configure<SecurityOptions>(options =>
{
// Notas e atividades chegam ao portal quando o texto começa com *PORTAL*.
options.PortalVisibility.Prefix = "*PORTAL*";
// Todo e-mail que o usuário pode ler chega ao portal: os e-mails não podem carregar o prefixo.
options.PortalVisibility.UnfilteredActivities.Add("email");
});
E-mails não podem ser marcados com o prefixo. O corpo de um e-mail é escrito pelo cliente de e-mail que o enviou, como um documento HTML completo, então o prefixo nunca é seu primeiro texto, e nenhum e-mail chega ao portal pelo prefixo. Adicionar email a UnfilteredActivities é a única forma de mostrar e-mails, e mostra todos os e-mails que o usuário pode ler em um registro — incluindo os internos.
Uma comunicação por portal (ppp_portalcommunication) é uma atividade na solução Power Portals Pro para mensagens entre um usuário do portal e a equipe. Ela é destinada ao portal, portanto não precisa de prefixo. Seu De diz quem a escreveu: o contato do usuário do portal, ou o membro da equipe que respondeu, com o contato em To. A mensagem é em texto enriquecido e pode conter um anexo.
A linha do tempo lista apenas o que o usuário pode ler: cada tipo de item precisa ser lido em sua tabela, e um usuário que não consegue ler nenhum dos dois vê nenhuma linha do tempo. Uma nota aponta para seu registro através objectid e uma comunicação por portal através regardingobjectidde , então a regra usual permite que o usuário leia os itens sobre os registros que pode alcançar, com RowsViaParent. Mantenha essa busca entre as colunas que ele pode ler: a linha do tempo pede os itens sobre seu registro através dela, e uma condição em uma coluna que o usuário pode não ler é eliminada, o que listaria os itens de cada registro alcançado.
// Os usuários leem as notas e mensagens sobre a conta da própria empresa.
builder.Services.AddTableAccess("annotation", t => t
.ForSignedInUsers()
.RowsViaParent("objectid", "account", parent => parent.RowsOfTheirAccount("accountid"))
.Allow(TableSecurityPermission.Read)
.ReadingAllColumns());
builder.Services.AddTableAccess("ppp_portalcommunication", t => t
.ForSignedInUsers()
.RowsViaParent("regardingobjectid", "account", parent => parent.RowsOfTheirAccount("accountid"))
.Allow(TableSecurityPermission.Read)
.ReadingAllColumns());
O usuário da aplicação do portal também precisa ser lido em ambas as tabelas no Dataverse. As notas precisam ser lidas na tabela de Notas. O Dataverse concede a todo tipo de atividade um conjunto de privilégios, então as comunicações do portal são cobertas pelas atividades de leitura que o papel de Usuário do Power Portals Pro já possui. Para que os usuários possam alterar ou excluir notas e mensagens, é necessário Escrever e Excluir na tabela de Notas e Excluir nas atividades, o que essa função não é válida.
Um usuário que pode criar comunicações por portal recebe Nova mensagem: um assunto, uma mensagem em texto enriquecido e um anexo, sobre o registro em que a linha do tempo está, e quem pode criar notas recebe Nova nota. CreatableTables nomeia as tabelas das quais uma nova linha pode ser escrita, notas e comunicações por portal por padrão; uma nota ou mensagem é escrita no lugar, a linha de outra tabela em um painel lateral. É uma forma própria, salva separadamente da página ao redor. O servidor envia a mensagem do usuário, seja qual for o pedido dito, então um usuário não pode escrever como outro. Conceda acesso a tabela: OwnedBy("from") envia uma nova mensagem do autor e RowsForWriting RowsOwnedByContact("from") permite aos usuários alterar e excluir apenas o que enviaram. Deixe de fora Escrever e Deletar, e a mensagem permanece como foi enviada. A linha do tempo oferece Editar e Deletar em cada linha que o acesso do usuário permite alterar ou excluir, e o servidor julga cada alteração novamente quando ela chega. FormLocation (Reagir: formLocation) diz onde o formulário de outra tabela se abre: um painel lateral à direita, como por padrão, ou à esquerda, um diálogo no centro, ou Inline — no lugar na linha do tempo, enquanto notas e mensagens são escritas.
// Leia todas as mensagens sobre a conta da empresa, escreva novas e mude ou exclua a própria delas.
builder.Services.AddTableAccess("ppp_portalcommunication", t => t
.ForSignedInUsers()
.RowsViaParent("regardingobjectid", "account", parent => parent.RowsOfTheirAccount("accountid"))
.RowsForWriting(r => r.RowsOwnedByContact("from"))
.OwnedBy("from")
.Allow(TableSecurityPermission.Read | TableSecurityPermission.Create | TableSecurityPermission.Append
| TableSecurityPermission.Write | TableSecurityPermission.Delete)
.ReadingAllColumns()
.WritingOnCreate("regardingobjectid")
.Writing("subject", "description", "ppp_attachment"));
// Mensagens dos usuários do portal vão para uma fila em vez de para o dono do registro.
builder.Services.Configure<PortalCommunicationOptions>(options =>
{
options.Recipient = PortalCommunicationRecipient.Queue;
options.QueueId = new Guid("00000000-0000-0000-0000-000000000000");
});
A equipe ouve de uma nova mensagem por PortalCommunicationOptionsmeio de . Por padrão, ela é endereçada ao proprietário do registro sobre o qual se refere, quando esse proprietário é usuário. Ela pode ir para uma fila, à qual o usuário do portal precisa acessar para adicionar itens, ou para ninguém, deixando-a apenas na linha do tempo do registro.
Notas e todas as tabelas de atividades são registradas no servidor para linhas do tempo e calendários, cada um datado pelo que seus formulários pedem: um compromisso no início, uma tarefa ou ligação telefônica na data de vencimento, um e-mail ou mensagem até quando foi escrito. Uma linha do tempo lista todas as tabelas registradas que o usuário pode ler; nomeie as que ela mostra em Tables. Em um registro, ele lista as linhas sobre ele e as atividades das quais o registro participa como remetente, destinatário ou participante. O servidor mostra apenas as notas e atividades destinadas ao portal: aquelas cujo texto começa com *WEB*, ou todas de um tipo em UnfilteredActivities. E-mails não podem carregar o prefixo, então eles aparecem apenas quando email está nessa lista.
<Timeline tables={['annotation', 'ppp_portalcommunication', 'phonecall', 'email']} /><Timeline Tables="@(["annotation", "ppp_portalcommunication", "phonecall", "email"])" />Registre uma tabela própria com AddMultiTableSource: um título e o que mais é mostrado, como o texto, seu proprietário e destinatários, e a consulta ao registro sobre a qual uma linha é referida. Depois, nomeie cada controle para o qual ele é, com as colunas que o controle precisa: ForTimelines a data pela qual suas linhas são ordenadas, ForCalendars seu início e, se tiver, sua coluna final e o dia todo, ForSearch, e ForMaps sua latitude e longitude. Essas colunas são sempre lidas, independentemente dos nomes da consulta da visualização. Um registro que nomeia uma coluna que a tabela não tem, ou uma do tipo errado, para o portal na inicialização e diz o que está errado. Registrar uma tabela de notas ou atividade novamente muda apenas o que o registro nomeia. Um registro não concede acesso: cada tabela ainda precisa de acesso de leitura como qualquer tabela.
// Casos em prazos e calendários, datados pela data em que foram abertos.
builder.Services.AddMultiTableSource("incident", t => t
.Title("title")
.Body("description")
.Owner("ownerid")
.Regarding("customerid")
.ForTimelines(start: "createdon")
.ForCalendars(start: "createdon"));
// E-mails por quando foram enviados, em vez de escritos.
builder.Services.AddMultiTableSource("email", t => t.ForTimelines(start: "senton"));
Uma linha do tempo lista suas linhas mais recentes primeiro, daqui para frente. Upcoming (Reagir: upcoming) começa essa linha antes, então o que vem aparece primeiro sob seu próprio título, e Ascending (Reagir: ascending) lista as linhas a partir de agora, o mais rápido primeiro: veja Itens Futuros. Para desenhar as linhas de uma tabela do seu jeito, ou escrevê-las em formas suas, veja Renderização Personalizada.
<Timeline upcoming={{ days: 2 }} /><Timeline Upcoming="TimeSpan.FromDays(2)" />Forneça as visualizações da linha do tempo para escolher, pois uma grade tem: as próprias do Dataverse em ViewIds, como Minhas Ligações Telefonicas ou Todas as Atividades, vistas de várias tabelas em MultiTableViewIds, e vistas suas próprias em CustomViewDefinitions, nomeando DefaultViewId a que é mostrada primeiro. Com duas ou mais, um seletor de visualização ocupa o lugar do título. Uma visualização do Dataverse lista activitypointer cada tabela de atividades registradas, e em um registro uma visualização lista as linhas sobre o registro que ela deixa passar. Com (Reagir: allowSavedViews), um usuário logado pode salvar as tabelas que a linha do tempo mostra como uma visualização própria, oferecida ao lado da AllowSavedViews sua, e escolher sua visão padrão e esconder as que não usar, no menu Filtro: veja Visualizações Salvas.
Uma visualização da sua própria lista linhas de uma ou mais tabelas. Dê a uma tabela uma consulta FetchXML, e seus filtros e joins decidem quais linhas aparecem, para que uma visualização possa alcançar linhas arquivadas contra outros registros, como as ligações telefônicas com contatos de uma conta; definida FilterByRecord para false que as consultas da visualização decidam por si mesmas. A linha do tempo lê suas próprias colunas em sua própria ordem, então as colunas e ordens da consulta não importam. O usuário deve ser capaz de ler cada coluna que um filtro testa: uma condição em uma coluna que o usuário pode não ler é descartada.
<Timeline
viewIds={[myPhoneCallsViewId, myTasksViewId]}
filterByRecord={false}
customViewDefinitions={[
{
// As ligações com os contatos da conta e as anotações sobre a conta.
id: '6f3c2a1e-0b7d-4c55-9a3e-2d8f1b6c4e90',
displayName: 'Calls with our people',
tables: [
{
table: 'phonecall',
fetchXml: `
<fetch>
<entity name="phonecall">
<link-entity name="contact" from="contactid" to="regardingobjectid">
<filter><condition attribute="parentcustomerid" operator="eq" value="${accountId}" /></filter>
</link-entity>
</entity>
</fetch>`,
},
{
table: 'annotation',
fetchXml: `
<fetch>
<entity name="annotation">
<filter><condition attribute="objectid" operator="eq" value="${accountId}" /></filter>
</entity>
</fetch>`,
},
],
},
]}
/><Timeline ViewIds="@([myPhoneCallsViewId, myTasksViewId])"
CustomViewDefinitions="@_views"
FilterByRecord="false" />
@code {
// As ligações com os contatos da conta e as anotações sobre a conta.
private List<MultiTableViewDefinition> _views =
[
new()
{
Id = new Guid("6f3c2a1e-0b7d-4c55-9a3e-2d8f1b6c4e90"),
DisplayName = "Calls with our people",
Tables =
[
new MultiTableViewTable
{
Table = "phonecall",
FetchXml = $"""
<fetch>
<entity name="phonecall">
<link-entity name="contact" from="contactid" to="regardingobjectid">
<filter><condition attribute="parentcustomerid" operator="eq" value="{accountId}" /></filter>
</link-entity>
</entity>
</fetch>
""",
},
new MultiTableViewTable
{
Table = "annotation",
FetchXml = $"""
<fetch>
<entity name="annotation">
<filter><condition attribute="objectid" operator="eq" value="{accountId}" /></filter>
</entity>
</fetch>
""",
},
],
},
];
}Escolha quais tabelas estão listadas, quantos itens cada página adiciona, se a caixa de busca é mostrada e qual a altura da lista cresce antes de rolar.
Nome | Tipo | Padrão | Descrição |
|---|---|---|---|
AllowFiltering | bool | False | Quando true, o menu Filtro oferece os filtros da visualização para mudar, como os de uma grade does — uma aba para cada tabela mostrada: condições em suas colunas, aninhadas em grupos e relacionadas tabelas para filtrar, sobre as colunas e tabelas que o usuário pode ler. As mudanças duram enquanto o A linha do tempo mostra a visualização, e um usuário que salva visualizações pode mantê-las como uma visualização própria. Não oferecido para uma visualização de várias tabelas mantidas no Dataverse, que o servidor lê pelo seu ID. O padrão é false: o usuário pode remover todos os filtros que a visualização possui, o que um A visualização destinada a restringir as linhas de uma página pode não ser necessária. |
AllowSavedViews | bool | False | Permita aos usuários logados salvar as tabelas que a linha do tempo mostra como visualizações próprias, oferecidas na O seletor de visualizações ao lado das páginas, e escolha a visualização padrão deles e esconda as visualizações que não usam. Uma visualização salva em uma linha do tempo ou um calendário com não Timeline.SavedViewsKey é oferecida em ambas. Desligado por padrão. Precisa das tabelas multi-tabela da solução Power Portals Pro Core; uma tabela interna o usuário também precisa do papel de segurança |
AllowSearch | bool | True | Mostra uma caixa de busca sobre as colunas das linhas, o que também leva um dia ou um ano — com true. |
Ascending | bool | False | Lista as linhas mais antigas primeiro, a partir de agora. Padrão para false: mais novo primeiro, de agora de volta. |
ChildContent | RenderFragment? | Os modelos e formulários da página para suas tabelas: MultiTableTemplate e MultiTableForm. | |
CreatableTables | IEnumerable<string>? | As tabelas que um usuário pode escrever uma nova linha a partir da linha do tempo, aquelas que ele pode criar. Padrões para Notas e comunicações por portal, que precisam do registro da linha do tempo. | |
CustomViewDefinitions | List<MultiTableViewDefinition>? | Vistas definidas no código, listadas por último: cada uma mostra linhas de uma ou mais tabelas. | |
DefaultTables | IEnumerable<string>? | As tabelas mostradas inicialmente quando a linha do tempo mostra todas as tabelas — sem uma visão própria: as outras O usuário pode ler são oferecidos no menu da tabela, desativado. Padrões para notas, e-mails e comunicações por portal. Sem nenhuma delas para mostrar, todas as mesas são. | |
DefaultViewId | Guid? | A vista mostrada primeiro. Sem set, ou não entre as vistas, é a primeira. | |
FilterByRecord | bool | True | Mostra apenas as linhas ao redor do registro da forma ao redor, quando Timeline.Regarding Não nomeia nenhum. Defina para false uma linha do tempo cujas opiniões decidem por si mesmas quais linhas aparecem, onde quer que estejam colocadas. Padrão para true. |
FormLocation | TimelineFormLocation | Right | Onde a forma de uma linha se abre, para criá-la ou alterá-la: um painel lateral à direita ou à esquerda, um diálogo no centro, ou no local na linha do tempo, enquanto notas e mensagens são escritas. Notas e mensagens sem um formato de páginas são escritas no local onde quer que os formulários sejam abertos. Padrão para TimelineFormLocation.Right. |
MatchParties | bool? | Seja para atividades das quais o registro participa — como remetente, destinatário ou participante — mostre ao lado Essas sobre isso. Desajuste, cada configuração da mesa, senão a do servidor. | |
MaxHeight | string? | A lista de itens mais alta cresce, como um comprimento CSS ( | |
MultiTableViewIds | IEnumerable<Guid>? | Visualizações de várias tabelas para escolher, por id: registradas no Timeline.ViewIds. | |
PageSize | int | 10 | Quantos itens são mostrados no início e adicionados por cada 'Carregar mais'. O padrão é 10. |
Record | TableRecord? | O registro cuja linha do tempo é essa, em cascata pela forma ao redor. | |
Regarding | TableRecordReference? | O registro cujas linhas mostram — aquelas sobre ele, e as atividades em que participa. Unset, o registro da forma ao redor (ver Timeline.FilterByRecord); com nenhum, em cada linha o assistir aos programas. | |
SavedViewsKey | string? | Nomeia essa linha do tempo entre as linhas do tempo, então as visualizações salvas nela e o padrão do usuário e Visões ocultas são suas. Sem uma, ela compartilha suas visões com cada linha do tempo e calendário que não tem nenhuma. Letras, dígitos, | |
Series | MultiTableSeries? | Como os compromissos recorrentes aparecem. Desajustado, a configuração de cada mesa. | |
ShowRecordLinks | bool | True | Se o título de um item faz link para a página do registro, registrado no true; uma tabela sem página não mostra link. |
SignInUrl | string | Account/Login | Quando um usuário que não está logado é enviado para fazer login, pelo menu das visualizações salvas, que pergunta eles para primeiro; eles retornam a esta página. Padrão para |
Tables | IEnumerable<string>? | As tabelas mostradas, por nome lógico: cada uma precisa ser registrada no | |
Title | string? | O título. O nome da visualização é padrão, ou 'Linha do tempo'; um seletor de visualização ocupa seu lugar. | |
Upcoming | TimeSpan? | Quão adiante a linha do tempo começa, então o que está por vir aparece acima do resto por si só Cabeçalho: dois dias mostra as próximas duas linhas primeiro. Desajustado, começa agora. | |
ViewIds | IEnumerable<Guid>? | Visualizações do Dataverse para escolher, por id — 'Meus E-mails', 'Todas as Atividades' — cada uma uma vista de um tabela registrada, ou de | |
ViewSort | ViewSort | NameAscending | A ordem das visualizações no seletor. Padrão para ViewSort.NameAscending, como a de uma grade e de um calendário. |
AllowFilteringtrue, o menu Filtro oferece os filtros da visualização para mudar, como os de uma grade does — uma aba para cada tabela mostrada: condições em suas colunas, aninhadas em grupos e relacionadas tabelas para filtrar, sobre as colunas e tabelas que o usuário pode ler. As mudanças duram enquanto o A linha do tempo mostra a visualização, e um usuário que salva visualizações pode mantê-las como uma visualização própria. Não oferecido para uma visualização de várias tabelas mantidas no Dataverse, que o servidor lê pelo seu ID. O padrão é false: o usuário pode remover todos os filtros que a visualização possui, o que um A visualização destinada a restringir as linhas de uma página pode não ser necessária.AllowSavedViewsTimeline.SavedViewsKey é oferecida em ambas. Desligado por padrão. Precisa das tabelas multi-tabela da solução Power Portals Pro Core; uma tabela interna o usuário também precisa do papel de segurança AllowSearchtrue.Ascendingfalse: mais novo primeiro, de agora de volta.ChildContentMultiTableTemplate e MultiTableForm.CreatableTablesCustomViewDefinitionsDefaultTablesDefaultViewIdFilterByRecordTimeline.Regarding Não nomeia nenhum. Defina para false uma linha do tempo cujas opiniões decidem por si mesmas quais linhas aparecem, onde quer que estejam colocadas. Padrão para true.FormLocationTimelineFormLocation.Right.MatchPartiesMaxHeightMultiTableViewIdsTimeline.ViewIds.PageSizeRecordRegardingTimeline.FilterByRecord); com nenhum, em cada linha o assistir aos programas.SavedViewsKeySeriesShowRecordLinkstrue; uma tabela sem página não mostra link.SignInUrlTablesTitleUpcomingViewIdsViewSortViewSort.NameAscending, como a de uma grade e de um calendário.