Teclas rápidas en Odoo

Shotcuts y quick keys para disparar funciones de Odoo

Ignacio Buioli
- 05/04/2019 - 2 min. de lectura

Odoo 12 trajo consigo la solución a un reclamo en gran parte de la comunidad: el uso de combinaciones de teclas rápidas para disparar los botones en las vistas de Odoo. De esta manera, pueden dispararse los botones de "Enviar presupuesto por Mail" en la vista Sale Order haciendo uso de una combinación con "ALT" más un número para los Menus superior y una letra para los menú internos. La interfaz es bella y sumamente intuitiva, pero ¿qué pasa con los usuarios que no tienen Odoo 12 (y como ya hemos comentado, no tienen intensiones de migrar)? Para esos casos tenemos un par de opciones.

Desde hace tiempo en Odoo (ya desde la versión 9) existen combinaciones de teclas para disparar las Action clásicas de odoo (crear, editar), pero no hay forma de acceder a los botones personalizados con action personalizadas. Por más que revisemos el Python y las Vistas XML para intentar generar una nueva combinación de teclas, la realidad es dura y Odoo no tiene nada para generar acciones relativas a una tecla. Por ende, la solución viene de la mano de comprender que Odoo es una interfaz web: JavaScript. Podemos aprovechar JavaScript (y jQuery de Odoo) para capturar una tecla, y a partir de ahí realizar operaciones. Esto no es tan raro y usando una función dentro de otra podemos hacer un shotcut o combinación entre dos teclas (para un cliente hemos utilizado la tecla F10, a pedido de ellos). Pero ¿cómo vamos a disparar una función de Odoo desde JavaScript? Ahí es donde la solución no es tan limpia.

Si bien es posible, para evitar problemas vamos a utilizar un selector de jQuery llamado ":contains()". Para buscar un botón haremos esto:

$("button:contains('Nombre del botón')");

Donde 'Nombre del botón' será el name que tenga el button, nada de action. Y lo que vamos a hacer es simular un clic:

$("button:contains('Nombre del botón')").click();

Por lo tanto, el "núcleo" de una solución no tan limpia pero funcional para disparar un botón de Odoo con una tecla (o shortcut) es el siguiente:

$(document).ready(function () {
        $(document).keydown(function(e) {
                if (e.keyCode == 121) {
                        if ($('button:contains("Calcular amortizacion e intereses")')) {
                                $('button:contains("Nombre del boton")').click();
                        }
                }
        });
});

En este caso, e.keyCode == 121 es la tecla F10, pero lo ideal sería utilizar una combinación de teclas, mediante el uso de dos funciones de detección de teclas. Independiente de esto y de lo poco elegante que pueda parecer, cumple su función y abre una enorme variante de opciones a la hora de desarrollar interfaces personalizadas en Odoo, inclusive modificaciones al POS.

No dejo de pensar en la posibilidad de replicar el comportamiento de Odoo 12 en versiones anteriores, después de todo un punto de partida puede ser obtener todos los botones, de la clase btn, pertenecientes al div de clase o_statusbar_buttons; y asignarles una tecla (que lo ideal sería se encuentre en un array, para evitar repeticiones) por cada botón. El primer "trigger" se produciría con la tecla ALT y el segundo con una tecla, que buscaría el botón asignado y simularía el click. Para reproducir con más fidelidad Odoo 12, un feature interesante es la superposición de la tecla sobre el botón. Esto puede hacerse aprovechando el primer trigger de la tecla ALT, superponiendo en posición absoluta un DIV que contenga la tecla. No sería algo complejo ni extraño, y aportaría el dato de que tecla hay que oprimir (igual que lo hace Odoo 12).

Por supuesto, es una idea que requiere su estudio y llevarla a la práctica, pero ¿quien sabe? A lo mejor preparemos un módulo si lo vemos necesario.

Acerca de:

Ignacio Buioli

Degree on Multimedia Arts. He has developed numerous Multimedia projects as well as written articles and translated texts of the mentioned subject. In Moldeo Interactive, He is a Partner and Programmer; also taking care of a large part of the online networks and courses.