From 778b82f9ae82475634ef8865f8dcfa64dd07ae3f Mon Sep 17 00:00:00 2001 From: Rishabh Saxena Date: Wed, 23 Dec 2020 16:58:29 +0530 Subject: [PATCH] enable hotkeys only when a widget is selected (#2262) --- app/client/cypress/support/commands.js | 9 ++-- app/client/src/pages/Editor/index.tsx | 62 +++++++++++++++----------- app/client/src/selectors/ui.tsx | 4 ++ 3 files changed, 46 insertions(+), 29 deletions(-) create mode 100644 app/client/src/selectors/ui.tsx diff --git a/app/client/cypress/support/commands.js b/app/client/cypress/support/commands.js index 203448f987..2d553f5af6 100644 --- a/app/client/cypress/support/commands.js +++ b/app/client/cypress/support/commands.js @@ -94,8 +94,9 @@ Cypress.Commands.add("CheckShareIcon", (orgName, count) => { cy.get(homePage.orgList.concat(orgName).concat(")")) .scrollIntoView() .should("be.visible"); - cy.get(homePage.orgList.concat(orgName).concat(") .org-share-user-icons")) - .should('have.length', count) + cy.get( + homePage.orgList.concat(orgName).concat(") .org-share-user-icons"), + ).should("have.length", count); }); Cypress.Commands.add("shareApp", (email, role) => { @@ -1144,8 +1145,8 @@ Cypress.Commands.add("Deletepage", Pagename => { cy.get(".t--page-sidebar-" + Pagename + ""); cy.get( ".t--page-sidebar-" + - Pagename + - ">.t--page-sidebar-menu-actions>.bp3-popover-target", + Pagename + + ">.t--page-sidebar-menu-actions>.bp3-popover-target", ).click({ force: true }); cy.get(pages.Menuaction).click({ force: true }); cy.get(pages.Delete).click({ force: true }); diff --git a/app/client/src/pages/Editor/index.tsx b/app/client/src/pages/Editor/index.tsx index 07924eae7c..5aedc9b501 100644 --- a/app/client/src/pages/Editor/index.tsx +++ b/app/client/src/pages/Editor/index.tsx @@ -45,6 +45,8 @@ import { pasteWidget, } from "actions/widgetActions"; import { isMac } from "utils/helpers"; +import { getSelectedWidget } from "selectors/ui"; +import { MAIN_CONTAINER_WIDGET_ID } from "constants/WidgetConstants"; type EditorProps = { currentApplicationId?: string; @@ -60,11 +62,33 @@ type EditorProps = { deleteSelectedWidget: () => void; cutSelectedWidget: () => void; user?: User; + selectedWidget?: string; }; type Props = EditorProps & RouteComponentProps; + +const getSelectedText = () => { + if (typeof window.getSelection === "function") { + const selectionObj = window.getSelection(); + return selectionObj && selectionObj.toString(); + } +}; + @HotkeysTarget class Editor extends Component { + public stopPropagationIfWidgetSelected(e: KeyboardEvent): boolean { + if ( + this.props.selectedWidget && + this.props.selectedWidget != MAIN_CONTAINER_WIDGET_ID && + !getSelectedText() + ) { + e.preventDefault(); + e.stopPropagation(); + return true; + } + return false; + } + public renderHotkeys() { return ( @@ -91,10 +115,10 @@ class Editor extends Component { label="Copy Widget" group="Canvas" onKeyDown={(e: any) => { - this.props.copySelectedWidget(); + if (this.stopPropagationIfWidgetSelected(e)) { + this.props.copySelectedWidget(); + } }} - preventDefault - stopPropagation /> { onKeyDown={(e: any) => { this.props.pasteCopiedWidget(); }} - preventDefault - stopPropagation - /> - { - if (!isMac()) this.props.deleteSelectedWidget(); - }} - preventDefault - stopPropagation /> { label="Delete Widget" group="Canvas" onKeyDown={(e: any) => { - if (isMac()) this.props.deleteSelectedWidget(); + if (this.stopPropagationIfWidgetSelected(e) && isMac()) { + this.props.pasteCopiedWidget(); + } }} - preventDefault - stopPropagation /> { label="Delete Widget" group="Canvas" onKeyDown={(e: any) => { - this.props.deleteSelectedWidget(); + if (this.stopPropagationIfWidgetSelected(e)) { + this.props.deleteSelectedWidget(); + } }} - preventDefault - stopPropagation /> { label="Cut Widget" group="Canvas" onKeyDown={(e: any) => { - this.props.cutSelectedWidget(); + if (this.stopPropagationIfWidgetSelected(e)) { + this.props.cutSelectedWidget(); + } }} - preventDefault - stopPropagation /> ); @@ -264,6 +275,7 @@ const mapStateToProps = (state: AppState) => ({ isEditorLoading: getIsEditorLoading(state), isEditorInitialized: getIsEditorInitialized(state), user: getCurrentUser(state), + selectedWidget: getSelectedWidget(state), }); const mapDispatchToProps = (dispatch: any) => { diff --git a/app/client/src/selectors/ui.tsx b/app/client/src/selectors/ui.tsx new file mode 100644 index 0000000000..b506d7d803 --- /dev/null +++ b/app/client/src/selectors/ui.tsx @@ -0,0 +1,4 @@ +import { AppState } from "reducers"; + +export const getSelectedWidget = (state: AppState) => + state.ui.widgetDragResize.selectedWidget;