diff --git a/src/sql/workbench/browser/scriptingUtils.ts b/src/sql/workbench/browser/scriptingUtils.ts index 786e9a8d27..4ebf081b4e 100644 --- a/src/sql/workbench/browser/scriptingUtils.ts +++ b/src/sql/workbench/browser/scriptingUtils.ts @@ -127,7 +127,7 @@ export async function script(connectionProfile: IConnectionProfile, metadata: az if (script) { let description = (metadata.schema && metadata.schema !== '') ? `${metadata.schema}.${metadata.name}` : metadata.name; - const owner = await queryEditorService.newSqlEditor({ initalContent: script, description }); + const owner = await queryEditorService.newSqlEditor({ initalContent: script, description }, connectionProfile.providerName); // Connect our editor to the input connection let options: IConnectionCompletionOptions = { params: { connectionType: ConnectionType.editor, runQueryOnCompletion: RunQueryOnConnectionMode.none, input: owner }, diff --git a/src/sql/workbench/contrib/dataExplorer/browser/nodeContextUtils.ts b/src/sql/workbench/contrib/dataExplorer/browser/nodeContextUtils.ts index a696b796d8..21fdc268a5 100644 --- a/src/sql/workbench/contrib/dataExplorer/browser/nodeContextUtils.ts +++ b/src/sql/workbench/contrib/dataExplorer/browser/nodeContextUtils.ts @@ -22,7 +22,7 @@ export class NodeContextUtils extends Disposable { NodeType.User, NodeType.UserDefinedTableType, NodeType.View]); static readonly canExecute = new Set([NodeType.StoredProcedure]); static readonly canAlter = new Set([NodeType.AggregateFunction, NodeType.PartitionFunction, NodeType.ScalarValuedFunction, - NodeType.StoredProcedure, NodeType.TableValuedFunction, NodeType.View]); + NodeType.StoredProcedure, NodeType.TableValuedFunction, NodeType.View, NodeType.Function]); // General node context keys static NodeProvider = new RawContextKey('nodeProvider', undefined); diff --git a/src/sql/workbench/contrib/scripting/browser/scripting.contribution.ts b/src/sql/workbench/contrib/scripting/browser/scripting.contribution.ts index d5b7210c9c..eadf81b03f 100644 --- a/src/sql/workbench/contrib/scripting/browser/scripting.contribution.ts +++ b/src/sql/workbench/contrib/scripting/browser/scripting.contribution.ts @@ -139,7 +139,9 @@ MenuRegistry.appendMenuItem(MenuId.ObjectExplorerItemContext, { id: commands.OE_SCRIPT_AS_EXECUTE_COMMAND_ID, title: localize('scriptExecute', "Script as Execute") }, - when: ContextKeyExpr.and(ConnectionContextKey.Provider.isEqualTo('MSSQL'), TreeNodeContextKey.NodeType.isEqualTo('StoredProcedure')) + when: ContextKeyExpr.or( + ContextKeyExpr.and(ConnectionContextKey.Provider.isEqualTo('MSSQL'), TreeNodeContextKey.NodeType.isEqualTo('StoredProcedure')), + ContextKeyExpr.and(ConnectionContextKey.Provider.isEqualTo('KUSTO'), TreeNodeContextKey.NodeType.isEqualTo('Function'))) }); MenuRegistry.appendMenuItem(MenuId.ObjectExplorerItemContext, { @@ -169,6 +171,10 @@ MenuRegistry.appendMenuItem(MenuId.ObjectExplorerItemContext, { ContextKeyExpr.and( ConnectionContextKey.Provider.isEqualTo('MSSQL'), TreeNodeContextKey.NodeType.isEqualTo(NodeType.TableValuedFunction)), + ContextKeyExpr.and( + ConnectionContextKey.Provider.isEqualTo('KUSTO'), + TreeNodeContextKey.NodeType.isEqualTo(NodeType.Function) + ) ) }); diff --git a/src/sql/workbench/services/objectExplorer/browser/dragAndDropController.ts b/src/sql/workbench/services/objectExplorer/browser/dragAndDropController.ts index 656c2d3f16..835f658fb5 100644 --- a/src/sql/workbench/services/objectExplorer/browser/dragAndDropController.ts +++ b/src/sql/workbench/services/objectExplorer/browser/dragAndDropController.ts @@ -15,7 +15,7 @@ import { TreeNode } from 'sql/workbench/services/objectExplorer/common/treeNode' import { AsyncServerTree } from 'sql/workbench/services/objectExplorer/browser/asyncServerTree'; export function supportsNodeNameDrop(nodeId: string): boolean { - if (nodeId === 'Table' || nodeId === 'Column' || nodeId === 'View') { + if (nodeId === 'Table' || nodeId === 'Column' || nodeId === 'View' || nodeId === 'Function') { return true; } return false; @@ -97,7 +97,12 @@ export class ServerTreeDragAndDrop implements IDragAndDrop { if (supportsNodeNameDrop(element.nodeTypeId)) { escapedSchema = escapeString(element.metadata.schema); escapedName = escapeString(element.metadata.name); - finalString = escapedSchema ? `[${escapedSchema}].[${escapedName}]` : `[${escapedName}]`; + let providerName = this.getProviderNameFromElement(element); + if (providerName === 'KUSTO') { + finalString = element.nodeTypeId !== 'Function' && escapedName.indexOf(' ') > 0 ? `[@"${escapedName}"]` : escapedName; + } else { + finalString = escapedSchema ? `[${escapedSchema}].[${escapedName}]` : `[${escapedName}]`; + } originalEvent.dataTransfer.setData(DataTransfers.RESOURCES, JSON.stringify([`${element.nodeTypeId}:${element.id}?${finalString}`])); } if (supportsFolderNodeNameDrop(element.nodeTypeId, element.label)) { @@ -115,6 +120,14 @@ export class ServerTreeDragAndDrop implements IDragAndDrop { return; } + private getProviderNameFromElement(element: TreeNode): string | undefined { + if (element.connection) { + return element.connection.providerName; + } + + return this.getProviderNameFromElement(element.parent); + } + public canDragToConnectionProfileGroup(source: any, targetConnectionProfileGroup: ConnectionProfileGroup) { let canDragOver: boolean = true; diff --git a/src/sql/workbench/services/objectExplorer/browser/media/objectTypes/objecttypes.css b/src/sql/workbench/services/objectExplorer/browser/media/objectTypes/objecttypes.css index a4499e396b..af5ef46917 100644 --- a/src/sql/workbench/services/objectExplorer/browser/media/objectTypes/objecttypes.css +++ b/src/sql/workbench/services/objectExplorer/browser/media/objectTypes/objecttypes.css @@ -546,6 +546,9 @@ background: url("SystemUnicodeCharacterString.svg") center center no-repeat; } +.vs .icon.function, +.vs-dark .icon.function, +.hc-black .icon.function, .vs .icon.tablevaluedfunction, .vs-dark .icon.tablevaluedfunction, .hc-black .icon.tablevaluedfunction { diff --git a/src/sql/workbench/services/objectExplorer/browser/mssqlNodeContext.ts b/src/sql/workbench/services/objectExplorer/browser/mssqlNodeContext.ts index a807be6dc9..76b587f933 100644 --- a/src/sql/workbench/services/objectExplorer/browser/mssqlNodeContext.ts +++ b/src/sql/workbench/services/objectExplorer/browser/mssqlNodeContext.ts @@ -27,9 +27,9 @@ export class MssqlNodeContext extends Disposable { static readonly canCreateOrDelete = new Set([NodeType.AggregateFunction, NodeType.PartitionFunction, NodeType.ScalarValuedFunction, NodeType.Schema, NodeType.StoredProcedure, NodeType.Table, NodeType.TableValuedFunction, NodeType.User, NodeType.UserDefinedTableType, NodeType.View]); - static readonly canExecute = new Set([NodeType.StoredProcedure]); + static readonly canExecute = new Set([NodeType.StoredProcedure, NodeType.Function]); static readonly canAlter = new Set([NodeType.AggregateFunction, NodeType.PartitionFunction, NodeType.ScalarValuedFunction, - NodeType.StoredProcedure, NodeType.TableValuedFunction, NodeType.View]); + NodeType.StoredProcedure, NodeType.TableValuedFunction, NodeType.View, NodeType.Function]); // General node context keys static NodeProvider = new RawContextKey('nodeProvider', undefined); diff --git a/src/sql/workbench/services/objectExplorer/common/nodeType.ts b/src/sql/workbench/services/objectExplorer/common/nodeType.ts index 9a968c2fb7..29eb8cff5e 100644 --- a/src/sql/workbench/services/objectExplorer/common/nodeType.ts +++ b/src/sql/workbench/services/objectExplorer/common/nodeType.ts @@ -93,10 +93,11 @@ export class NodeType { public static ExternalTable = 'ExternalTable'; public static ColumnMasterKey = 'ColumnMasterKey'; public static ColumnEncryptionKey = 'ColumnEncryptionKey'; + public static Function = 'Function'; public static readonly SCRIPTABLE_OBJECTS = [NodeType.Table, NodeType.View, NodeType.Schema, NodeType.User, NodeType.UserDefinedTableType, NodeType.StoredProcedure, NodeType.AggregateFunction, NodeType.PartitionFunction, NodeType.ScalarValuedFunction, - NodeType.TableValuedFunction]; + NodeType.TableValuedFunction, NodeType.Function]; } export interface SqlThemeIcon {