Updated billing contact Q4 business review summary Mostrar más Delivery schedule Re: Question about the November order Question about the November order Renewal kickoff
El Timeline componente muestra filas de varias tablas como una sola lista, la más reciente primero: por defecto las notas de un registro, comunicaciones por portal y otras actividades. Ponlo dentro de un RecordContext y lista las filas sobre ese registro: quién escribió cada uno y cuándo, su cuerpo en texto enriquecido se reduce a unas pocas líneas hasta Mostrar más, y su archivo adjunto para descargar. Lee página a página, con Cargar más para el resto y Actualizar para leerlo de nuevo. La búsqueda funciona como una cuadrícula: el texto coincide desde el inicio de un tema o texto, o cualquier lugar después de un inicio *, y un día o un año, con >, <, >= o <= antes, encuentra las filas de esos días. Con más de una tabla, un menú junto a la búsqueda elige cuál mostrar.
<RecordContext table="account" queryParameterName="id">
<Timeline />
</RecordContext><RecordContext TableName="account" QueryParameterName="id">
<Timeline />
</RecordContext>Las notas, mensajes y citas sobre Schmeler and Sons, la cuenta que muestra la demo de la página de detalle de la cuenta. Una de sus notas es interna — su texto no empieza con *WEB* — por lo que no está listada. Elige las tablas que muestra, o acotáralas con Editar filtros (AllowFiltering), en el menú de Filtros, e inicia sesión para guardarlas allí como una vista propia (AllowSavedViews).
Una nota llega al portal solo cuando su texto comienza por *WEB*, para que el personal pueda llevar notas internas en los registros que ven los clientes. Las llamadas, tareas y otras actividades siguen la misma regla en su descripción, excepto los tipos sin filtrar — comunicaciones del portal, por defecto. El servidor aplica esto a todas las consultas, incluidas las cuadrículas y joins, por lo que ninguna regla de acceso a la tabla puede ampliarla. El portal nunca muestra el prefijo y lo añade a una nota o actividad creada a través del portal. Una nota cuyo título nombre nombre a su autor se Note created on … by Name [contact:id] muestra como escrita por ese contacto. Configurada SecurityOptions.PortalVisibility.Prefix para usar otro prefijo, o para null mostrar cada nota y actividad, y añadir una tabla para UnfilteredActivities mostrar cada actividad. El personal que inicia sesión en el portal como ellos mismos es la excepción: ven cada nota y actividad que sus roles de seguridad les permiten leer, como harían en Dynamics, con su texto almacenado, por lo que añaden ellos mismos el prefijo a una nota destinada al portal.
builder.Services.Configure<SecurityOptions>(options =>
{
// Las notas y actividades llegan al portal cuando su texto empieza por *PORTAL*.
options.PortalVisibility.Prefix = "*PORTAL*";
// Cada correo electrónico que el usuario puede leer llega al portal: los correos no pueden llevar el prefijo.
options.PortalVisibility.UnfilteredActivities.Add("email");
});
Los correos no pueden marcarse con el prefijo. El cuerpo de un correo electrónico lo escribe el cliente de correo que lo envió, como un documento HTML completo, así que el prefijo nunca es su primer texto, y ningún correo llega al portal por su prefijo. Sumar email a UnfilteredActivities es la única forma de mostrar correos, y muestra todos los correos que el usuario puede leer en un registro — incluidos los internos.
Una comunicación por portal (ppp_portalcommunication) es una actividad en la solución Power Portals Pro para mensajes entre un usuario del portal y el personal. Está destinada al portal, por lo que no necesita prefijo. Su De indica quién la escribió: el contacto del usuario del portal, o el miembro del personal que respondió, con el contacto en To. El mensaje es texto enriquecido y puede llevar un archivo adjunto.
La línea de tiempo solo muestra lo que el usuario puede leer: cada tipo de elemento necesita ser leído en su tabla, y un usuario que no puede leer ninguno de los dos no ve ninguna línea temporal. Una nota señala su registro a través objectid de la línea de tiempo y una comunicación por portal a través regardingobjectidde , por lo que la regla habitual permite al usuario leer los elementos sobre los registros a los que puede acceder, con RowsViaParent. Mantén esa consulta entre las columnas que puede leer: la línea de tiempo pide los elementos sobre su registro a través de ella, y se elimina una condición en una columna que un usuario puede no leer, lo que listaría los elementos de cada registro al que accede.
// Los usuarios leen las notas y mensajes sobre la cuenta de su propia 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());
El usuario de la aplicación del portal también necesita leer ambas tablas en Dataverse. Las notas deben leerse en la tabla de Notas. Dataverse concede a cada tipo de actividad un conjunto de privilegios, por lo que las comunicaciones por el portal están cubiertas por las actividades de lectura que ya tiene el rol de Usuario de la Aplicación Power Portals Pro. Para que los usuarios puedan cambiar o eliminar notas y mensajes, necesita Escribir y Borrar en la tabla de Notas y Eliminar en actividades, que ese rol no cumple.
Un usuario que puede crear comunicaciones en el portal recibe Nuevo mensaje: un asunto, un mensaje en texto enriquecido y un archivo adjunto, sobre el registro en el que está la línea de tiempo, y quien puede crear notas recibe Nota Nueva. CreatableTables Nombra las tablas sobre las que se puede escribir una nueva fila, Notas y comunicaciones por portal por defecto; una nota o mensaje se escribe en su lugar, la fila de otra tabla en un panel lateral. Es una forma propia, guardada aparte de la página que lo rodea. El servidor envía el mensaje desde el usuario, lo que diga la solicitud, por lo que un usuario no puede escribir como otro. Concédelo con acceso a tabla: OwnedBy("from") envía un nuevo mensaje de su autor, y RowsForWriting permite RowsOwnedByContact("from") a los usuarios cambiar y eliminar solo lo que enviaron. Omite Escribir y Eliminar, y el mensaje permanece tal como fue enviado. La línea de tiempo ofrece Editar y Borrar en cada fila que el usuario le permite cambiar o eliminar, y el servidor juzga cada cambio de nuevo cuando llega FormLocation . (React: formLocation) indica dónde se abre la forma de otra tabla: un panel lateral a la derecha, como por defecto, o a la izquierda, un diálogo en el centro, o Inline — en su lugar en la línea de tiempo, mientras se escriben notas y mensajes.
// Lee cada mensaje sobre la cuenta de su empresa, escribe nuevos y cambia o elimina la suya propia.
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"));
// Los mensajes de los usuarios del portal van a una cola en lugar de al propietario del registro.
builder.Services.Configure<PortalCommunicationOptions>(options =>
{
options.Recipient = PortalCommunicationRecipient.Queue;
options.QueueId = new Guid("00000000-0000-0000-0000-000000000000");
});
El personal recibe noticias de un nuevo mensaje a través PortalCommunicationOptionsde . Por defecto, está dirigido al propietario del registro del que se refiere, cuando ese propietario es usuario. Puede ir a una cola, a la que el usuario de la aplicación del portal necesita acceso para añadir elementos, o a nadie, dejándolo solo en la línea de tiempo del registro.
Las notas y todas las tablas de actividades se registran en el servidor para líneas de tiempo y calendarios, cada uno fechado según lo que piden sus formularios: una cita para su inicio, una tarea o llamada telefónica para su fecha de vencimiento, un correo electrónico o mensaje para cuando fue escrito. Una línea de tiempo lista todas las tablas registradas que el usuario puede leer; nombra las que muestra en Tables. En un registro enumera las filas relacionadas con él y las actividades en las que participa el registro como remitente, destinatario o asistente. El servidor muestra solo las notas y actividades destinadas al portal: aquellas cuyo texto empieza por *WEB*, o todas las que tienen un tipo en UnfilteredActivities. Los correos electrónicos no pueden llevar el prefijo, por lo que solo aparecen cuando email está en esa lista.
<Timeline tables={['annotation', 'ppp_portalcommunication', 'phonecall', 'email']} /><Timeline Tables="@(["annotation", "ppp_portalcommunication", "phonecall", "email"])" />Registra una tabla propia con AddMultiTableSource: un título y qué más se muestra, como el texto, su propietario y destinatarios, y la búsqueda al registro que trata una fila. Luego nombra cada control para el que es, con las columnas que ese control necesita: ForTimelines la fecha en que se ordenan sus filas, ForCalendars su inicio y, si los tiene, su columna de fin y de todo el día, ForSearch, y ForMaps su latitud y longitud. Esas columnas siempre se leen, sea cual sea el nombre de la consulta de una vista. Un registro que nombre una columna que la tabla no tiene, o una de tipo incorrecto, detiene el portal al inicio y dice qué está mal. Registrar una tabla de notas o actividad cambia solo lo que el registro nombra. Un registro no concede acceso: cada tabla sigue necesitando acceso de lectura como cualquier tabla.
// Casos en cronogramas y calendarios, fechados según la fecha en que se abrieron.
builder.Services.AddMultiTableSource("incident", t => t
.Title("title")
.Body("description")
.Owner("ownerid")
.Regarding("customerid")
.ForTimelines(start: "createdon")
.ForCalendars(start: "createdon"));
// Correos electrónicos según cuándo se enviaron en lugar de escribirlos.
builder.Services.AddMultiTableSource("email", t => t.ForTimelines(start: "senton"));
Una línea de tiempo lista sus filas más recientes primero, desde ahora hacia atrás. Upcoming (React: upcoming) empieza con antelación, así que lo que viene aparece primero bajo su propio encabezado, y Ascending (React: ascending) lista las filas a partir de ahora, lo más pronto posible: consulta Elementos próximos. Para dibujar las filas de una tabla a tu manera, o escribirlas en formas propias, consulta Renderizado Personalizado.
<Timeline upcoming={{ days: 2 }} /><Timeline Upcoming="TimeSpan.FromDays(2)" />Da las vistas de la línea de tiempo para elegir, ya que una cuadrícula tiene: las propias de Dataverse en ViewIds, como Mis llamadas telefónicas o Todas las actividades, vistas de varias tablas en MultiTableViewIds, y vistas propias en CustomViewDefinitions, nombrando DefaultViewId la que aparece primero. Con dos o más, un selector de vistas ocupa el lugar del encabezado. Una vista de activitypointer Dataverse de lista de cada tabla de actividad registrada, y en un registro una vista lista las filas sobre el registro que deja pasar. Con (React: allowSavedViews), un usuario iniciado sesión puede guardar las tablas que muestra la línea de tiempo como una vista propia, ofrecida junto a AllowSavedViews la tuya, y elegir su vista predeterminada y ocultar las que no usa, desde el menú de Filtro: ver Vistas guardadas.
Una vista de tus propias lista filas de una o más tablas. Asigna a una tabla una consulta FetchXML, y sus filtros y uniones deciden qué filas se muestran, para que una vista pueda acceder a filas archivadas contra otros registros, como las llamadas telefónicas con los contactos de una cuenta; configura FilterByRecord para false que las consultas de la vista decidan por sí mismas. La línea de tiempo lee sus propias columnas en su propio orden, por lo que las columnas y órdenes de una consulta no importan. El usuario debe ser capaz de leer cada columna que un filtro prueba: se elimina una condición en una columna que el usuario no puede leer.
<Timeline
viewIds={[myPhoneCallsViewId, myTasksViewId]}
filterByRecord={false}
customViewDefinitions={[
{
// Las llamadas con los contactos de la cuenta y las notas sobre la cuenta.
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 {
// Las llamadas con los contactos de la cuenta y las notas sobre la cuenta.
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>
""",
},
],
},
];
}Elige qué tablas están listadas, cuántos elementos añade cada página, si aparece el cuadro de búsqueda y qué tamaño crece la lista antes de que se desplace.
Nombre | Tipo | Default | Descripción |
|---|---|---|---|
AllowFiltering | bool | False | Cuando true, el menú Filtro ofrece los filtros de la vista para cambiar, como los de una cuadrícula does — una pestaña para cada tabla mostrada: condiciones en sus columnas, anidadas en grupos y relacionadas las tablas para filtrar, sobre las columnas y tablas que el usuario puede leer. Los cambios duran mientras el La línea de tiempo muestra la vista, y un usuario que guarda las vistas puede conservarlas como una vista propia. No ofrecía una vista de varias tablas guardadas en Dataverse, que el servidor lee por su ID. Por defecto es false: el usuario puede eliminar todos los filtros que tenga la vista, que un La vista destinada a estrechar las filas de una página puede que no quiera. |
AllowSavedViews | bool | False | Permite a los usuarios que inician sesión guardar las tablas que muestra la línea de tiempo como vistas propias, ofrecidas en la Selector de vistas junto a las páginas, elige su vista predeterminada y oculta las vistas que no usan. Se ofrece una vista guardada en una línea de tiempo o un calendario sin Timeline.SavedViewsKey ninguna en ambas. Apagado por defecto. Necesita las tablas multi-tabla de la solución Power Portals Pro Core; una el usuario también necesita el rol de seguridad |
AllowSearch | bool | True | Muestra un cuadro de búsqueda sobre las columnas de búsqueda de las filas, lo que también tarda un día o un año — con true. |
Ascending | bool | False | Lista primero las filas más antiguas, a partir de ahora. Por defecto es false: más nuevo primero, desde ahora atrás. |
ChildContent | RenderFragment? | Las plantillas y formularios de la página para sus tablas: MultiTableTemplate y MultiTableForm. | |
CreatableTables | IEnumerable<string>? | Las tablas que un usuario puede escribir una nueva fila desde la línea de tiempo, aquellas que puede crear. Por defecto a notas y comunicaciones por portales, que necesitan el registro de la línea temporal. | |
CustomViewDefinitions | List<MultiTableViewDefinition>? | Vistas definidas en código, listadas al final: cada una muestra filas de una o más tablas. | |
DefaultTables | IEnumerable<string>? | Las tablas que se muestran al principio, cuando la línea temporal muestra cada tabla — sin vista propia: las demás El usuario puede leer se ofrece en el menú de la tabla, desactivado. Valores predeterminados para notas, correos electrónicos y Comunicaciones por portales. Sin ninguna de ellas para mostrar, todas las mesas lo hacen. | |
DefaultViewId | Guid? | La vista mostrada primero. No colocada, o no entre las vistas, es la primera. | |
FilterByRecord | bool | True | Muestra solo las filas alrededor del registro de la forma circundante, cuando Timeline.Regarding No nombra a ninguno. Ponlo para false una línea temporal cuyas opiniones deciden por sí mismas qué filas se muestran, dondequiera que se coloque. Por defecto se muestra true. |
FormLocation | TimelineFormLocation | Right | Donde se abre la forma de una fila, para crearla o cambiarla: un panel lateral a la derecha o a la izquierda, un diálogo en el centro, o en el lugar de la línea de tiempo, mientras se escriben notas y mensajes. Notas y Los mensajes sin forma de las páginas se escriben en su lugar donde se abren los formularios. Por defecto TimelineFormLocation.Right. |
MatchParties | bool? | Ya sea que participe el registro en actividades — como remitente, destinatario o asistente — muéstrese al lado Esos que lo rodean. Descolocado, la configuración de cada mesa, si no, la del servidor. | |
MaxHeight | string? | La lista de elementos más alta crece, como longitud CSS ( | |
MultiTableViewIds | IEnumerable<Guid>? | Vistas de varias tablas para elegir, por id: registrado en Timeline.ViewIdsde . | |
PageSize | int | 10 | Cuántos elementos se muestran al principio y se añaden cada uno 'Cargar más'. Por defecto es 10. |
Record | TableRecord? | El registro cuya línea temporal es esta en cascada, en cascada por la forma circundante. | |
Regarding | TableRecordReference? | El registro cuyas filas muestran — las que lo rodean, y las actividades en las que participa. Unset, el registro de la forma circundante (véase Timeline.FilterByRecord); con ninguno, cada fila el Ver programas. | |
SavedViewsKey | string? | Nombra esta línea temporal entre las líneas temporales, así que las vistas guardadas en ella y las predeterminadas del usuario y Las vistas ocultas son propias. Sin una, comparte sus vistas con cada línea temporal y calendario que no tiene ninguna. Letras, dígitos, | |
Series | MultiTableSeries? | Cómo se muestran las citas recurrentes. Descolocado, la disposición de cada mesa. | |
ShowRecordLinks | bool | True | Si el título de un elemento enlaza con la página de su registro, registrado en true; una tabla sin página no muestra enlace. |
SignInUrl | string | Account/Login | Cuando un usuario que no está conectado es enviado a iniciar sesión, desde el menú de vistas guardadas, que pide Ellos a primero; vuelven a esta página. Por defecto se asigna |
Tables | IEnumerable<string>? | Las tablas que se muestran, por nombre lógico: cada una necesita registrarse en | |
Title | string? | El encabezado. Por defecto se indica el nombre de la vista, o 'Timeline'; un selector de vistas ocupa su lugar. | |
Upcoming | TimeSpan? | Lo lejos que empieza la línea temporal, así que lo que viene se ve por encima del resto por sí solo Encabezamiento: Dos días muestra primero las filas de los dos días siguientes. Sin ajuste, empieza ahora. | |
ViewIds | IEnumerable<Guid>? | Vistas de Dataverse para elegir, por id — 'Mis correos', 'Todas las actividades' — cada una una vista de una tabla registrada, o de | |
ViewSort | ViewSort | NameAscending | El orden de las vistas en el selector. Por defecto es ViewSort.NameAscending, como el de una cuadrícula y un calendario. |
AllowFilteringtrue, el menú Filtro ofrece los filtros de la vista para cambiar, como los de una cuadrícula does — una pestaña para cada tabla mostrada: condiciones en sus columnas, anidadas en grupos y relacionadas las tablas para filtrar, sobre las columnas y tablas que el usuario puede leer. Los cambios duran mientras el La línea de tiempo muestra la vista, y un usuario que guarda las vistas puede conservarlas como una vista propia. No ofrecía una vista de varias tablas guardadas en Dataverse, que el servidor lee por su ID. Por defecto es false: el usuario puede eliminar todos los filtros que tenga la vista, que un La vista destinada a estrechar las filas de una página puede que no quiera.AllowSavedViewsTimeline.SavedViewsKey ninguna en ambas. Apagado por defecto. Necesita las tablas multi-tabla de la solución Power Portals Pro Core; una el usuario también necesita el rol de seguridad AllowSearchtrue.Ascendingfalse: más nuevo primero, desde ahora atrás.ChildContentMultiTableTemplate y MultiTableForm.CreatableTablesCustomViewDefinitionsDefaultTablesDefaultViewIdFilterByRecordTimeline.Regarding No nombra a ninguno. Ponlo para false una línea temporal cuyas opiniones deciden por sí mismas qué filas se muestran, dondequiera que se coloque. Por defecto se muestra true.FormLocationTimelineFormLocation.Right.MatchPartiesMaxHeightMultiTableViewIdsTimeline.ViewIdsde .PageSizeRecordRegardingTimeline.FilterByRecord); con ninguno, cada fila el Ver programas.SavedViewsKeySeriesShowRecordLinkstrue; una tabla sin página no muestra enlace.SignInUrlTablesTitleUpcomingViewIdsViewSortViewSort.NameAscending, como el de una cuadrícula y un calendario.