mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-22 17:22:59 -05:00
Extensibility: Context menu support in Object Explorer (#1883)
- Fixes #1867 context menu should be extensible - Added context keys to support "when" conditions on the new extensions - Fixes issue where actions like New Query, scripting show up even if these are not valid for the provider type or object type - Fixed node expansion bug where rapid connect / expand / disconnect could break the app (fix in ObjectExplorerService.onNodeExpanded) - Major change to how internal actions work. These cannot assume the context has non-serializable objects. Opened up some APIs to make this easier to handle. - Fixed a number of existing bugs in internal actions. - Notably, DisconnectAction was adding a listener on each right-click on an active connection and never getting it disposed. This wasn't needed at all due to design changes. - Another bug fix is that the Manage action now correctly navigates to the DB dashboard for database-level connections. Before this it went to the server-level dashboard. * Define API for context info
This commit is contained in:
@@ -33,7 +33,7 @@ export class RefreshAction extends Action {
|
||||
id: string,
|
||||
label: string,
|
||||
tree: ITree,
|
||||
private element: ConnectionProfile | TreeNode,
|
||||
private element: IConnectionProfile | TreeNode,
|
||||
@IConnectionManagementService private _connectionManagementService: IConnectionManagementService,
|
||||
@IObjectExplorerService private _objectExplorerService: IObjectExplorerService,
|
||||
@IErrorMessageService private _errorMessageService: IErrorMessageService
|
||||
@@ -88,80 +88,31 @@ export class DisconnectConnectionAction extends Action {
|
||||
public static ID = 'objectExplorer.disconnect';
|
||||
public static LABEL = localize('DisconnectAction', 'Disconnect');
|
||||
|
||||
private _disposables: IDisposable[] = [];
|
||||
private _connectionProfile: ConnectionProfile;
|
||||
|
||||
private _container: HTMLElement;
|
||||
|
||||
constructor(
|
||||
id: string,
|
||||
label: string,
|
||||
private _connectionProfile: ConnectionProfile,
|
||||
@IConnectionManagementService private _connectionManagementService: IConnectionManagementService,
|
||||
@IObjectExplorerService private _objectExplorerService: IObjectExplorerService,
|
||||
@IErrorMessageService private _errorMessageService: IErrorMessageService
|
||||
) {
|
||||
super(id, label);
|
||||
const self = this;
|
||||
this._disposables.push(this._connectionManagementService.onConnect(() => {
|
||||
self.setLabel();
|
||||
})
|
||||
);
|
||||
this._disposables.push(this._connectionManagementService.onDisconnect((disconnectParams) => {
|
||||
if (this._connectionProfile) {
|
||||
this._connectionProfile.isDisconnecting = false;
|
||||
}
|
||||
self.setLabel();
|
||||
self._connectionManagementService.closeDashboard(disconnectParams.connectionUri);
|
||||
})
|
||||
);
|
||||
if (this._objectExplorerService && this._objectExplorerService.onUpdateObjectExplorerNodes) {
|
||||
this._disposables.push(this._objectExplorerService.onUpdateObjectExplorerNodes((args) => {
|
||||
self.removeSpinning(args.connection);
|
||||
if (args.errorMessage !== undefined) {
|
||||
self.showError(args.errorMessage);
|
||||
}
|
||||
})
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private showError(errorMessage: string) {
|
||||
if (this._errorMessageService) {
|
||||
this._errorMessageService.showDialog(Severity.Error, '', errorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
private setLabel(): void {
|
||||
if (!this._connectionProfile) {
|
||||
this.label = 'Connect';
|
||||
return;
|
||||
}
|
||||
this.label = this._connectionManagementService.isProfileConnected(this._connectionProfile) ? 'Disconnect' : 'Connect';
|
||||
}
|
||||
|
||||
private removeSpinning(connection: IConnectionProfile): void {
|
||||
if (this._connectionProfile) {
|
||||
if (connection.id === this._connectionProfile.id && this._container) {
|
||||
ObjectExplorerActionUtilities.hideLoadingIcon(this._container, ObjectExplorerActionUtilities.connectionElementClass);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
run(actionContext: ObjectExplorerActionsContext): TPromise<any> {
|
||||
return new TPromise<boolean>((resolve, reject) => {
|
||||
if (actionContext instanceof ObjectExplorerActionsContext) {
|
||||
//set objectExplorerTreeNode for context menu clicks
|
||||
this._connectionProfile = actionContext.connectionProfile;
|
||||
this._container = actionContext.container;
|
||||
resolve(true);
|
||||
}
|
||||
|
||||
if (!this._connectionProfile) {
|
||||
resolve(true);
|
||||
}
|
||||
if (this._connectionManagementService.isProfileConnected(this._connectionProfile)) {
|
||||
this._connectionProfile.isDisconnecting = true;
|
||||
let profileImpl = this._connectionProfile as ConnectionProfile;
|
||||
if (profileImpl) {
|
||||
profileImpl.isDisconnecting = true;
|
||||
}
|
||||
this._connectionManagementService.disconnect(this._connectionProfile).then((value) => {
|
||||
if (profileImpl) {
|
||||
profileImpl.isDisconnecting = false;
|
||||
}
|
||||
resolve(true);
|
||||
}
|
||||
).catch(disconnectError => {
|
||||
@@ -172,11 +123,6 @@ export class DisconnectConnectionAction extends Action {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
dispose(): void {
|
||||
super.dispose();
|
||||
this._disposables = dispose(this._disposables);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -362,11 +308,11 @@ export class RecentConnectionsFilterAction extends Action {
|
||||
export class NewQueryAction extends Action {
|
||||
public static ID = 'registeredServers.newQuery';
|
||||
public static LABEL = localize('registeredServers.newQuery', 'New Query');
|
||||
private _connectionProfile: ConnectionProfile;
|
||||
get connectionProfile(): ConnectionProfile {
|
||||
private _connectionProfile: IConnectionProfile;
|
||||
get connectionProfile(): IConnectionProfile {
|
||||
return this._connectionProfile;
|
||||
}
|
||||
set connectionProfile(profile: ConnectionProfile) {
|
||||
set connectionProfile(profile: IConnectionProfile) {
|
||||
this._connectionProfile = profile;
|
||||
}
|
||||
|
||||
@@ -403,7 +349,7 @@ export class DeleteConnectionAction extends Action {
|
||||
constructor(
|
||||
id: string,
|
||||
label: string,
|
||||
private element: ConnectionProfile | ConnectionProfileGroup,
|
||||
private element: IConnectionProfile | ConnectionProfileGroup,
|
||||
@IConnectionManagementService private _connectionManagementService: IConnectionManagementService
|
||||
) {
|
||||
super(id, label);
|
||||
@@ -413,7 +359,6 @@ export class DeleteConnectionAction extends Action {
|
||||
}
|
||||
|
||||
if (element instanceof ConnectionProfile) {
|
||||
element = <ConnectionProfile>element;
|
||||
let parent: ConnectionProfileGroup = element.parent;
|
||||
if (parent && parent.id === Constants.unsavedGroupId) {
|
||||
this.enabled = false;
|
||||
|
||||
Reference in New Issue
Block a user