From aa151b280fdb0e731cc964f91868e142a4ec3dd5 Mon Sep 17 00:00:00 2001 From: Christopher Suh Date: Tue, 4 Aug 2020 20:49:21 -0400 Subject: [PATCH] Added Column folder drag & drop (#11595) * wip * working folder drag/drop * helper method * cleanup * cleanup * cleanup * added view * helper method for nodeTypeId * made method static for access from editordroptarget * pr changes --- .../browser/dragAndDropController.ts | 43 ++++++++++++++++--- .../browser/parts/editor/editorDropTarget.ts | 3 +- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/sql/workbench/services/objectExplorer/browser/dragAndDropController.ts b/src/sql/workbench/services/objectExplorer/browser/dragAndDropController.ts index 4a754040c2..73a8c4ecaf 100644 --- a/src/sql/workbench/services/objectExplorer/browser/dragAndDropController.ts +++ b/src/sql/workbench/services/objectExplorer/browser/dragAndDropController.ts @@ -13,6 +13,13 @@ import { UNSAVED_GROUP_ID } from 'sql/platform/connection/common/constants'; import { DataTransfers, IDragAndDropData } from 'vs/base/browser/dnd'; import { TreeNode } from 'sql/workbench/services/objectExplorer/common/treeNode'; +export function supportsNodeNameDrop(nodeId: string): boolean { + if (nodeId === 'Table' || nodeId === 'Column' || nodeId === 'View') { + return true; + } + return false; +} + /** * Implements drag and drop for the server tree */ @@ -33,10 +40,11 @@ export class ServerTreeDragAndDrop implements IDragAndDrop { return (element).id; } else if (element instanceof ConnectionProfileGroup) { return (element).id; - } else if (element.nodeTypeId === 'Table' || element.nodeTypeId === 'Column') { + } else if (supportsNodeNameDrop(element.nodeTypeId)) { return (element).id; - } - else { + } else if (element.nodeTypeId === 'Folder' && element.label === 'Columns' && element.children) { + return (element).id; + } else { return undefined; } } @@ -70,18 +78,39 @@ export class ServerTreeDragAndDrop implements IDragAndDrop { * Called when the drag operation starts. */ public onDragStart(tree: ITree, dragAndDropData: IDragAndDropData, originalEvent: DragMouseEvent): void { + let escapedSchema, escapedName, finalString; TreeUpdateUtils.isInDragAndDrop = true; const data = dragAndDropData.getData(); const element = data[0]; - if (element.nodeTypeId === 'Column' || element.nodeTypeId === 'Table') { - const escapedSchema = element.metadata.schema?.replace(/]/g, ']]'); - const escapedName = element.metadata.name?.replace(/]/g, ']]'); - const finalString = escapedSchema ? `[${escapedSchema}].[${escapedName}]` : `[${escapedName}]`; + if (supportsNodeNameDrop(element.nodeTypeId)) { + escapedSchema = this.escapeString(element.metadata.schema); + escapedName = this.escapeString(element.metadata.name); + finalString = escapedSchema ? `[${escapedSchema}].[${escapedName}]` : `[${escapedName}]`; originalEvent.dataTransfer.setData(DataTransfers.RESOURCES, JSON.stringify([`${element.nodeTypeId}:${element.id}?${finalString}`])); } + if (element.nodeTypeId === 'Folder' && element.label === 'Columns') { + // get children + let returnString = ''; + for (let child of element.children) { + escapedSchema = this.escapeString(child.metadata.schema); + escapedName = this.escapeString(child.metadata.name); + finalString = escapedSchema ? `[${escapedSchema}].[${escapedName}]` : `[${escapedName}]`; + returnString = returnString ? `${returnString},${finalString}` : `${finalString}`; + } + + originalEvent.dataTransfer.setData(DataTransfers.RESOURCES, JSON.stringify([`${element.nodeTypeId}:${element.id}?${returnString}`])); + } return; } + private escapeString(input: string | undefined): string | undefined { + if (input) { + let output = input.replace(/]/g, ']]'); + return output; + } + return undefined; + } + public canDragToConnectionProfileGroup(source: any, targetConnectionProfileGroup: ConnectionProfileGroup) { let canDragOver: boolean = true; diff --git a/src/vs/workbench/browser/parts/editor/editorDropTarget.ts b/src/vs/workbench/browser/parts/editor/editorDropTarget.ts index a29ddce8a3..cd15101f58 100644 --- a/src/vs/workbench/browser/parts/editor/editorDropTarget.ts +++ b/src/vs/workbench/browser/parts/editor/editorDropTarget.ts @@ -29,6 +29,7 @@ import { localize } from 'vs/nls'; // {{SQL CARBON EDIT}} import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; +import { supportsNodeNameDrop } from 'sql/workbench/services/objectExplorer/browser/dragAndDropController'; interface IDropOperation { splitDirection?: GroupDirection; @@ -359,7 +360,7 @@ class DropOverlay extends Themable { // {{SQL CARBON EDIT}} const editor = this.editorService.activeTextEditorControl as ICodeEditor; - if (untitledOrFileResources[0].resource.scheme === 'Column' || untitledOrFileResources[0].resource.scheme === 'Table') { + if (supportsNodeNameDrop(untitledOrFileResources[0].resource.scheme) || untitledOrFileResources[0].resource.scheme === 'Folder') { SnippetController2.get(editor).insert(untitledOrFileResources[0].resource.query); editor.focus(); return;