Habilitar cambio de tabs remapeando teclado con ñ

espocrm

En teclados que están en español o que tienen ñ no es posible usar CTRL + \ para intercambiar entre tabs de un registro en EspoCRM.



El siguiente custom script habilita las combinaciones:

  • CTRL + ´: Salto entre tabs en vista detalle/edición de un registro.
  • CTRL + ñ: Ir a campo de búsqueda en vista lista de registros.

Implementación

  1. Crear o modificar custom/Espo/Custom/Resources/metadata/app/client.json y agregar el llamado al script custom:
JSON
"scriptList": [
        "__APPEND__",
        "client/custom/src/keyboard-es-fix.js"
    ]
  1. Crear /var/www/html/autofocus/client/custom/src/keyboard-es-fix.js
JAVASCRIPT
/**
 * keyboard-es-fix.js
 *
 * Fixes EspoCRM keyboard shortcuts for Spanish keyboard layouts.
 *
 * Root cause: EspoCRM's ShortcutManager uses e.code (physical key position on a
 * US ANSI keyboard) instead of e.key (the actual character produced). On Spanish
 * keyboards several characters occupy different physical keys, so the shortcuts
 * Ctrl+/ and Ctrl+\ never fire as EspoCRM expects.
 *
 * Strategy: map ergonomic Ctrl+{digit/key} combos directly to the target shortcut
 * using e.code, without requiring Shift. This keeps shortcuts to 2 keys.
 *
 * Por qué Ctrl+7 no funciona:
 *   Los browsers (Chrome, Firefox) interceptan Ctrl+1..8 para cambiar de
 *   pestaña del browser. El evento de teclado nunca llega al JavaScript.
 *
 * Remappings aplicados (teclado QWERTY español):
 *
 *   Ctrl + Ñ  →  foco barra de búsqueda   (Ñ tiene e.code='Semicolon')
 *   Ctrl + '  →  cambiar tab en detalle   (´ tiene e.code='Quote')
 *
 *   Estas combinaciones no las usa ningún browser ni EspoCRM → seguras.
 *
 * Shortcuts que ya funcionan en teclado español (no necesitan fix):
 *   Ctrl + ,   →  filtro anterior   (EspoCRM usa Comma, no '<')
 *   Ctrl + .   →  filtro siguiente  (EspoCRM usa Period, no '>')
 *   Ctrl + Enter, Space, S, flechas, Delete
 */
(function () {
    'use strict';

    if (typeof Espo === 'undefined' || typeof Espo.Utils === 'undefined') {
        return;
    }

    /**
     * Code-based remappings: Ctrl+{código físico} → shortcut EspoCRM.
     *
     * Usamos e.code (posición física) para evitar depender de qué carácter
     * produce la tecla con o sin Shift. Estas combinaciones no las usa
     * ningún browser ni el sistema operativo.
     *
     * Teclado QWERTY español:
     *   'Semicolon' = tecla Ñ       → reemplaza Ctrl+/ (foco búsqueda)
     *   'Quote'     = tecla ´ / '   → reemplaza Ctrl+\ (cambiar tab detalle)
     */
    const CODE_REMAPS = {
        'Semicolon': 'Slash',        // Ctrl+Ñ  → foco barra de búsqueda
        'Quote':     'Backslash',    // Ctrl+´   → cambiar tab en vista detalle
    };

    const originalFn = Espo.Utils.getKeyFromKeyEvent;
    const isMac = (typeof IS_MAC !== 'undefined') ? IS_MAC : false;

    Espo.Utils.getKeyFromKeyEvent = function (e) {
        const isCtrl = isMac ? e.metaKey : e.ctrlKey;

        if (isCtrl && !e.shiftKey && !e.altKey && CODE_REMAPS[e.code]) {
            return 'Control+' + CODE_REMAPS[e.code];
        }

        return originalFn.call(this, e);
    };

})();
  1. Limpiar caché y probar.