[PowerBi][UX] Una Medida para formato y navegación de botón

Hace tiempo que los bookmarks, botones y navegaciones se volvieron uno con Power Bi ayudando a dar una mejor experiencia de usuario. A quienes usan Power Bi les encantan los botones y la sensación de un sistema o app programada que deja el tablero.

Luego de usarlos varias veces tanto para navegación como para formato, he notado que se podrían reaprovechar las medidas de navegación por página junto con la de formatear un botón. Éste artículo nos mostrará dos formas de configurar con una sola medida dos comportamientos tanto de navegación entre páginas como de "deshabilitar" un botón.

Luego de trabajar bastante con botones uno comienza notar ciertos detalles puntuales. En este caso vamos a hablar de la navegación entre páginas y formato de un botón. Para aquellos que no sabían, Power Bi nos permite usar medidas como funciones en distintas opciones de formato. Entre ellas vamos a ver que podemos navegar entre páginas colocando como acción de un botón "Page Navigation" una medida que devuelva el texto de nombre exacto de la página. Las medidas tambien nos permiten jugar con los colores. El resultado de una medida tanto numerico como de texto puede ayudarnos a determinar reglas de colores para los estados de los botones (default, on hover, click).

Lo que suele ocurrir es que al trabajar con colores elegimos retornos tipo entero para hacer reglas de color o hexadecimales directamente para pintarlos como texto. Cuando queremos navegar necesitamos el texto de la página. Lo que vamos a ver a continuación es como combinar esa medida para un resultado binario (dos opciones). En nuestro caso queremos pintar un botón como "deshabilitado" y que al mismo tiempo no pueda navegar con una sola medida.

NOTA: El siguiente ejemplo será una mera prueba de la funcionalidad, no necesariamente da un sentido estratégico comercial.

Ejemplo: nuestra informe contiene un analisis de productos segun una especifica categoría. Entonces para poder analizarlo mejor sin errores, es necesario que solo 1 categoría este seleccionada al momento de navegar (el filtro esta sincronizado en ambas páginas pero solo en una visible)

Veamos nuestro menú:

image

El comportamiento es simple. Si seleccionamos la categoría "Home Appliences" se habilitará "View Home Sales Analysis", pero si esta seleccionada otra cualquiera, permanecera "View Product Sales Analysis". Vamos a suponer que esa categoría es tan grande y diferente que resulta dirruptiva para nuestro analisis normal y necesita medidas especiales junto a una página propia.

Método sin mensaje

Para controlar la navegación normalmente haríamos algo así:

Format Navigation Home =
VAR __selectedCategory = SELECTEDVALUE(ProductCategory[Category])
RETURN
IF (
   __selectedCategory = "Home Appliances",
   "HomeSalesAnalisis"
   , BLANK()
)

Determinamos el valor seleccionado y la respuesta en caso que tengamos la selección deseada será el texto del nombre de la página.Normalmente luego procederíamos a crear otra medida para pintar el botón, pero no. Veamos lo siguiente:

La nueva versión de Power Bi Desktop será capaz de reconcoer el tipo de datos que devuelve una medida. No como antes que categorizaba. Esa medida solo devolverá texto y no podemos cambiarlo. Lo cual significa que la medida no podría usarse dentro de las "Reglas" de formato condicional. Lo que nosotros haremos será manipular la medida para engañar a Power Bi y que piense que puede devolver número para así permitirnos pintar nuestra medida cuando el resultado sea blanco para poder usarla tanto de navegación como de formato. Veamos como quedaría:

Format Navigation Home =
VAR __selectedCategory = SELECTEDVALUE(ProductCategory[Category])
RETURN
IF ( 1 = 1,
   IF (
       __selectedCategory = "Home Appliances",
       "HomeSalesAnalisis"
       , BLANK()
   ), 1
)

Creando una condición IMPOSIBLE que devuelva falso, vamos a hacer que el falso retorne número y engañar al motor. Así nos permitirá definir que la medida es un número.

image

Ahora podremos determinar una función para nuestro formato condicional:

image

Las Rules del formato solo son aplicables a valores numéricos. Por esta razón tuvimos que engañar al motor para efectuar nuestro proceso. Lo irónico es que existe una condición que podría aplicarse contra texto que es "Is Blank". Vamos a nutrirnos de ella para controlar si el resultado no es correcto y así pintar el botón como deshabilitado. 

Para lograr la navegación. Ahora vamos a volver a cambiar nuestra medida. Esta vez por tipo Texto con el código original. Quedando así:

image

Ahora configuremos la navegación:

image

Finalmente el proceso de nuestro botón estaría completo. Pintado cuando esta deshabilitado y no efectuando ninguna acción pero al seleccionar Home Appliences se activa y permite navegar. Veamos en acción:

image

Método con mensaje

Para el otro botón que estaría prendido para todos menos para Home Appliances vamos a efectuar un método ligeramente diferente que no necesita cambios de tipo pero en lugar de no realizar una acción cuando está deshabilitado, va a devolver un popup de error. Esto puede resultar atractivo para algunos desde el punto de vista de experiencia y negativo para otros. Lo cierto es que resulta más simple la solución. Para no cambiar el tipo y que ambos sean texto, necesitamos el código de color porque es la única forma que un texto sea válido para formato condicional. Veamos el método para el otro botón:

Format Navigation =
VAR __selectedCategory = SELECTEDVALUE(ProductCategory[Category])
RETURN
   IF (
       __selectedCategory <> "Home Appliances",
       "ProductSalesAnalisis"
       , "#808080"
   )

Dado que antes el resultado blanco nos ayudaba a pintar, podríamos directamente poner el código del color gris deseado. El modo en que PowerBi lee texto para pintar colores es simple, si tiene rgb o hexa lo interpreta y sino falla y no pinta.

image

Lo mismo ocurrirá al navegar, si es true navegará a la página ProductSalesAnalisis y el false irá a un texto de una página que no existe. 

image

La diferencia con la anterior es que navegar a BLANK() el motor no hace nada, pero navegar a un texto que no es página producirá un mensaje de error:

image

Veamos la segunda opción en acción:

image

Llegamos al final del post y pudimos ver dos formas para usar una sola medida y controlar el formato condicional de colores de un botón según la acción como así también la navegación de la página.

Espero que esto los ayude a controlar la navegación de sus páginas reutilizando medidas para sustentar un modelo más sencillo. Como siempre pueden encontrar este desarrollo en mi github.