Feature/input box component (#1190)

* Adding new view component for input box
This commit is contained in:
Leila Lali
2018-04-20 16:26:58 -07:00
committed by GitHub
parent 93aa052856
commit a7c4686980
11 changed files with 289 additions and 18 deletions

View File

@@ -13,10 +13,11 @@ import * as vscode from 'vscode';
import * as sqlops from 'sqlops';
import { SqlMainContext, ExtHostModelViewShape, MainThreadModelViewShape } from 'sql/workbench/api/node/sqlExtHost.protocol';
import { IItemConfig, ModelComponentTypes, IComponentShape } from 'sql/workbench/api/common/sqlExtHostTypes';
import { IItemConfig, ModelComponentTypes, IComponentShape, IComponentEventArgs, ComponentEventType } from 'sql/workbench/api/common/sqlExtHostTypes';
class ModelBuilderImpl implements sqlops.ModelBuilder {
private nextComponentId: number;
private readonly _eventHandlers = new Map<string, IWithEventHandler>();
constructor(private readonly _proxy: MainThreadModelViewShape, private readonly _handle: number) {
this.nextComponentId = 0;
@@ -34,17 +35,35 @@ class ModelBuilderImpl implements sqlops.ModelBuilder {
card(): sqlops.ComponentBuilder<sqlops.CardComponent> {
let id = this.getNextComponentId();
return new ComponentBuilderImpl(new CardWrapper(this._proxy, this._handle, id));
return this.withEventHandler(new CardWrapper(this._proxy, this._handle, id), id);
}
inputBox(): sqlops.ComponentBuilder<sqlops.InputBoxComponent> {
let id = this.getNextComponentId();
return this.withEventHandler(new InputBoxWrapper(this._proxy, this._handle, id), id);
}
dashboardWidget(widgetId: string): sqlops.ComponentBuilder<sqlops.WidgetComponent> {
let id = this.getNextComponentId();
return new ComponentBuilderImpl<sqlops.WidgetComponent>(new ComponentWrapper(this._proxy, this._handle, ModelComponentTypes.DashboardWidget, id));
return this.withEventHandler<sqlops.WidgetComponent>(new ComponentWrapper(this._proxy, this._handle, ModelComponentTypes.DashboardWidget, id), id);
}
dashboardWebview(webviewId: string): sqlops.ComponentBuilder<sqlops.WebviewComponent> {
let id = this.getNextComponentId();
return new ComponentBuilderImpl(new ComponentWrapper(this._proxy, this._handle, ModelComponentTypes.DashboardWebview, id));
return this.withEventHandler(new ComponentWrapper(this._proxy, this._handle, ModelComponentTypes.DashboardWebview, id), id);
}
withEventHandler<T extends sqlops.Component>(component: ComponentWrapper, id: string): sqlops.ComponentBuilder<T> {
let componentBuilder: ComponentBuilderImpl<T> = new ComponentBuilderImpl<T>(component);
this._eventHandlers.set(id, componentBuilder);
return componentBuilder;
}
handleEvent(componentId: string, eventArgs: IComponentEventArgs): void {
let eventHandler = this._eventHandlers.get(componentId);
if (eventHandler) {
eventHandler.handleEvent(eventArgs);
}
}
private getNextComponentId(): string {
@@ -52,9 +71,14 @@ class ModelBuilderImpl implements sqlops.ModelBuilder {
}
}
class ComponentBuilderImpl<T extends sqlops.Component> implements sqlops.ComponentBuilder<T> {
interface IWithEventHandler {
handleEvent(eventArgs: IComponentEventArgs): void;
}
class ComponentBuilderImpl<T extends sqlops.Component> implements sqlops.ComponentBuilder<T>, IWithEventHandler {
constructor(protected _component: ComponentWrapper) {
_component.registerEvent();
}
component(): T {
@@ -65,6 +89,10 @@ class ComponentBuilderImpl<T extends sqlops.Component> implements sqlops.Compone
this._component.properties = properties;
return this;
}
handleEvent(eventArgs: IComponentEventArgs) {
this._component.onEvent(eventArgs);
}
}
class GenericComponentBuilder<T extends sqlops.Component> extends ComponentBuilderImpl<T> {
@@ -150,7 +178,6 @@ class ComponentWrapper implements sqlops.Component {
};
}
public clearItems(): Thenable<void> {
this.itemConfigs = [];
return this._proxy.$clearContainer(this._handle, this.id);
@@ -184,6 +211,16 @@ class ComponentWrapper implements sqlops.Component {
return this._proxy.$setProperties(this._handle, this._id, this.properties).then(() => true);
}
public registerEvent(): Thenable<boolean> {
return this._proxy.$registerEvent(this._handle, this._id).then(() => true);
}
public onEvent(eventArgs: IComponentEventArgs) {
if (eventArgs && eventArgs.eventType === ComponentEventType.PropertiesChanged) {
this.properties = eventArgs.args;
}
}
protected setProperty(key: string, value: any): Thenable<boolean> {
if (!this.properties[key] || this.properties[key] !== value) {
// Only notify the front end if a value has been updated
@@ -233,11 +270,45 @@ class CardWrapper extends ComponentWrapper implements sqlops.CardComponent {
}
}
class InputBoxWrapper extends ComponentWrapper implements sqlops.InputBoxComponent {
constructor(proxy: MainThreadModelViewShape, handle: number, id: string) {
super(proxy, handle, ModelComponentTypes.InputBox, id);
this.properties = {};
this._emitterMap.set(ComponentEventType.onDidChange, new Emitter<any>());
}
private _onTextChangedEmitter = new Emitter<any>();
private _emitterMap = new Map<ComponentEventType, Emitter<any>>();
public get value(): string {
return this.properties['value'];
}
public set value(v: string) {
this.setProperty('value', v);
}
public get onTextChanged(): vscode.Event<any> {
let emitter = this._emitterMap.get(ComponentEventType.onDidChange);
return emitter && emitter.event;
}
public onEvent(eventArgs: IComponentEventArgs) {
super.onEvent(eventArgs);
if (eventArgs) {
let emitter = this._emitterMap.get(eventArgs.eventType);
if (emitter) {
emitter.fire();
}
}
}
}
class ModelViewImpl implements sqlops.ModelView {
public onClosedEmitter = new Emitter<any>();
private _modelBuilder: sqlops.ModelBuilder;
private _modelBuilder: ModelBuilderImpl;
constructor(
private readonly _proxy: MainThreadModelViewShape,
@@ -264,6 +335,10 @@ class ModelViewImpl implements sqlops.ModelView {
return this._modelBuilder;
}
public handleEvent(componentId: string, eventArgs: IComponentEventArgs): void {
this._modelBuilder.handleEvent(componentId, eventArgs);
}
public initializeModel<T extends sqlops.Component>(component: T): Thenable<void> {
let componentImpl = <any>component as ComponentWrapper;
if (!componentImpl) {
@@ -301,4 +376,11 @@ export class ExtHostModelView implements ExtHostModelViewShape {
this._modelViews.set(handle, view);
this._handlers.get(id)(view);
}
$handleEvent(handle: number, componentId: string, eventArgs: IComponentEventArgs): void {
const view = this._modelViews.get(handle);
if (view) {
view.handleEvent(componentId, eventArgs);
}
}
}