Creación de un cuadro de diálogo para el objeto visual de Power BI
Al crear un objeto visual, hay ocasiones en las que resulta útil mostrar información adicional al cliente en una ventana independiente. Por ejemplo, puedes:
- Mostrar información adicional, por ejemplo, una nota de texto o un vídeo.
- Mostrar un cuadro de diálogo de entrada de datos, por ejemplo, un cuadro de diálogo de fecha.
Para estos fines, puede crear una ventana de diálogo emergente de objeto visual, denominada cuadro de diálogo, en este artículo.
Consideraciones sobre el cuadro de diálogo
Al crear un cuadro de diálogo para el objeto visual, tenga en cuenta lo siguiente:
- Durante el desarrollo, puede especificar el tamaño y la posición del cuadro de diálogo.
- Cuando se desencadena el cuadro de diálogo, el fondo del informe se muestra atenuado.
- El encabezado del cuadro de diálogo contendrá el icono del objeto visual y su nombre para mostrar como título.
- El cuadro de diálogo puede tener hasta tres botones de acción. Puede elegir qué botones mostrar de una selección determinada.
- El cuadro de diálogo usa un elemento
iframe
de HTML enriquecido. - Mientras se muestra el cuadro de diálogo, no se puede realizar ninguna acción en el informe hasta que se descarte.
- El código del cuadro de diálogo puede usar bibliotecas npm externas, igual que el objeto visual.
Importante
El cuadro de diálogo no se debe desencadenar de forma espontánea. Debe ser el resultado inmediato de una acción del usuario.
Diseño de un cuadro de diálogo para el objeto visual
Para configurar un cuadro de diálogo, debe agregar dos componentes al código:
- Archivo de implementación: un procedimiento recomendado consiste en crear un archivo de implementación para cada cuadro de diálogo.
- Código para invocar el cuadro de diálogo: a fin de invocar el cuadro de diálogo, agregue código al archivo
visual.ts
.
Creación del archivo de implementación del cuadro de diálogo
Se recomienda crear un archivo de implementación para cada cuadro de diálogo que se genere. Coloque los archivos del cuadro de diálogo en la carpeta src
:
Cada archivo de implementación del cuadro de diálogo debe incluir los componentes siguientes:
Creación de una clase de cuadro de diálogo
Cree una clase de cuadro de diálogo para el mismo. El parámetro initialState
de openModalDialog
se pasa al contratista del cuadro de diálogo tras su creación. Use el objeto initialState
para pasar parámetros al cuadro de diálogo y, de este modo, que afecte a su comportamiento o apariencia.
El código del cuadro de diálogo puede usar estos métodos IDialogHost
:
IDialogHost.setResult(result:object)
: el código del cuadro de diálogo devuelve un objeto de resultado que volverá al objeto visual que realiza la llamada.IDialogHost.close(actionId: DialogAction, result?:object)
: el código del cuadro de diálogo puede cerrar dicho cuadro mediante programación y facilitar de vuelta un objeto de resultado al objeto visual que realiza la llamada.
Importa en la parte superior del archivo:
import powerbi from "powerbi-visuals-api";
import DialogConstructorOptions = powerbi.extensibility.visual.DialogConstructorOptions;
import DialogAction = powerbi.DialogAction;
// React imports as an example
import * as ReactDOM from 'react-dom';
import * as React from 'react';
import reactDatepicker from 'react-datepicker';
import 'react-datepicker/dist/react-datepicker.css';
Este ejemplo requiere instalar estos paquetes:
npm i react-dom react react-datepicker
Realización de clases:
export class DatePickerDialog {
static id = "DatePickerDialog";
constructor(options: DialogConstructorOptions, initialState: object) {
const host = options.host;
let pickedDate: Date;
const startDate = new Date(initialState['startDate']);
// Dialog rendering implementation
ReactDOM.render(
React.createElement(
reactDatepicker,
{
inline: true,
openToDate: startDate,
onChange: (date: Date) => {
pickedDate = date
host.setResult({ date: pickedDate })
}
},
null),
options.element
);
document.addEventListener('keydown', e => {
if (e.code == 'Enter' && pickedDate) {
host.close(DialogAction.Close, {date: pickedDate});
}
});
}
}
Creación de una clase de resultado
Cree una clase que devuelva el resultado del cuadro de diálogo y agréguelo al archivo de implementación del cuadro de diálogo.
En el ejemplo siguiente, la clase DatePickerDialogResult
devuelve una cadena de fecha.
export class DatePickerDialogResult {
date: string;
}
Incorporación del cuadro de diálogo a la lista del registro
Cada archivo de implementación del cuadro de diálogo debe incluir una referencia del registro. Agregue las dos líneas del ejemplo siguiente al final del archivo de implementación del cuadro de diálogo. La primera línea debe ser idéntica en cada archivo de implementación del cuadro de diálogo. En la segunda línea se muestra el cuadro de diálogo y se modifica según el nombre de la clase del cuadro de diálogo.
globalThis.dialogRegistry = globalThis.dialogRegistry || {};
globalThis.dialogRegistry[DatePickerDialog.id] = DatePickerDialog;
Invocación del cuadro de diálogo
Antes de crear un cuadro de diálogo, debe decidir qué botones incluirá. Los objetos visuales de Power BI admiten los seis botones de cuadro de diálogo siguientes:
export enum DialogAction {
Close = 0,
OK = 1,
Cancel = 2,
Continue = 3,
No = 4,
Yes = 5
}
Cada cuadro de diálogo que cree debe invocarse en el archivo visual.ts
. En este ejemplo, el cuadro de diálogo se define con dos botones de acción.
import powerbi from "powerbi-visuals-api";
import DialogAction = powerbi.DialogAction;
const dialogActionsButtons = [DialogAction.OK, DialogAction.Cancel];
En este ejemplo, el cuadro de diálogo se invoca haciendo clic en un botón visual. El botón del objeto visual se define como parte del constructor del objeto visual en el archivo visual.ts
.
Definición del tamaño y la posición del cuadro de diálogo
A partir de la versión 4.0 de la API, puede definir el tamaño y la posición del cuadro de diálogo con el parámetro DialogOpenOptions
de openModalDialog
. Para averiguar qué versión usa, compruebe apiVersion
en el archivo pbiviz.json.
export interface RectSize {
width: number;
height: number;
}
export interface DialogOpenOptions {
title: string;
size?: RectSize;
position?: VisualDialogPosition;
actionButtons: DialogAction[];
}
El parámetro position permite decidir dónde se debe abrir el cuadro de diálogo en la pantalla. Puede elegir abrir el cuadro de diálogo en el centro de la pantalla o puede definir una posición diferente con respecto al objeto visual.
const enum VisualDialogPositionType {
Center = 0,
RelativeToVisual = 1
}
export interface VisualDialogPosition {
type: VisualDialogPositionType;
left?: number;
top?: number;
}
- Si no se especifica ningún tipo, el comportamiento predeterminado es abrir el cuadro de diálogo en el centro.
- La posición se proporciona en píxeles con respecto a la esquina superior izquierda del objeto visual.
En este ejemplo se muestra un cuadro de diálogo de selección de fecha de 250 x 300 píxeles, a 100 píxeles a la izquierda y 30 píxeles por debajo de la parte superior del objeto visual:
export class Visual implements IVisual {
private target: HTMLElement;
private host: IVisualHost;
constructor(options: VisualConstructorOptions) {
this.host = options.host;
this.target = options.element;
const dialogActionsButtons = [DialogAction.OK, DialogAction.Cancel];
const sectionDiv = document.createElement("div");
const span = document.createElement("span");
span.id = "datePicker";
let button = document.createElement("button");
button.id = "DateButton";
button.innerText = "Date";
button.onclick = (event) => {
const initialDialogState = { startDate: new Date() };
const position = {
type: VisualDialogPositionType.RelativeToVisual,
left: 100,
top: 30
};
const size = {width: 250, height: 300};
const dialogOptions = {
actionButtons: dialogActionsButtons,
size: size,
position: position,
title: "Select a date"
};
this.host.openModalDialog(DatePickerDialog.id, dialogOptions, initialDialogState).
then(ret => this.handleDialogResult(ret, span)).
catch(error => this.handleDialogError(error, span));
}
sectionDiv.appendChild(button);
sectionDiv.appendChild(span);
this.target.appendChild(sectionDiv)
}
// Custom logic to handle dialog results
private handleDialogResult( result: ModalDialogResult, targetElement: HTMLElement){
if ( result.actionId === DialogAction.OK || result.actionId === DialogAction.Close) {
const resultState = <DatePickerDialogResult> result.resultState;
const selectedDate = new Date(resultState.date);
targetElement.textContent = selectedDate.toDateString();
}
}
// Custom logic to handle errors in dialog
private handleDialogError( error: any, targetElement: HTMLElement ) {
targetElement.textContent = "Error: " + JSON.stringify(error);
}
}
Procedimientos para cerrar el cuadro de diálogo
El método de preferencia para cerrar el cuadro de diálogo es que el usuario final haga clic en el botón [x], en uno de los botones de acción o en el fondo del informe.
También se puede programar el cuadro de diálogo para que se cierre automáticamente; para ello, llame al método de cierre IDialogHost
. Este método se bloquea durante cinco segundos después de abrir el cuadro de diálogo, de modo que lo más pronto que lo puede cerrar automáticamente es cinco segundos después de que se inicie.
No mostrar el cuadro de diálogo
El cuadro de diálogo aparece con una casilla que ofrece al usuario la opción de bloquear cuadros de diálogo.
Esta casilla es una característica de seguridad que impide que el objeto visual cree cuadros de diálogo modales (ya sea intencionadamente o no) sin el consentimiento del usuario.
Este bloqueo es efectivo solo en la sesión actual. De esta forma, si un usuario bloquea los diálogos modales de CV, pero más adelante cambia de opinión, puede volver a habilitar los diálogos. Para ello, debe iniciar una nueva sesión (actualizar la página de informes en servicio Power BI o reiniciar Power BI Desktop).
Consideraciones y limitaciones
A partir de powerbi-visuals-API 3.8, el icono y el título del cuadro de diálogo están determinados por el icono y el nombre para mostrar del objeto visual y no se pueden cambiar.
En la tabla siguiente se describen las limitaciones de tamaño del cuadro de diálogo.
Máx./mín. Ancho Alto Máximo 90 % del ancho del explorador 90 % del alto del explorador Mínima 240 px 210 px Al definir la posición del cuadro de diálogo, la posición horizontal puede ser un entero positivo o negativo, en función del lado del objeto visual en el que quiera colocar el cuadro. La posición vertical no puede ser negativa, ya que lo colocaría encima del objeto visual.
Las características siguientes no admiten el cuadro de diálogo de objetos visuales de Power BI:
- Análisis insertados
- Publicar en Web
- Paneles
Puede programar el objeto visual para detectar si el entorno actual permite abrir un cuadro de diálogo. Para ello, compruebe el valor booleano this.host.hostCapabilities.allowModalDialog
.