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 { 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 (<ConnectionProfile>element).id;
} else if (element instanceof ConnectionProfileGroup) {
return (<ConnectionProfileGroup>element).id;
} else if (element.nodeTypeId === 'Table' || element.nodeTypeId === 'Column') {
} else if (supportsNodeNameDrop(element.nodeTypeId)) {
return (<TreeNode>element).id;
}
else {
} else if (element.nodeTypeId === 'Folder' && element.label === 'Columns' && element.children) {
return (<TreeNode>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;