Muestra Calendar citas en Dataverse como lo hace Outlook — y tareas, y cualquier otra tabla que registre el servidor — por día, semana laboral, semana o mes, o como lista de una semana. Su barra de herramientas se mueve entre rangos y distribuciones, un día ocupado se reduce a + más, y las citas al mismo tiempo se colocan una al lado de la otra. Lee las filas del rango en pantalla mientras te acercas a él, a través de la misma consulta y seguridad que una cuadrícula, y muestra sus días y horas en la zona horaria del usuario, ya que se muestra cada fecha en el portal. Viene como un paquete adicional en cada pila, dibujado en tu tema de Fluent UI.
<Calendar regarding={{ tableName: 'account', id: accountId }} /><Calendar Regarding="@(new TableRecordReference("account", accountId))" />Las citas sobre Schmeler and Sons, la cuenta que muestra la página Regarding de detalles de la cuenta. Mantiene el calendario a las citas aproximadamente un registro.
Sin Regarding, el calendario muestra cada fila que el usuario puede leer de las tablas que muestra. Lee las tablas que el servidor registra para los calendarios — notas y todas las tablas de actividades, y cualquier otra registrada — ForCalendars cada una fechada por su propia columna: una cita por su inicio y fin, una tarea, llamada telefónica, carta o fax por fecha límite. Las citas y tareas se muestran al principio; las otras que el usuario puede leer se ofrecen en el menú Mostrar de la barra de herramientas, desactivadas. DefaultTables (Reaccionar: defaultTables) elige las que se muestran al principio, y Tables (Reaccionar: tables) las que puede mostrar en absoluto. El calendario añade su rango y el registro correspondiente como condiciones propias, de modo que una vista puede acotar lo que muestra pero nunca ampliarlo.
<Calendar defaultTables={['appointment', 'task', 'phonecall']} /><Calendar DefaultTables="@(["appointment", "task", "phonecall"])" />El calendario solo lista las citas que el usuario puede leer y le permite mover una solo para que pueda cambiarla. Un portal suele dar a los contactos las citas a las que están invitados: RowsInvolvingContact y requiredattendees optionalattendees las lee a través de las listas de partidos de la cita, sin convertirlas en las propias del contacto.
// Los contactos leen las citas a las que son invitados, ya sean como asistentes obligatorios u opcionales.
builder.Services.AddTableAccess("appointment", t => t
.ForSignedInUsers()
.RowsInvolvingContact("requiredattendees", "optionalattendees")
.Allow(TableSecurityPermission.Read)
.ReadingAllColumns());
// Cada cita que el usuario puede leer llega al portal: ser invitado ya dice que es para ellos.
builder.Services.Configure<SecurityOptions>(options =>
options.PortalVisibility.UnfilteredActivities.Add("appointment"));
Como en otras actividades, una cita solo llega al portal cuando su descripción empieza por *WEB*, a menos que su tabla esté en SecurityOptions.PortalVisibility.UnfilteredActivities. Un portal de calendario añade appointment allí, como antes, por lo que el personal reserva citas en Dynamics y Outlook como siempre hace.
El usuario de la aplicación del portal también necesita leer sobre las citas en Dataverse. Dataverse concede a cada tipo de actividad un único conjunto de privilegios, por lo que las citas están cubiertas por las actividades de lectura que ya realiza el rol de Usuario de la Aplicación Power Portals Pro.
Una ocurrencia de una cita recurrente se muestra como cualquier otra, con el icono de repetir junto a su asunto. Al hacer clic uno se pregunta si abrir ese suceso o toda la serie; mover o redimensionar uno cambia solo ese suceso. El calendario muestra los sucesos que ha escrito Dataverse: Dataverse escribe los de una serie con antelación, en cuanto a la ventana de expansión del entorno — doce meses por defecto — y los posteriores conforme pasa el tiempo, así que una serie que nunca termina muestra un año de ocurrencias a la vez.
Una cita se dibuja según cómo muestra su hora, según Outlook la dibuja: ocupada como un tinte con una barra al lado, libre solo con la barra, tentativa a rayas y fuera de la oficina en morado, leída de su motivo de estado. Una cita completada aparece como ocupada, una cancelada como libre con su tema tachado. En un mes, donde una cita con una hora es un punto al lado, y en las filas de la agenda, solo aparece el color. Las citas que proporcionas toman ShowAs y Canceled (Reaccionar: showAs y canceled), y cada una se dibuja con una clase — ppp-calendar-appointment-free, -busy, -tentative, -out-of-office y -canceled — para reestilizarla.
En un Editable calendario que carga sus propias citas, seleccionar una hora abre una nueva cita sobre él, sobre el Regarding registro, y al hacer clic en una cita se abren sus datos como un formulario, guardado con la misma seguridad de tabla, fila y columna que cualquier registro. Mover o redimensionar una fila la guarda — su inicio, su final y si tarda días enteros — donde el usuario puede cambiar la fila y esas columnas y no está completada, cancelada o inactiva; una fila cuya tabla mantiene una fecha, como la fecha de entrega de una tarea, se mueve pero no se redimensiona, y otra fechada con fecha de creación permanece en su lugar. Al hacer clic en una fila de otra tabla se abre su formulario: las columnas que muestra su registro, o tu propio formulario para la tabla, dentro MultiTableForm del calendario (React: forms). Los detalles de una cita y el formulario de otra tabla se abren en un diálogo en el centro, o, con FormLocation (React: formLocation), en un panel lateral a la izquierda o derecha. Sus asistentes se editan con PartyListEdit, que ColumnEdit también usa para cada lista de partidos — entre ellos un correo electrónico Para, Desde y Copia de correos. A medida que el usuario escribe, sugiere los contactos, cuentas y usuarios que puede leer y enlazar (Leer y Añadir a) que tienen una dirección de correo electrónico, una tabla sin ambas nunca se ha buscado; elegir una la añade como un chip. Cuando el entorno permite mensajes a destinatarios de correo no resueltos — o AllowUnresolvedEmailAddresses lo dice — se añade una dirección de correo electrónico que no coincide con ningún registro por sí sola con Enter. El Respecto de una cita ofrece las tablas a las que puede señalar cuyos registros el usuario puede leer y enlazar; RegardingTables (Reaccionar: regardingTables) las reduce a los que nombras. Gestiona OnRangeSelect crear citas a tu manera, y SaveChange (Reaccionar: onAppointmentChange) para guardar movimientos a tu manera.
<Calendar regarding={account} editable regardingTables={['account', 'contact']} />
{/* Anywhere a party list is edited */}
<PartyListEdit columnName="to" allowUnresolvedEmailAddresses /><Calendar Regarding="@account"
Editable="true"
RegardingTables="@(["account", "contact"])" />
<!-- Anywhere a party list is edited -->
<PartyListEdit ColumnName="to" AllowUnresolvedEmailAddresses="true" />En un Editable calendario, el formulario de una cita ofrece Repetir: diario o entre semana, en días de la semana, mensual o anual — en la fecha o en el día laborable, como el segundo martes — cada cierto tiempo, y nunca termina después de varias veces o en una fecha. Dataverse establece los sucesos en la zona horaria del usuario, de modo que una reunión a las diez se mantiene en las diez a través de un cambio de reloj. Una serie se abre como una forma propia, donde se puede cambiar la forma en que se repite, y Eliminar de una ocurrencia ofrece eliminarla o eliminar toda la serie. Repetir se ofrece a usuarios que pueden crear recurringappointmentmaster registros — y, para una cita que ya existe, cambiarla y eliminarla, ya que se convierte en la serie. Concede la serie como concedes citas, y da al usuario de la aplicación del portal Lectura sobre Conexión en Dataverse: hacer una cita una serie lee sus conexiones, y Dataverse rechaza la partida guardada sin ella.
// Una serie es un registro de su propia tabla; sus ocurrencias son nombramientos.
builder.Services.AddTableAccess("recurringappointmentmaster", t => t
.ForSignedInUsers()
.RowsOwnedByContact("requiredattendees")
.Allow(TableSecurityPermission.Read | TableSecurityPermission.Create
| TableSecurityPermission.Write | TableSecurityPermission.Delete)
.ReadingAllColumns()
.WritingAllColumns());
builder.Services.Configure<SecurityOptions>(options =>
options.PortalVisibility.UnfilteredActivities.Add("recurringappointmentmaster"));
Una nueva cita, o un cambio en una, se convierte en una serie en la misma transacción que el resto de su partida: la partida envía una AddRecurrenceRequest junto a la de la cita, por lo que la cita nunca se guarda sin su serie, ni la serie sin ella. Dataverse crea la serie a partir de la cita, junto con sus asistentes, y elimina la cita. Una página que construye su propio formulario puede enviar la solicitud de la misma manera.
Una serie que ha comenzado cambia desde su siguiente ocurrencia, como en Outlook: Dataverse mantiene las ocurrencias que han terminado como una serie propia, compartiendo la serie groupid, para que permanezcan como ocurrieron. El recuento que termina una serie es de toda la serie — el portal la lee y guarda con las ocurrencias ya conservadas — y una serie sin ninguna que no quede por llegar ya no puede cambiarse. Cambiar Todo el día ajusta los horarios a él: encendido, los días completos en los que caen; apagado, a las nueve en punto en el primero de ellos durante media hora. Dataverse mantiene una cita de todo el día como día; el portal la muestra y guarda en el propio día del usuario, sea cual sea su zona horaria.
Pasar Appointments en su lugar, y el calendario muestra esos en lugar de leer Dataverse. Con Editable activado, las citas pueden moverse, redimensionarse y crearse seleccionando un rango: SaveChange (Reaccionar: onAppointmentChange) guarda un movimiento, y al devolver false vuelve a poner la cita; OnRangeSelect recibe un rango seleccionado y OnAppointmentClick una cita abierta.
<Calendar appointments={appointments}
editable
onAppointmentChange={saveMove}
onAppointmentClick={openAppointment} /><Calendar Appointments="appointments"
Editable="true"
SaveChange="SaveMoveAsync"
OnAppointmentClick="OpenAppointment" />Apoyar el puntero en una cita muestra su asunto, cuándo y dónde está, y al hacer clic en uno se abre un diálogo con sus detalles, leído desde Dataverse como una página de registro lee un registro — a través del mismo acceso a la tabla y seguridad de columnas — y se muestra en modo solo lectura. Maneja OnAppointmentClick (Reaccionar: onAppointmentClick) para hacer otra cosa con un clic, como abrir una página propia. Las filas del calendario, sus descripciones emergentes y el diálogo de detalles pueden dibujarse a tu manera: véase Renderizado Personalizado.
Pon tus propios controles en la barra de herramientas con ToolbarItems (React: los hijos del calendario), delante del cuadro de búsqueda, como están los botones de la barra de herramientas de una cuadrícula. A CalendarButton recibe el calendario al hacer clic: el periodo que muestra, el registro sobre el que se refiere, y RefreshAsync CreateAppointmentAsync (React: createAppointment y refresh). NewAppointmentCalendarButton inicia una nueva cita como lo hace seleccionar una hora — desde la siguiente media hora cuando el periodo mostrado se amplía hoy, y en caso contrario desde las 8:00 del primer día — y solo se muestra donde eso inicia algo: un Editable calendario cuyo host gestiona OnRangeSelect, o que carga sus propias citas para un usuario que pueda crearlas.
<Calendar regarding={account} editable>
<NewAppointmentCalendarButton />
{/* Tu propio botón, entregaba el calendario al pulsar */}
<CalendarButton
label="Export"
icon={<ArrowDownloadRegular />}
onClick={(calendar) => exportAsync(calendar.start, calendar.end)}
/>
</Calendar><Calendar Regarding="@account" Editable="true">
<ToolbarItems>
<NewAppointmentCalendarButton />
<!-- Tu propio botón, entregaba el calendario al pulsar -->
<CalendarButton Label="Export"
Icon="@(new Icons.Regular.Size20.ArrowDownload())"
OnClick="@((CalendarContext calendar) => ExportAsync(calendar.Start, calendar.End))" />
</ToolbarItems>
</Calendar>El calendario ordena sus citas por horas de un día, una semana laboral o una semana, como un mes de días o como lista de agendas, y su barra de herramientas tiene un selector para cambiar entre ellas. DefaultLayout (React: defaultLayout) es la que se abre en una semana a menos que elijas otra. Layouts (React: layouts) lo mantiene en las que nombras, listadas en tu orden: nombra una, y el selector va y el calendario permanece en ella. Cada diseño tiene su propia página: Día, Semana Laboral, Semana, Mes y Agenda.
<Calendar defaultLayout="month" layouts={['month', 'agenda']} /><Calendar DefaultLayout="CalendarLayout.Month"
Layouts="@([CalendarLayout.Month, CalendarLayout.Agenda])" />Ofrece vistas en ViewIds — vistas de Dataverse, cada una de su propia tabla — MultiTableViewIds, vistas de varias tablas registradas o AddMultiTableView mantenidas en Dataverse, y CustomViewDefinitions, vistas definidas en código, y la barra de herramientas tiene un selector para elegir lo que muestra el calendario. DefaultViewId es en el que se abre. El cuadro de búsqueda encuentra las columnas de búsqueda de cada tabla como lo hace la búsqueda de una cuadrícula. Desactivarlo con AllowSearch.
Con AllowFiltering, el menú de Filtro de la barra de herramientas ofrece filtros de Edición, que abren los filtros de las tablas mostradas, una pestaña para cada una en orden de nombre, cada cuadro de diálogo que abre el botón de Filtro de una cuadrícula: condiciones en las columnas de la tabla, anidadas en grupos, y tablas relacionadas para filtrar, sobre las columnas y tablas que el usuario puede leer. Las columnas de una pestaña se leen cuando se abre por primera vez. Los filtros sustituyen a los propios de la vista hasta que el usuario elige otra vista. Está desactivado por defecto, porque el usuario puede eliminar todos los filtros que tenga la vista.
Con AllowSavedViews (React: allowSavedViews), un usuario iniciado sesión puede guardar lo que muestra el calendario — la vista, su filtro, las tablas mostradas y el diseño — como una vista propia, elegir su vista predeterminada y ocultar las que no utilize desde el menú de Filtros de la barra de herramientas. También se ofrece una vista de las citas únicamente en las cuadrículas de citas, y una vista de varias tablas en las líneas de tiempo. Cómo se guardan, cambian y comparten las vistas está en la página de Vistas guardadas .
<Calendar viewIds={[allAppointmentsViewId, scheduledViewId]}
defaultViewId={allAppointmentsViewId}
customViewDefinitions={teamsMeetings}
allowFiltering
allowSavedViews /><Calendar ViewIds="@([allAppointmentsViewId, scheduledViewId])"
DefaultViewId="allAppointmentsViewId"
CustomViewDefinitions="teamsMeetings"
AllowFiltering="true"
AllowSavedViews="true" />Las reuniones, tareas y llamadas telefónicas de Schmeler and Sons, a través de dos vistas definidas en código: Reuniones y tareas, y Aún por hacer — las tareas y llamadas aún no terminadas, la consulta de cada mesa la suya. El menú de Filtros activa y desactiva cada tabla, los filtros de Editar tienen una pestaña para cada una, y un visitante iniciado sesión puede guardar lo que el calendario muestra como una vista propia. Una tarea o llamada se abre en un panel lateral a la derecha (FormLocation).
Nombra un parámetro de consulta en PersistedStateQueryParameter, y el calendario mantiene su disposición, el periodo que muestra y la vista de citas seleccionada ahí, así que una recarga o un enlace compartido lo abre donde se dejó. En qué se abriría de todos modos se omite — la fecha mientras que el periodo mostrado incluye hoy, así que un enlace a la semana actual sigue el día actual. La búsqueda también se mantiene cuando activas IncludeSearchInPersistedState; se omite por defecto, ya que lo que buscan los usuarios puede ser sensible. Cada cambio reemplaza la entrada de historial del navegador, así que Retroceder sale de la página en lugar de retroceder cada semana. Ambas pilas escriben el mismo valor, así que un enlace hecho en una abre el mismo calendario en la otra.
<Calendar defaultLayout="month" persistedStateQueryParameter="calendarState" /><Calendar DefaultLayout="CalendarLayout.Month" PersistedStateQueryParameter="calendarState" />Una vista definida en código mantiene el calendario en las reuniones celebradas en Teams, comenzando en la agenda de la semana, con una altura fija.
El calendario es un complemento: PowerPortalsPro.Web.Blazor.Calendar en Blazor y @powerportalspro/react-calendar en React. Añade el paquete junto al propio del framework para usarlo.
npm install @powerportalspro/react-calendardotnet add package PowerPortalsPro.Web.Blazor.CalendarNombre | Tipo | Default | Descripción |
|---|---|---|---|
AllowFiltering | bool | False | |
AllowSavedViews | bool | False | |
AllowSearch | bool | True | |
AppointmentDetails | RenderFragment? | ||
Appointments | IReadOnlyList<CalendarAppointment>? | ||
ChildContent | RenderFragment? | ||
CssClass | string? | ||
CustomViewDefinitions | List<MultiTableViewDefinition>? | ||
DefaultLayout | CalendarLayout | Week | |
DefaultTables | IEnumerable<string>? | ||
DefaultViewId | Guid? | ||
Editable | bool | False | |
FormLocation | DialogLocation | Center | |
Height | string | 600px | |
IncludeSearchInPersistedState | bool | False | |
Layouts | IReadOnlyList<CalendarLayout>? | ||
MatchParties | bool? | ||
MultiTableViewIds | IEnumerable<Guid>? | ||
PersistedStateQueryParameter | string? | ||
Regarding | TableRecordReference? | ||
RegardingTables | IReadOnlyList<string>? | ||
SaveChange | Func<CalendarAppointmentChange, Task<bool>>? | ||
SavedViewsKey | string? | ||
Series | MultiTableSeries? | ||
ShowRecordLinks | bool | True | |
SignInUrl | string | Account/Login | |
Tables | IEnumerable<string>? | ||
ToolbarItems | RenderFragment? | ||
TooltipTemplate | RenderFragment<CalendarAppointment>? | ||
ViewIds | IEnumerable<Guid>? | ||
ViewSort | ViewSort | NameAscending |
AllowFilteringAllowSavedViewsAllowSearchAppointmentDetailsAppointmentsChildContentCssClassCustomViewDefinitionsDefaultLayoutDefaultTablesDefaultViewIdEditableFormLocationHeightIncludeSearchInPersistedStateLayoutsMatchPartiesMultiTableViewIdsPersistedStateQueryParameterRegardingRegardingTablesSaveChangeSavedViewsKeySeriesShowRecordLinksSignInUrlTablesToolbarItemsTooltipTemplateViewIdsViewSortNombre | Tipo | Descripción |
|---|---|---|
OnAppointmentClick | EventCallback<string> | |
OnRangeSelect | EventCallback<CalendarRangeSelection> |
OnAppointmentClickOnRangeSelectNombre | Parámetros | Tipo | Descripción |
|---|---|---|---|
CreateAppointmentAsync | DateTimeOffset? start DateTimeOffset? end bool allDay | Task | |
LoadAppointmentsAsync | DateTimeOffset start DateTimeOffset end | Task<IReadOnlyList<CalendarAppointment>> | |
OnAppointmentChangeAsync | CalendarAppointmentChange change | Task<bool> | |
OnAppointmentClickAsync | string id string subject bool recurring string table | Task | |
OnRangeChanged | RangeChanged range | void | |
OnRangeSelectAsync | DateTimeOffset start DateTimeOffset end bool allDay | Task | |
RefreshAsync | Task | ||
RenderTooltip | string id | int |
CreateAppointmentAsyncLoadAppointmentsAsyncOnAppointmentChangeAsyncOnAppointmentClickAsyncOnRangeChangedOnRangeSelectAsyncRefreshAsyncRenderTooltip