From 542f4780143a9a27a9cbb2175b41ff0e03a72ee5 Mon Sep 17 00:00:00 2001 From: Sean Colsen Date: Sat, 15 Mar 2025 15:22:31 -0400 Subject: [PATCH] Fix bug when pasting into cell in edit mode --- mathesar_ui/src/AppContext.svelte | 16 ++++++++-------- .../sheet/clipboard/SheetClipboardHandler.ts | 14 ++++++++++++++ mathesar_ui/src/stores/clipboard.ts | 2 ++ 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/mathesar_ui/src/AppContext.svelte b/mathesar_ui/src/AppContext.svelte index 8a955eaebc..4f4926452e 100644 --- a/mathesar_ui/src/AppContext.svelte +++ b/mathesar_ui/src/AppContext.svelte @@ -66,17 +66,17 @@ // Data Explorer. function handleCopy(e: ClipboardEvent) { - if (clipboardHandler) { - clipboardHandler.handleCopy(e); - e.preventDefault(); - } + if (!clipboardHandler) return; + if (!clipboardHandler.shouldHandleCopy(e)) return; + clipboardHandler.handleCopy(e); + e.preventDefault(); } function handlePaste(e: ClipboardEvent) { - if (clipboardHandler) { - void clipboardHandler.handlePaste(e); - e.preventDefault(); - } + if (!clipboardHandler) return; + if (!clipboardHandler.shouldHandlePaste(e)) return; + void clipboardHandler.handlePaste(e); + e.preventDefault(); } diff --git a/mathesar_ui/src/components/sheet/clipboard/SheetClipboardHandler.ts b/mathesar_ui/src/components/sheet/clipboard/SheetClipboardHandler.ts index 32ecfde55b..7deeb1f5d8 100644 --- a/mathesar_ui/src/components/sheet/clipboard/SheetClipboardHandler.ts +++ b/mathesar_ui/src/components/sheet/clipboard/SheetClipboardHandler.ts @@ -18,6 +18,12 @@ interface Dependencies { showToastError: (msg: string) => void; } +function shouldHandleEvent(): boolean { + // Only handle clipboard events when a cell is focused. This prevents pasting + // into inputs while editing cells, and other unexpected behavior. + return document.activeElement?.hasAttribute('data-active-cell') ?? false; +} + export class SheetClipboardHandler implements ClipboardHandler { private readonly deps: Dependencies; @@ -25,6 +31,14 @@ export class SheetClipboardHandler implements ClipboardHandler { this.deps = deps; } + shouldHandleCopy() { + return shouldHandleEvent(); + } + + shouldHandlePaste() { + return shouldHandleEvent(); + } + handleCopy(event: ClipboardEvent): void { if (event.clipboardData == null) return; try { diff --git a/mathesar_ui/src/stores/clipboard.ts b/mathesar_ui/src/stores/clipboard.ts index 7a341859da..3cb4e64948 100644 --- a/mathesar_ui/src/stores/clipboard.ts +++ b/mathesar_ui/src/stores/clipboard.ts @@ -2,6 +2,8 @@ import { getContext, setContext } from 'svelte'; import { type Writable, writable } from 'svelte/store'; export interface ClipboardHandler { + shouldHandleCopy: (event: ClipboardEvent) => boolean; + shouldHandlePaste: (event: ClipboardEvent) => boolean; handleCopy: (event: ClipboardEvent) => void; handlePaste: (event: ClipboardEvent) => Promise; }