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
This commit is contained in:
Christopher Suh
2020-08-04 20:49:21 -04:00
committed by GitHub
parent 656d944894
commit aa151b280f
2 changed files with 38 additions and 8 deletions

View File

@@ -13,6 +13,13 @@ import { UNSAVED_GROUP_ID } from 'sql/platform/connection/common/constants';
import { DataTransfers, IDragAndDropData } from 'vs/base/browser/dnd'; import { DataTransfers, IDragAndDropData } from 'vs/base/browser/dnd';
import { TreeNode } from 'sql/workbench/services/objectExplorer/common/treeNode'; 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 * Implements drag and drop for the server tree
*/ */
@@ -33,10 +40,11 @@ export class ServerTreeDragAndDrop implements IDragAndDrop {
return (<ConnectionProfile>element).id; return (<ConnectionProfile>element).id;
} else if (element instanceof ConnectionProfileGroup) { } else if (element instanceof ConnectionProfileGroup) {
return (<ConnectionProfileGroup>element).id; return (<ConnectionProfileGroup>element).id;
} else if (element.nodeTypeId === 'Table' || element.nodeTypeId === 'Column') { } else if (supportsNodeNameDrop(element.nodeTypeId)) {
return (<TreeNode>element).id; return (<TreeNode>element).id;
} } else if (element.nodeTypeId === 'Folder' && element.label === 'Columns' && element.children) {
else { return (<TreeNode>element).id;
} else {
return undefined; return undefined;
} }
} }
@@ -70,18 +78,39 @@ export class ServerTreeDragAndDrop implements IDragAndDrop {
* Called when the drag operation starts. * Called when the drag operation starts.
*/ */
public onDragStart(tree: ITree, dragAndDropData: IDragAndDropData, originalEvent: DragMouseEvent): void { public onDragStart(tree: ITree, dragAndDropData: IDragAndDropData, originalEvent: DragMouseEvent): void {
let escapedSchema, escapedName, finalString;
TreeUpdateUtils.isInDragAndDrop = true; TreeUpdateUtils.isInDragAndDrop = true;
const data = dragAndDropData.getData(); const data = dragAndDropData.getData();
const element = data[0]; const element = data[0];
if (element.nodeTypeId === 'Column' || element.nodeTypeId === 'Table') { if (supportsNodeNameDrop(element.nodeTypeId)) {
const escapedSchema = element.metadata.schema?.replace(/]/g, ']]'); escapedSchema = this.escapeString(element.metadata.schema);
const escapedName = element.metadata.name?.replace(/]/g, ']]'); escapedName = this.escapeString(element.metadata.name);
const finalString = escapedSchema ? `[${escapedSchema}].[${escapedName}]` : `[${escapedName}]`; finalString = escapedSchema ? `[${escapedSchema}].[${escapedName}]` : `[${escapedName}]`;
originalEvent.dataTransfer.setData(DataTransfers.RESOURCES, JSON.stringify([`${element.nodeTypeId}:${element.id}?${finalString}`])); 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; 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) { public canDragToConnectionProfileGroup(source: any, targetConnectionProfileGroup: ConnectionProfileGroup) {
let canDragOver: boolean = true; let canDragOver: boolean = true;

View File

@@ -29,6 +29,7 @@ import { localize } from 'vs/nls';
// {{SQL CARBON EDIT}} // {{SQL CARBON EDIT}}
import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2';
import { supportsNodeNameDrop } from 'sql/workbench/services/objectExplorer/browser/dragAndDropController';
interface IDropOperation { interface IDropOperation {
splitDirection?: GroupDirection; splitDirection?: GroupDirection;
@@ -359,7 +360,7 @@ class DropOverlay extends Themable {
// {{SQL CARBON EDIT}} // {{SQL CARBON EDIT}}
const editor = this.editorService.activeTextEditorControl as ICodeEditor; 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); SnippetController2.get(editor).insert(untitledOrFileResources[0].resource.query);
editor.focus(); editor.focus();
return; return;