diff --git a/frontend/src/Editor/Inspector/Inspector.jsx b/frontend/src/Editor/Inspector/Inspector.jsx index fe844d9cff..749d89b01a 100644 --- a/frontend/src/Editor/Inspector/Inspector.jsx +++ b/frontend/src/Editor/Inspector/Inspector.jsx @@ -6,6 +6,8 @@ import { renderElement } from './Utils'; import { toast } from 'react-toastify'; import { validateQueryName, convertToKebabCase } from '@/_helpers/utils'; import { EventManager } from './EventManager'; +import useShortcuts from '@/_hooks/use-shortcuts'; +import { ConfirmDialog } from '@/_components'; export const Inspector = ({ selectedComponentId, @@ -17,6 +19,7 @@ export const Inspector = ({ apps, darkMode, switchSidebarTab, + removeComponent, }) => { const selectedComponent = { id: selectedComponentId, @@ -24,9 +27,17 @@ export const Inspector = ({ layouts: allComponents[selectedComponentId].layouts, }; const [component, setComponent] = useState(selectedComponent); - + const [showWidgetDeleteConfirmation, setWidgetDeleteConfirmation] = useState(false); const [components, setComponents] = useState(allComponents); + useShortcuts( + ['Backspace'], + () => { + setWidgetDeleteConfirmation(true); + }, + [] + ); + const componentMeta = componentTypes.find((comp) => component.component.component === comp.component); useEffect(() => { @@ -173,6 +184,15 @@ export const Inspector = ({ return (
+ { + switchSidebarTab(2); + removeComponent(selectedComponent); + }} + onCancel={() => setWidgetDeleteConfirmation(false)} + />
diff --git a/frontend/src/_hooks/use-shortcuts.jsx b/frontend/src/_hooks/use-shortcuts.jsx index 14f59c6d29..cf2e376249 100644 --- a/frontend/src/_hooks/use-shortcuts.jsx +++ b/frontend/src/_hooks/use-shortcuts.jsx @@ -1,14 +1,28 @@ /* eslint-disable react-hooks/exhaustive-deps */ -// https://keycode.info/ this cheatsheet gives info about key presses +// https://keycode.info/ this cheat sheet gives info about key presses import { useEffect, useCallback } from 'react'; -const setsEqual = (setA, setB) => setA.size === setB.size && !Array.from(setA).some((v) => !setB.has(v)); + const useShortcuts = (keys, callback, deps) => { + const ignoreTags = ['input', 'select', 'textarea']; + const ignoreEventsCondition = (event) => { + const { target } = event; + + if (target && target.tagName) { + const tagName = target.tagName.toLowerCase(); + + return ignoreTags.includes(tagName) || target.isContentEditable; + } else { + return false; + } + }; + const setsEqual = (setA, setB) => setA.size === setB.size && !Array.from(setA).some((v) => !setB.has(v)); const memoizedCallback = useCallback(callback, deps || []); const targetKeys = new Set(keys.map((key) => key.toLowerCase())); const pressedKeys = new Set(); function onKeyPressed(event) { + if (ignoreEventsCondition(event)) return; pressedKeys.add(event.key.toLowerCase()); if (setsEqual(pressedKeys, targetKeys)) { memoizedCallback();