Files
redash/client/app/services/KeyboardShortcuts.js
Gabriel Dutra 99c276fc9a Migrate Query pages to React (#4429)
* Migrate Query Source View page to React: skeleton

* Sync QueryView and QuerySource (#4430)

* Migrate schema browser to react (#4432)

* Restyle code with Prettier

* Migrate Query page to React: Save changes (#4452)

* Migrate query source to React: Set of updates (#4457)

* Migrate Query page to React: Visualization Tabs (#4453)

Co-Authored-By: Levko Kravets <levko.ne@gmail.com>

* Migrate Query Source page to React: Visualizations area (#4463)

* Migrate Query page to React: Delete visualization button (#4461)

* Migrate Query Source page to React: Visualization actions (#4467)

* Migrate Query pages to React: Execute query hook (#4470)

* Migrate Query Source page to React: Editor area (#4468)

* Migrate Query Source page to React: metadata, schedule and description blocks (#4476)

* Migrate Query page to React: Cancel query execution (#4496)

* Migrate Query Source page to React: refine code (#4499)

* Migrate Query Source page to React: alerts (#4504)

* Migrate Query Source page to React: unsaved changes alert (#4505)

* Migrate Query Source to React: resizable areas (v2) (#4503)

* Migrate Query page to React: Query View (#4455)

Co-authored-by: Levko Kravets <levko.ne@gmail.com>

* Switch React and Angular versions of pages (until Angular version removed)

* Migrate Query pages to React: fix permissions (#4506)

* Migrate Query Source page to React: don't reload when saving new query (#4507)

* Migrate Query pages to React: fix tests (#4509)

* Use skipParametersDirtyFlag in executeQuery

* Fix: cannot fork query from Query View page

* Optimize query editor: handle query text changes faster

* Revert "Optimize query editor: handle query text changes faster"

This reverts commit 2934e53be6.

* Reduce debounced time to 100

* Migrate Query pages to React: cleanup (#4512)

* Migrate Query pages to React: cleanup

* Further cleanup

* Remove unused dependencies

* Fix embed pages

* Attempt to fix flaky test

* Cleanup: explicitly register the last Angular component

* Move contents of /filters folder to /lib

* Remove unnecessary import

* Remove cy.wait from Parameters spec

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

Co-authored-by: Levko Kravets <levko.ne@gmail.com>
2020-01-06 20:51:45 +02:00

64 lines
1.6 KiB
JavaScript

import { each, filter, map, toLower, toString, trim, upperFirst, without } from "lodash";
import Mousetrap from "mousetrap";
import "mousetrap/plugins/global-bind/mousetrap-global-bind";
const modKey = /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? "Cmd" : "Ctrl";
export function humanReadableShortcut(shortcut, limit = Infinity) {
const modifiers = {
mod: upperFirst(modKey),
};
shortcut = toLower(toString(shortcut));
shortcut = filter(map(shortcut.split(","), trim), s => s !== "").slice(0, limit);
shortcut = map(shortcut, sc => {
sc = filter(map(sc.split("+")), s => s !== "");
return map(sc, s => modifiers[s] || upperFirst(s)).join(" + ");
}).join(", ");
return shortcut !== "" ? shortcut : null;
}
const handlers = {};
function onShortcut(event, shortcut) {
event.preventDefault();
event.retunValue = false;
each(handlers[shortcut], fn => fn());
}
const KeyboardShortcuts = {
modKey,
bind: keymap => {
each(keymap, (fn, key) => {
const keys = key
.toLowerCase()
.split(",")
.map(trim);
each(keys, k => {
handlers[k] = [...without(handlers[k], fn), fn];
Mousetrap.bindGlobal(k, onShortcut);
});
});
},
unbind: keymap => {
each(keymap, (fn, key) => {
const keys = key
.toLowerCase()
.split(",")
.map(trim);
each(keys, k => {
handlers[k] = without(handlers[k], fn);
if (handlers[k].length === 0) {
handlers[k] = undefined;
Mousetrap.unbind(k);
}
});
});
},
};
export default KeyboardShortcuts;