UNPKG

wx-svelte-gantt

Version:

Interactive and customizable Gantt chart component written in Svelte

74 lines (67 loc) 1.43 kB
class ScreenKeys { constructor() { this.store = new Map(); } limit(check) { this._scope = check; } isActive() { return !this._scope || this._scope(); } add(key, handler) { this.store.set(key.toLowerCase().replace(/[ ]/g, ""), handler); } } const chain = []; export const hotkeys = { subscribe: v => { init_once(); const t = new ScreenKeys(); chain.push(t); v(t); return () => { const ind = chain.findIndex(a => a === t); if (ind >= 0) chain.splice(ind, 1); }; }, }; var ready = false; function init_once() { if (ready) return; ready = true; document.addEventListener("keydown", ev => { if ( chain.length && (ev.ctrlKey || ev.altKey || ev.metaKey || ev.shiftKey || ev.key.length > 1 || ev.key === " ") ) { const code = []; if (ev.ctrlKey) code.push("ctrl"); if (ev.altKey) code.push("alt"); if (ev.metaKey) code.push("meta"); if (ev.shiftKey) code.push("shift"); let evKey = ev.key.toLocaleLowerCase(); if (ev.key === " ") { evKey = "space"; } code.push(evKey); const key = code.join("+"); for (let i = chain.length - 1; i >= 0; i--) { const t = chain[i]; const h = t.store.get(key) || t.store.get(evKey); const tagName = ev.target.tagName; if (h && tagName !== "INPUT" && tagName !== "TEXTAREA") { if (t.isActive()) { h(ev); ev.preventDefault(); return; } } } } }); }