fix: Meta key shortcuts not bound correctly in Windows browsers (#1753)

This commit is contained in:
Tom Moor
2020-12-30 09:35:33 -08:00
committed by GitHub
parent 40bd9aed0a
commit 8dba32b5e0
10 changed files with 47 additions and 30 deletions

View File

@ -9,6 +9,7 @@ import ErrorBoundary from "components/ErrorBoundary";
import Tooltip from "components/Tooltip"; import Tooltip from "components/Tooltip";
import embeds from "../embeds"; import embeds from "../embeds";
import isInternalUrl from "utils/isInternalUrl"; import isInternalUrl from "utils/isInternalUrl";
import { isMetaKey } from "utils/keyboard";
import { uploadFile } from "utils/uploadFile"; import { uploadFile } from "utils/uploadFile";
const RichMarkdownEditor = React.lazy(() => import("rich-markdown-editor")); const RichMarkdownEditor = React.lazy(() => import("rich-markdown-editor"));
@ -49,7 +50,7 @@ function Editor(props: PropsWithRef) {
return; return;
} }
if (isInternalUrl(href) && !event.metaKey && !event.shiftKey) { if (isInternalUrl(href) && !isMetaKey(event) && !event.shiftKey) {
// relative // relative
let navigateTo = href; let navigateTo = href;

View File

@ -9,6 +9,7 @@ import { withRouter, type RouterHistory } from "react-router-dom";
import styled, { withTheme } from "styled-components"; import styled, { withTheme } from "styled-components";
import Input from "./Input"; import Input from "./Input";
import { type Theme } from "types"; import { type Theme } from "types";
import { meta } from "utils/keyboard";
import { searchUrl } from "utils/routeHelpers"; import { searchUrl } from "utils/routeHelpers";
type Props = { type Props = {
@ -25,7 +26,7 @@ class InputSearch extends React.Component<Props> {
input: ?Input; input: ?Input;
@observable focused: boolean = false; @observable focused: boolean = false;
@keydown("meta+f") @keydown(`${meta}+f`)
focus(ev: SyntheticEvent<>) { focus(ev: SyntheticEvent<>) {
ev.preventDefault(); ev.preventDefault();

View File

@ -22,6 +22,7 @@ import Modal from "components/Modal";
import Sidebar from "components/Sidebar"; import Sidebar from "components/Sidebar";
import SettingsSidebar from "components/Sidebar/Settings"; import SettingsSidebar from "components/Sidebar/Settings";
import { type Theme } from "types"; import { type Theme } from "types";
import { meta } from "utils/keyboard";
import { import {
homeUrl, homeUrl,
searchUrl, searchUrl,
@ -65,7 +66,7 @@ class Layout extends React.Component<Props> {
window.document.body.style.background = props.theme.background; window.document.body.style.background = props.theme.background;
} }
@keydown("meta+.") @keydown(`${meta}+.`)
handleToggleSidebar() { handleToggleSidebar() {
this.props.ui.toggleCollapsedSidebar(); this.props.ui.toggleCollapsedSidebar();
} }
@ -80,7 +81,7 @@ class Layout extends React.Component<Props> {
this.keyboardShortcutsOpen = false; this.keyboardShortcutsOpen = false;
}; };
@keydown(["t", "/", "meta+k"]) @keydown(["t", "/", `${meta}+k`])
goToSearch(ev: SyntheticEvent<>) { goToSearch(ev: SyntheticEvent<>) {
if (this.props.ui.editMode) return; if (this.props.ui.editMode) return;
ev.preventDefault(); ev.preventDefault();

View File

@ -33,6 +33,7 @@ import References from "./References";
import { type LocationWithState, type Theme } from "types"; import { type LocationWithState, type Theme } from "types";
import { isCustomDomain } from "utils/domains"; import { isCustomDomain } from "utils/domains";
import { emojiToUrl } from "utils/emoji"; import { emojiToUrl } from "utils/emoji";
import { meta } from "utils/keyboard";
import { import {
collectionUrl, collectionUrl,
documentMoveUrl, documentMoveUrl,
@ -163,7 +164,7 @@ class DocumentScene extends React.Component<Props> {
} }
} }
@keydown("meta+shift+p") @keydown(`${meta}+shift+p`)
onPublish(ev) { onPublish(ev) {
ev.preventDefault(); ev.preventDefault();
const { document } = this.props; const { document } = this.props;
@ -171,7 +172,7 @@ class DocumentScene extends React.Component<Props> {
this.onSave({ publish: true, done: true }); this.onSave({ publish: true, done: true });
} }
@keydown("meta+ctrl+h") @keydown(`${meta}+ctrl+h`)
onToggleTableOfContents(ev) { onToggleTableOfContents(ev) {
if (!this.props.readOnly) return; if (!this.props.readOnly) return;

View File

@ -12,6 +12,7 @@ import DocumentMetaWithViews from "components/DocumentMetaWithViews";
import Editor from "components/Editor"; import Editor from "components/Editor";
import Flex from "components/Flex"; import Flex from "components/Flex";
import HoverPreview from "components/HoverPreview"; import HoverPreview from "components/HoverPreview";
import { isMetaKey } from "utils/keyboard";
import { documentHistoryUrl } from "utils/routeHelpers"; import { documentHistoryUrl } from "utils/routeHelpers";
type Props = { type Props = {
@ -53,7 +54,7 @@ class DocumentEditor extends React.Component<Props> {
handleTitleKeyDown = (event: SyntheticKeyboardEvent<>) => { handleTitleKeyDown = (event: SyntheticKeyboardEvent<>) => {
if (event.key === "Enter") { if (event.key === "Enter") {
event.preventDefault(); event.preventDefault();
if (event.metaKey) { if (isMetaKey(event)) {
this.props.onSave({ done: true }); this.props.onSave({ done: true });
return; return;
} }
@ -67,12 +68,12 @@ class DocumentEditor extends React.Component<Props> {
this.focusAtStart(); this.focusAtStart();
return; return;
} }
if (event.key === "p" && event.metaKey && event.shiftKey) { if (event.key === "p" && isMetaKey(event) && event.shiftKey) {
event.preventDefault(); event.preventDefault();
this.props.onSave({ publish: true, done: true }); this.props.onSave({ publish: true, done: true });
return; return;
} }
if (event.key === "s" && event.metaKey) { if (event.key === "s" && isMetaKey(event)) {
event.preventDefault(); event.preventDefault();
this.props.onSave({}); this.props.onSave({});
return; return;

View File

@ -34,7 +34,7 @@ import Tooltip from "components/Tooltip";
import DocumentMenu from "menus/DocumentMenu"; import DocumentMenu from "menus/DocumentMenu";
import NewChildDocumentMenu from "menus/NewChildDocumentMenu"; import NewChildDocumentMenu from "menus/NewChildDocumentMenu";
import TemplatesMenu from "menus/TemplatesMenu"; import TemplatesMenu from "menus/TemplatesMenu";
import { meta } from "utils/keyboard"; import { metaDisplay } from "utils/keyboard";
import { newDocumentUrl, editDocumentUrl } from "utils/routeHelpers"; import { newDocumentUrl, editDocumentUrl } from "utils/routeHelpers";
type Props = { type Props = {
@ -172,7 +172,7 @@ class Header extends React.Component<Props> {
tooltip={ tooltip={
ui.tocVisible ? t("Hide contents") : t("Show contents") ui.tocVisible ? t("Hide contents") : t("Show contents")
} }
shortcut={`ctrl+${meta}+h`} shortcut={`ctrl+${metaDisplay}+h`}
delay={250} delay={250}
placement="bottom" placement="bottom"
> >
@ -250,7 +250,7 @@ class Header extends React.Component<Props> {
<Action> <Action>
<Tooltip <Tooltip
tooltip={t("Save")} tooltip={t("Save")}
shortcut={`${meta}+enter`} shortcut={`${metaDisplay}+enter`}
delay={500} delay={500}
placement="bottom" placement="bottom"
> >
@ -321,7 +321,7 @@ class Header extends React.Component<Props> {
<Action> <Action>
<Tooltip <Tooltip
tooltip={t("Publish")} tooltip={t("Publish")}
shortcut={`${meta}+shift+p`} shortcut={`${metaDisplay}+shift+p`}
delay={500} delay={500}
placement="bottom" placement="bottom"
> >

View File

@ -5,7 +5,7 @@ import styled from "styled-components";
import Flex from "components/Flex"; import Flex from "components/Flex";
import HelpText from "components/HelpText"; import HelpText from "components/HelpText";
import Key from "components/Key"; import Key from "components/Key";
import { meta } from "utils/keyboard"; import { metaDisplay } from "utils/keyboard";
function KeyboardShortcuts() { function KeyboardShortcuts() {
const { t } = useTranslation(); const { t } = useTranslation();
@ -41,9 +41,13 @@ function KeyboardShortcuts() {
</Keys> </Keys>
<Label>{t("Jump to dashboard")}</Label> <Label>{t("Jump to dashboard")}</Label>
<Keys> <Keys>
<Key>{meta}</Key> + <Key>Ctrl</Key> + <Key>h</Key> <Key>{metaDisplay}</Key> + <Key>Ctrl</Key> + <Key>h</Key>
</Keys> </Keys>
<Label>{t("Table of contents")}</Label> <Label>{t("Table of contents")}</Label>
<Keys>
<Key>{metaDisplay}</Key> + <Key>.</Key>
</Keys>
<Label>{t("Toggle sidebar")}</Label>
<Keys> <Keys>
<Key>?</Key> <Key>?</Key>
</Keys> </Keys>
@ -53,47 +57,47 @@ function KeyboardShortcuts() {
<h2>{t("Editor")}</h2> <h2>{t("Editor")}</h2>
<List> <List>
<Keys> <Keys>
<Key>{meta}</Key> + <Key>Enter</Key> <Key>{metaDisplay}</Key> + <Key>Enter</Key>
</Keys> </Keys>
<Label>{t("Save and exit document edit mode")}</Label> <Label>{t("Save and exit document edit mode")}</Label>
<Keys> <Keys>
<Key>{meta}</Key> + <Key>Shift</Key> + <Key>p</Key> <Key>{metaDisplay}</Key> + <Key>Shift</Key> + <Key>p</Key>
</Keys> </Keys>
<Label>{t("Publish and exit document edit mode")}</Label> <Label>{t("Publish and exit document edit mode")}</Label>
<Keys> <Keys>
<Key>{meta}</Key> + <Key>s</Key> <Key>{metaDisplay}</Key> + <Key>s</Key>
</Keys> </Keys>
<Label>{t("Save document and continue editing")}</Label> <Label>{t("Save document and continue editing")}</Label>
<Keys> <Keys>
<Key>{meta}</Key> + <Key>Esc</Key> <Key>{metaDisplay}</Key> + <Key>Esc</Key>
</Keys> </Keys>
<Label>{t("Cancel editing")}</Label> <Label>{t("Cancel editing")}</Label>
<Keys> <Keys>
<Key>{meta}</Key> + <Key>b</Key> <Key>{metaDisplay}</Key> + <Key>b</Key>
</Keys> </Keys>
<Label>{t("Bold")}</Label> <Label>{t("Bold")}</Label>
<Keys> <Keys>
<Key>{meta}</Key> + <Key>i</Key> <Key>{metaDisplay}</Key> + <Key>i</Key>
</Keys> </Keys>
<Label>{t("Italic")}</Label> <Label>{t("Italic")}</Label>
<Keys> <Keys>
<Key>{meta}</Key> + <Key>u</Key> <Key>{metaDisplay}</Key> + <Key>u</Key>
</Keys> </Keys>
<Label>{t("Underline")}</Label> <Label>{t("Underline")}</Label>
<Keys> <Keys>
<Key>{meta}</Key> + <Key>d</Key> <Key>{metaDisplay}</Key> + <Key>d</Key>
</Keys> </Keys>
<Label>{t("Strikethrough")}</Label> <Label>{t("Strikethrough")}</Label>
<Keys> <Keys>
<Key>{meta}</Key> + <Key>k</Key> <Key>{metaDisplay}</Key> + <Key>k</Key>
</Keys> </Keys>
<Label>{t("Link")}</Label> <Label>{t("Link")}</Label>
<Keys> <Keys>
<Key>{meta}</Key> + <Key>z</Key> <Key>{metaDisplay}</Key> + <Key>z</Key>
</Keys> </Keys>
<Label>{t("Undo")}</Label> <Label>{t("Undo")}</Label>
<Keys> <Keys>
<Key>{meta}</Key> + <Key>Shift</Key> + <Key>z</Key> <Key>{metaDisplay}</Key> + <Key>Shift</Key> + <Key>z</Key>
</Keys> </Keys>
<Label>{t("Redo")}</Label> <Label>{t("Redo")}</Label>
</List> </List>

View File

@ -35,7 +35,7 @@ import StatusFilter from "./components/StatusFilter";
import UserFilter from "./components/UserFilter"; import UserFilter from "./components/UserFilter";
import NewDocumentMenu from "menus/NewDocumentMenu"; import NewDocumentMenu from "menus/NewDocumentMenu";
import { type LocationWithState } from "types"; import { type LocationWithState } from "types";
import { meta } from "utils/keyboard"; import { metaDisplay } from "utils/keyboard";
import { newDocumentUrl, searchUrl } from "utils/routeHelpers"; import { newDocumentUrl, searchUrl } from "utils/routeHelpers";
type Props = { type Props = {
@ -279,8 +279,8 @@ class Search extends React.Component<Props> {
<Fade> <Fade>
<HelpText small> <HelpText small>
<Trans> <Trans>
Use the <strong>{{ meta }}+K</strong> shortcut to search from Use the <strong>{{ meta: metaDisplay }}+K</strong> shortcut to
anywhere in your knowledge base search from anywhere in your knowledge base
</Trans> </Trans>
</HelpText> </HelpText>
</Fade> </Fade>

View File

@ -1,3 +1,10 @@
// @flow // @flow
const isMac = window.navigator.platform === "MacIntel";
export const meta = window.navigator.platform === "MacIntel" ? "⌘" : "Ctrl"; export const metaDisplay = isMac ? "⌘" : "Ctrl";
export const meta = isMac ? "cmd" : "ctrl";
export function isMetaKey(event: KeyboardEvent) {
return isMac ? event.metaKey : event.ctrlKey;
}

View File

@ -253,6 +253,7 @@
"Jump to search": "Jump to search", "Jump to search": "Jump to search",
"Jump to dashboard": "Jump to dashboard", "Jump to dashboard": "Jump to dashboard",
"Table of contents": "Table of contents", "Table of contents": "Table of contents",
"Toggle sidebar": "Toggle sidebar",
"Open this guide": "Open this guide", "Open this guide": "Open this guide",
"Editor": "Editor", "Editor": "Editor",
"Save and exit document edit mode": "Save and exit document edit mode", "Save and exit document edit mode": "Save and exit document edit mode",