mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-15 01:25:36 -05:00
Feature/input box component (#1190)
* Adding new view component for input box
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,10 +13,11 @@ import * as sqlops from 'sqlops';
|
||||
import { IModelViewService } from 'sql/services/modelComponents/modelViewService';
|
||||
import { IItemConfig, ModelComponentTypes, IComponentShape } from 'sql/workbench/api/common/sqlExtHostTypes';
|
||||
import { IModelView } from 'sql/services/model/modelViewService';
|
||||
import { Disposable } from 'vs/base/common/lifecycle';
|
||||
|
||||
|
||||
@extHostNamedCustomer(SqlMainContext.MainThreadModelView)
|
||||
export class MainThreadModelView implements MainThreadModelViewShape {
|
||||
export class MainThreadModelView extends Disposable implements MainThreadModelViewShape {
|
||||
|
||||
private static _handlePool = 0;
|
||||
private readonly _proxy: ExtHostModelViewShape;
|
||||
@@ -28,6 +29,7 @@ export class MainThreadModelView implements MainThreadModelViewShape {
|
||||
context: IExtHostContext,
|
||||
@IModelViewService viewService: IModelViewService
|
||||
) {
|
||||
super();
|
||||
this._proxy = context.getProxy(SqlExtHostContext.ExtHostModelView);
|
||||
viewService.onRegisteredModelView(view => {
|
||||
if (this.knownWidgets.includes(view.id)) {
|
||||
@@ -38,16 +40,14 @@ export class MainThreadModelView implements MainThreadModelViewShape {
|
||||
});
|
||||
}
|
||||
|
||||
public dispose(): void {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
|
||||
$registerProvider(id: string) {
|
||||
this.knownWidgets.push(id);
|
||||
}
|
||||
|
||||
$initializeModel(handle: number, rootComponent: IComponentShape): Thenable<void> {
|
||||
return this.execModelViewAction(handle, (modelView) => modelView.initializeModel(rootComponent));
|
||||
return this.execModelViewAction(handle, (modelView) => {
|
||||
modelView.initializeModel(rootComponent);
|
||||
});
|
||||
}
|
||||
|
||||
$clearContainer(handle: number, componentId: string): Thenable<void> {
|
||||
@@ -63,6 +63,19 @@ export class MainThreadModelView implements MainThreadModelViewShape {
|
||||
return this.execModelViewAction(handle, (modelView) => modelView.setLayout(componentId, layout));
|
||||
}
|
||||
|
||||
private onEvent(handle: number, componentId: string, eventArgs: any) {
|
||||
this._proxy.$handleEvent(handle, componentId, eventArgs);
|
||||
}
|
||||
|
||||
$registerEvent(handle: number, componentId: string): Thenable<void> {
|
||||
let properties: { [key: string]: any; } = { eventName: this.onEvent };
|
||||
return this.execModelViewAction(handle, (modelView) => {
|
||||
this._register(modelView.onEvent (e => {
|
||||
this.onEvent(handle, componentId, e);
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
||||
$setProperties(handle: number, componentId: string, properties: { [key: string]: any; }): Thenable<void> {
|
||||
return this.execModelViewAction(handle, (modelView) => modelView.setProperties(componentId, properties));
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ import * as vscode from 'vscode';
|
||||
|
||||
import { ITaskHandlerDescription } from 'sql/platform/tasks/common/tasks';
|
||||
import { IItemConfig, ModelComponentTypes, IComponentShape } from 'sql/workbench/api/common/sqlExtHostTypes';
|
||||
import Event, { Emitter } from 'vs/base/common/event';
|
||||
|
||||
export abstract class ExtHostAccountManagementShape {
|
||||
$autoOAuthCancelled(handle: number): Thenable<void> { throw ni(); }
|
||||
@@ -514,6 +515,7 @@ export interface ExtHostModelViewShape {
|
||||
$registerProvider(widgetId: string, handler: (webview: sqlops.ModelView) => void): void;
|
||||
$onClosed(handle: number): void;
|
||||
$registerWidget(handle: number, id: string, connection: sqlops.connection.Connection, serverInfo: sqlops.ServerInfo): void;
|
||||
$handleEvent(handle: number, id: string, eventArgs: any);
|
||||
}
|
||||
|
||||
export interface MainThreadModelViewShape extends IDisposable {
|
||||
@@ -523,6 +525,7 @@ export interface MainThreadModelViewShape extends IDisposable {
|
||||
$addToContainer(handle: number, containerId: string, item: IItemConfig): Thenable<void>;
|
||||
$setLayout(handle: number, componentId: string, layout: any): Thenable<void>;
|
||||
$setProperties(handle: number, componentId: string, properties: { [key: string]: any }): Thenable<void>;
|
||||
$registerEvent(handle: number, componentId: string): Thenable<void>;
|
||||
}
|
||||
|
||||
export interface ExtHostObjectExplorerShape {
|
||||
|
||||
Reference in New Issue
Block a user