diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 1f5e199d8..0da82721c 100644 Binary files a/netbox/project-static/dist/netbox.js and b/netbox/project-static/dist/netbox.js differ diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index 2d0c72c2d..18d8f7935 100644 Binary files a/netbox/project-static/dist/netbox.js.map and b/netbox/project-static/dist/netbox.js.map differ diff --git a/netbox/project-static/src/hotkeys.ts b/netbox/project-static/src/hotkeys.ts new file mode 100644 index 000000000..9764fba97 --- /dev/null +++ b/netbox/project-static/src/hotkeys.ts @@ -0,0 +1,28 @@ +const HOTKEYS: Record void> = { + '/': focusGlobalSearch, +}; + +function focusGlobalSearch(): void { + const searchInput = document.querySelector('header input[name="q"]')!; + searchInput.focus(); + console.debug('Focused global search input'); +} + +function handleKeydown(event: KeyboardEvent): void { + // Ignore hotkeys when focused on form elements or when modal is open + if ((event.target as Element).matches('input, textarea, select') || document.body.classList.contains('modal-open')) { + return; + } + + const handler = HOTKEYS[event.key]; + if (!handler) { + return; + } + + event.preventDefault(); + handler(); +} + +export function initHotkeys(): void { + document.addEventListener('keydown', handleKeydown); +} diff --git a/netbox/project-static/src/netbox.ts b/netbox/project-static/src/netbox.ts index ce0aad93f..68b77baee 100644 --- a/netbox/project-static/src/netbox.ts +++ b/netbox/project-static/src/netbox.ts @@ -14,6 +14,7 @@ import { initDashboard } from './dashboard'; import { initRackElevation } from './racks'; import { initHtmx } from './htmx'; import { initSavedFilterSelect } from './forms/savedFiltersSelect'; +import { initHotkeys } from './hotkeys'; function initDocument(): void { for (const init of [ @@ -33,6 +34,7 @@ function initDocument(): void { initRackElevation, initHtmx, initSavedFilterSelect, + initHotkeys, ]) { init(); }