diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 611dc5c16..b3a5c325c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,7 @@ ### Option 1 - Manual 1. Fork and clone the repo -1. Run `npm install` to install dependencies +1. Run `yarn` to install dependencies 1. Create a branch for your PR with `git checkout -b your-branch-name` > To keep `master` branch pointing to remote repository and make pull requests from branches on your fork. To do this, run: diff --git a/src/actions/actionClipboard.tsx b/src/actions/actionClipboard.tsx index fdbe41dc7..93dc36baf 100644 --- a/src/actions/actionClipboard.tsx +++ b/src/actions/actionClipboard.tsx @@ -17,7 +17,8 @@ export const actionCopy = register({ }; }, contextItemLabel: "labels.copy", - keyTest: (event) => event[KEYS.CTRL_OR_CMD] && event.code === CODES.C, + // don't supply a shortcut since we handle this conditionally via onCopy event + keyTest: undefined, }); export const actionCut = register({ diff --git a/src/components/App.tsx b/src/components/App.tsx index c07b6debe..c811245a4 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -1058,6 +1058,21 @@ class App extends React.Component { }); private onCopy = withBatchedUpdates((event: ClipboardEvent) => { + const activeSelection = document.getSelection(); + // if there's a selected text is outside the component, prevent our copy + // action + if ( + activeSelection?.anchorNode && + // it can happen that certain interactions will create a selection + // outside (or potentially inside) the component without actually + // selecting anything (i.e. the selection range is collapsed). Copying + // in such case wouldn't copy anything to the clipboard anyway, so prevent + // our copy handler only if the selection isn't collapsed + !activeSelection.isCollapsed && + !this.excalidrawContainerRef.current!.contains(activeSelection.anchorNode) + ) { + return; + } if (isWritableElement(event.target)) { return; } @@ -2129,6 +2144,14 @@ class App extends React.Component { ) => { event.persist(); + // remove any active selection when we start to interact with canvas + // (mainly, we care about removing selection outside the component which + // would prevent our copy handling otherwise) + const selection = document.getSelection(); + if (selection?.anchorNode) { + selection.removeAllRanges(); + } + this.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event); this.maybeCleanupAfterMissingPointerUp(event); diff --git a/src/packages/utils/package.json b/src/packages/utils/package.json index 092463a61..b19e21aad 100644 --- a/src/packages/utils/package.json +++ b/src/packages/utils/package.json @@ -57,6 +57,6 @@ "scripts": { "build:umd": "cross-env NODE_ENV=production webpack --config webpack.prod.config.js", "build:umd:withAnalyzer": "cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js", - "pack": "yarn build:umd && npm pack" + "pack": "yarn build:umd && yarn pack" } }