diff --git a/apps/desktop/src/components/editor/QueryEditor.vue b/apps/desktop/src/components/editor/QueryEditor.vue index 3a6751a0f7..292d0037a9 100644 --- a/apps/desktop/src/components/editor/QueryEditor.vue +++ b/apps/desktop/src/components/editor/QueryEditor.vue @@ -26,6 +26,7 @@ import { extractIdentifierAt, isSqlKeyword, matchTable } from "@/lib/sqlNavigati import { lineColumnToOffset, parseSqlErrorLocation } from "@/lib/sqlDiagnostics"; import { DBX_TABLE_REFERENCE_MIME, + hasTableReferencePayloadType, parseTableReferencePayload, tableReferenceInsertText, } from "@/lib/queryEditorTableDrop"; @@ -725,6 +726,10 @@ function droppedTableReference(event: DragEvent) { return parseTableReferencePayload(event.dataTransfer?.getData(DBX_TABLE_REFERENCE_MIME)); } +function hasDroppedTableReference(event: DragEvent) { + return hasTableReferencePayloadType(event.dataTransfer?.types); +} + function insertDroppedTableReference(currentView: EditorViewType, event: DragEvent): boolean { if (props.readOnly) return false; const payload = droppedTableReference(event); @@ -1283,7 +1288,7 @@ onMounted(async () => { ), EditorView.domEventHandlers({ dragover(event) { - if (props.readOnly || !droppedTableReference(event)) return false; + if (props.readOnly || !hasDroppedTableReference(event)) return false; event.preventDefault(); if (event.dataTransfer) event.dataTransfer.dropEffect = "copy"; return true; diff --git a/apps/desktop/src/lib/queryEditorTableDrop.ts b/apps/desktop/src/lib/queryEditorTableDrop.ts index 7376722cf2..ca9889baa7 100644 --- a/apps/desktop/src/lib/queryEditorTableDrop.ts +++ b/apps/desktop/src/lib/queryEditorTableDrop.ts @@ -62,6 +62,14 @@ export function parseTableReferencePayload(value: string | undefined | null): Qu } } +export function hasTableReferencePayloadType(types: Iterable | undefined | null): boolean { + if (!types) return false; + for (const type of types) { + if (type === DBX_TABLE_REFERENCE_MIME) return true; + } + return false; +} + export function tableReferenceInsertText( payload: QueryEditorTableReferencePayload, fallbackDatabaseType?: DatabaseType, diff --git a/packages/app-tests/queryEditorTableDrop.test.ts b/packages/app-tests/queryEditorTableDrop.test.ts index 68e1cabdc0..d0cab91544 100644 --- a/packages/app-tests/queryEditorTableDrop.test.ts +++ b/packages/app-tests/queryEditorTableDrop.test.ts @@ -1,7 +1,9 @@ import { strict as assert } from "node:assert"; import test from "node:test"; import { + DBX_TABLE_REFERENCE_MIME, createTableReferencePayload, + hasTableReferencePayloadType, parseTableReferencePayload, serializeTableReferencePayload, tableReferenceInsertText, @@ -41,6 +43,12 @@ test("round trips table drag payload and rejects unrelated data", () => { assert.equal(parseTableReferencePayload(JSON.stringify({ kind: "dbx-table-reference", tableName: "orders" })), null); }); +test("detects table drag payload type without reading drag data", () => { + assert.equal(hasTableReferencePayloadType(undefined), false); + assert.equal(hasTableReferencePayloadType(["text/plain"]), false); + assert.equal(hasTableReferencePayloadType(["text/plain", DBX_TABLE_REFERENCE_MIME]), true); +}); + test("formats dropped table reference for the source database type", () => { assert.equal( tableReferenceInsertText({