Add doAction API call for ModelView (#10345)

* Add doAction API call for ModelView

* cleanup
This commit is contained in:
Charles Gagnon
2020-05-12 10:47:20 -07:00
committed by GitHub
parent ff848b5903
commit 3fa0deed71
13 changed files with 70 additions and 8 deletions

View File

@@ -104,6 +104,10 @@ export class MainThreadModelView extends Disposable implements MainThreadModelVi
return new Promise(resolve => this.execModelViewAction(handle, (modelView) => resolve(modelView.focus(componentId))));
}
$doAction(handle: number, componentId: string, action: string, ...args: any[]): Thenable<void> {
return new Promise(resolve => this.execModelViewAction(handle, (modelView) => resolve(modelView.doAction(componentId, action, ...args))));
}
private runCustomValidations(handle: number, componentId: string): Thenable<boolean> {
return this._proxy.$runCustomValidations(handle, componentId);
}

View File

@@ -15,7 +15,7 @@ import * as vscode from 'vscode';
import * as azdata from 'azdata';
import { SqlMainContext, ExtHostModelViewShape, MainThreadModelViewShape, ExtHostModelViewTreeViewsShape } from 'sql/workbench/api/common/sqlExtHost.protocol';
import { IItemConfig, ModelComponentTypes, IComponentShape, IComponentEventArgs, ComponentEventType, ColumnSizingMode } from 'sql/workbench/api/common/sqlExtHostTypes';
import { IItemConfig, ModelComponentTypes, IComponentShape, IComponentEventArgs, ComponentEventType, ColumnSizingMode, ModelViewAction } from 'sql/workbench/api/common/sqlExtHostTypes';
import { IExtensionDescription } from 'vs/platform/extensions/common/extensions';
import { firstIndex } from 'vs/base/common/arrays';
import { ILogService } from 'vs/platform/log/common/log';
@@ -818,6 +818,10 @@ class ComponentWrapper implements azdata.Component {
public focus() {
return this._proxy.$focus(this._handle, this._id);
}
public doAction(action: ModelViewAction, ...args: any[]): Thenable<void> {
return this._proxy.$doAction(this._handle, this._id, action, ...args);
}
}
class ComponentWithIconWrapper extends ComponentWrapper {
@@ -1755,7 +1759,7 @@ class TabbedPanelComponentWrapper extends ComponentWrapper implements azdata.Tab
const itemConfigs = createFromTabs(tabs);
// Go through all of the tabs and either update their layout if they already exist
// or add them if they don't.
// We do not currently support reordering or removing tabs.
// We do not currently support reordering or removing tabs.
itemConfigs.forEach(newItemConfig => {
const existingTab = this.itemConfigs.find(itemConfig => newItemConfig.config.id === itemConfig.config.id);
if (existingTab) {
@@ -1766,6 +1770,10 @@ class TabbedPanelComponentWrapper extends ComponentWrapper implements azdata.Tab
});
}
public selectTab(id: string): void {
this.doAction(ModelViewAction.SelectTab, id);
}
public get onTabChanged(): vscode.Event<string> {
let emitter = this._emitterMap.get(ComponentEventType.onDidChange);
return emitter && emitter.event;

View File

@@ -526,6 +526,10 @@ class ModelViewDashboardImpl implements azdata.window.ModelViewDashboard {
});
return tabs;
}
selectTab(id: string): void {
this._tabbedPanel.selectTab(id);
}
}
export class ExtHostModelViewDialog implements ExtHostModelViewDialogShape {

View File

@@ -739,6 +739,7 @@ export interface MainThreadModelViewShape extends IDisposable {
$setDataProvider(handle: number, componentId: string): Thenable<void>;
$refreshDataProvider(handle: number, componentId: string, item?: any): Thenable<void>;
$focus(handle: number, componentId: string): Thenable<void>;
$doAction(handle: number, componentId: string, action: string, ...args: any[]): Thenable<void>;
}
export interface ExtHostObjectExplorerShape {

View File

@@ -179,6 +179,10 @@ export enum ModelComponentTypes {
PropertiesContainer
}
export enum ModelViewAction {
SelectTab = 'selectTab'
}
export enum ColumnSizingMode {
ForceFit = 0, // all columns will be sized to fit in viewable space, no horiz scroll bar
AutoFit = 1, // columns will be ForceFit up to a certain number; currently 3. At 4 or more the behavior will switch to NO force fit

View File

@@ -266,6 +266,10 @@ export abstract class ComponentBase extends Disposable implements IComponent, On
(<HTMLElement>this._el.nativeElement).focus();
}
public doAction(action: string, ...args: any[]): void {
// no-op, components should override this if they want to handle actions
}
protected onkeydown(domNode: HTMLElement, listener: (e: StandardKeyboardEvent) => void): void {
this._register(addDisposableListener(domNode, EventType.KEY_DOWN, (e: KeyboardEvent) => listener(new StandardKeyboardEvent(e))));
}

View File

@@ -2,16 +2,17 @@
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import 'vs/css!./media/tabbedPanel';
import { AfterViewInit, ChangeDetectorRef, Component, ElementRef, forwardRef, Inject, Input, OnDestroy, ViewChild } from '@angular/core';
import { NavigationBarLayout, PanelComponent } from 'sql/base/browser/ui/panel/panel.component';
import { TabType } from 'sql/base/browser/ui/panel/tab.component';
import { ContainerBase, ItemDescriptor } from 'sql/workbench/browser/modelComponents/componentBase';
import { ComponentEventType, IComponent, IComponentDescriptor, IModelStore } from 'sql/platform/dashboard/browser/interfaces';
import 'vs/css!./media/tabbedPanel';
import { ComponentEventType, IComponent, IComponentDescriptor, IModelStore, ModelViewAction } from 'sql/platform/dashboard/browser/interfaces';
import { IUserFriendlyIcon, createIconCssClass } from 'sql/workbench/browser/modelComponents/iconUtils';
import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';
import { attachTabbedPanelStyler } from 'sql/workbench/common/styler';
import { TabbedPanelLayout } from 'azdata';
import { ILogService } from 'vs/platform/log/common/log';
export interface TabConfig {
title: string;
@@ -50,7 +51,8 @@ export default class TabbedPanelComponent extends ContainerBase<TabConfig> imple
constructor(
@Inject(forwardRef(() => ChangeDetectorRef)) changeRef: ChangeDetectorRef,
@Inject(forwardRef(() => ElementRef)) el: ElementRef,
@Inject(IWorkbenchThemeService) private themeService: IWorkbenchThemeService
@Inject(IWorkbenchThemeService) private themeService: IWorkbenchThemeService,
@Inject(ILogService) private logService: ILogService
) {
super(changeRef, el);
}
@@ -125,4 +127,19 @@ export default class TabbedPanelComponent extends ContainerBase<TabConfig> imple
onItemLayoutUpdated(item: ItemDescriptor<TabConfig>): void {
this._panel.updateTab(item.config.id, { title: item.config.title, iconClass: item.config.icon ? createIconCssClass(item.config.icon) : undefined });
}
public doAction(action: string, ...args: any[]): void {
switch (action) {
case ModelViewAction.SelectTab:
if (typeof args?.[0] !== 'string') {
this.logService.warn(`Got unknown arg type for SelectTab action ${args?.[0]}`);
return;
}
this.selectTab(args[0]);
}
}
public selectTab(id: string): void {
this._panel.selectTab(id);
}
}

View File

@@ -156,4 +156,8 @@ export abstract class ViewBase extends AngularDisposable implements IModelView {
public focus(componentId: string): void {
return this.queueAction(componentId, (component) => component.focus());
}
public doAction(componentId: string, action: string, ...args: any[]): void {
return this.queueAction(componentId, (component) => component.doAction(action, ...args));
}
}