mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 18:46:40 -05:00
Add focus function for modelview components (#8348)
* Add focus method for modelview components * Remove focus properties from table and radiobutton * Fix break
This commit is contained in:
@@ -180,6 +180,7 @@ export class AddControllerDialog {
|
|||||||
}]).withLayout({ width: '100%' }).component();
|
}]).withLayout({ width: '100%' }).component();
|
||||||
this.onAuthChanged();
|
this.onAuthChanged();
|
||||||
await view.initializeModel(formModel);
|
await view.initializeModel(formModel);
|
||||||
|
this.urlInputBox.focus();
|
||||||
});
|
});
|
||||||
|
|
||||||
this.dialog.registerCloseValidator(async () => await this.validate());
|
this.dialog.registerCloseValidator(async () => await this.validate());
|
||||||
|
|||||||
@@ -38,10 +38,6 @@ export class SelectOperationPage extends BasePage {
|
|||||||
let importComponent = await this.createImportRadioButton();
|
let importComponent = await this.createImportRadioButton();
|
||||||
let exportComponent = await this.createExportRadioButton();
|
let exportComponent = await this.createExportRadioButton();
|
||||||
|
|
||||||
// default have the first radio button checked
|
|
||||||
this.deployRadioButton.checked = true;
|
|
||||||
this.deployRadioButton.focused = true;
|
|
||||||
|
|
||||||
this.form = this.view.modelBuilder.formContainer()
|
this.form = this.view.modelBuilder.formContainer()
|
||||||
.withFormItems(
|
.withFormItems(
|
||||||
[
|
[
|
||||||
@@ -54,6 +50,7 @@ export class SelectOperationPage extends BasePage {
|
|||||||
}).component();
|
}).component();
|
||||||
await this.view.initializeModel(this.form);
|
await this.view.initializeModel(this.form);
|
||||||
|
|
||||||
|
this.deployRadioButton.focus();
|
||||||
this.instance.setDoneButton(Operation.deploy);
|
this.instance.setDoneButton(Operation.deploy);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -67,6 +64,7 @@ export class SelectOperationPage extends BasePage {
|
|||||||
.withProperties({
|
.withProperties({
|
||||||
name: 'selectedOperation',
|
name: 'selectedOperation',
|
||||||
label: localize('dacFx.deployRadioButtonLabel', "Deploy a data-tier application .dacpac file to an instance of SQL Server [Deploy Dacpac]"),
|
label: localize('dacFx.deployRadioButtonLabel', "Deploy a data-tier application .dacpac file to an instance of SQL Server [Deploy Dacpac]"),
|
||||||
|
checked: true // Default to first radio button being selected
|
||||||
}).component();
|
}).component();
|
||||||
|
|
||||||
this.deployRadioButton.onDidClick(() => {
|
this.deployRadioButton.onDidClick(() => {
|
||||||
|
|||||||
@@ -2,12 +2,10 @@
|
|||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
'use strict';
|
|
||||||
|
|
||||||
import * as nls from 'vscode-nls';
|
import * as nls from 'vscode-nls';
|
||||||
import * as azdata from 'azdata';
|
import * as azdata from 'azdata';
|
||||||
import * as vscode from 'vscode';
|
import * as vscode from 'vscode';
|
||||||
import * as os from 'os';
|
|
||||||
import { SchemaCompareMainWindow } from '../schemaCompareMainWindow';
|
import { SchemaCompareMainWindow } from '../schemaCompareMainWindow';
|
||||||
import { promises as fs } from 'fs';
|
import { promises as fs } from 'fs';
|
||||||
import { Telemetry } from '../telemetry';
|
import { Telemetry } from '../telemetry';
|
||||||
@@ -46,6 +44,8 @@ async function exists(path: string): Promise<boolean> {
|
|||||||
export class SchemaCompareDialog {
|
export class SchemaCompareDialog {
|
||||||
public dialog: azdata.window.Dialog;
|
public dialog: azdata.window.Dialog;
|
||||||
public dialogName: string;
|
public dialogName: string;
|
||||||
|
private sourceDacpacRadioButton: azdata.RadioButtonComponent;
|
||||||
|
private sourceDatabaseRadioButton: azdata.RadioButtonComponent;
|
||||||
private schemaCompareTab: azdata.window.DialogTab;
|
private schemaCompareTab: azdata.window.DialogTab;
|
||||||
private sourceDacpacComponent: azdata.FormComponent;
|
private sourceDacpacComponent: azdata.FormComponent;
|
||||||
private sourceTextBox: azdata.InputBoxComponent;
|
private sourceTextBox: azdata.InputBoxComponent;
|
||||||
@@ -291,6 +291,11 @@ export class SchemaCompareDialog {
|
|||||||
|
|
||||||
let formModel = this.formBuilder.component();
|
let formModel = this.formBuilder.component();
|
||||||
await view.initializeModel(formModel);
|
await view.initializeModel(formModel);
|
||||||
|
if (this.sourceIsDacpac) {
|
||||||
|
this.sourceDacpacRadioButton.focus();
|
||||||
|
} else {
|
||||||
|
this.sourceDatabaseRadioButton.focus();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -346,20 +351,20 @@ export class SchemaCompareDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async createSourceRadiobuttons(view: azdata.ModelView): Promise<azdata.FormComponent> {
|
private async createSourceRadiobuttons(view: azdata.ModelView): Promise<azdata.FormComponent> {
|
||||||
let dacpacRadioButton = view.modelBuilder.radioButton()
|
this.sourceDacpacRadioButton = view.modelBuilder.radioButton()
|
||||||
.withProperties({
|
.withProperties({
|
||||||
name: 'source',
|
name: 'source',
|
||||||
label: DacpacRadioButtonLabel
|
label: DacpacRadioButtonLabel
|
||||||
}).component();
|
}).component();
|
||||||
|
|
||||||
let databaseRadioButton = view.modelBuilder.radioButton()
|
this.sourceDatabaseRadioButton = view.modelBuilder.radioButton()
|
||||||
.withProperties({
|
.withProperties({
|
||||||
name: 'source',
|
name: 'source',
|
||||||
label: DatabaseRadioButtonLabel
|
label: DatabaseRadioButtonLabel
|
||||||
}).component();
|
}).component();
|
||||||
|
|
||||||
// show dacpac file browser
|
// show dacpac file browser
|
||||||
dacpacRadioButton.onDidClick(async () => {
|
this.sourceDacpacRadioButton.onDidClick(async () => {
|
||||||
this.sourceIsDacpac = true;
|
this.sourceIsDacpac = true;
|
||||||
this.formBuilder.removeFormItem(this.sourceNoActiveConnectionsText);
|
this.formBuilder.removeFormItem(this.sourceNoActiveConnectionsText);
|
||||||
this.formBuilder.removeFormItem(this.sourceServerComponent);
|
this.formBuilder.removeFormItem(this.sourceServerComponent);
|
||||||
@@ -369,7 +374,7 @@ export class SchemaCompareDialog {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// show server and db dropdowns or 'No active connections' text
|
// show server and db dropdowns or 'No active connections' text
|
||||||
databaseRadioButton.onDidClick(async () => {
|
this.sourceDatabaseRadioButton.onDidClick(async () => {
|
||||||
this.sourceIsDacpac = false;
|
this.sourceIsDacpac = false;
|
||||||
if ((this.sourceServerDropdown.value as ConnectionDropdownValue)) {
|
if ((this.sourceServerDropdown.value as ConnectionDropdownValue)) {
|
||||||
this.formBuilder.insertFormItem(this.sourceServerComponent, 2, { horizontal: true, titleFontSize: titleFontSize });
|
this.formBuilder.insertFormItem(this.sourceServerComponent, 2, { horizontal: true, titleFontSize: titleFontSize });
|
||||||
@@ -383,17 +388,15 @@ export class SchemaCompareDialog {
|
|||||||
|
|
||||||
// if source is currently a db, show it in the server and db dropdowns
|
// if source is currently a db, show it in the server and db dropdowns
|
||||||
if (this.schemaCompareResult.sourceEndpointInfo && this.schemaCompareResult.sourceEndpointInfo.endpointType === mssql.SchemaCompareEndpointType.Database) {
|
if (this.schemaCompareResult.sourceEndpointInfo && this.schemaCompareResult.sourceEndpointInfo.endpointType === mssql.SchemaCompareEndpointType.Database) {
|
||||||
databaseRadioButton.checked = true;
|
this.sourceDatabaseRadioButton.checked = true;
|
||||||
databaseRadioButton.focused = true;
|
|
||||||
this.sourceIsDacpac = false;
|
this.sourceIsDacpac = false;
|
||||||
} else {
|
} else {
|
||||||
dacpacRadioButton.checked = true;
|
this.sourceDacpacRadioButton.checked = true;
|
||||||
dacpacRadioButton.focused = true;
|
|
||||||
this.sourceIsDacpac = true;
|
this.sourceIsDacpac = true;
|
||||||
}
|
}
|
||||||
let flexRadioButtonsModel = view.modelBuilder.flexContainer()
|
let flexRadioButtonsModel = view.modelBuilder.flexContainer()
|
||||||
.withLayout({ flexFlow: 'column' })
|
.withLayout({ flexFlow: 'column' })
|
||||||
.withItems([dacpacRadioButton, databaseRadioButton]
|
.withItems([this.sourceDacpacRadioButton, this.sourceDatabaseRadioButton]
|
||||||
).component();
|
).component();
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
7
src/sql/azdata.d.ts
vendored
7
src/sql/azdata.d.ts
vendored
@@ -2646,6 +2646,11 @@ declare module 'azdata' {
|
|||||||
* Run the component's validations
|
* Run the component's validations
|
||||||
*/
|
*/
|
||||||
validate(): Thenable<boolean>;
|
validate(): Thenable<boolean>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Focuses the component.
|
||||||
|
*/
|
||||||
|
focus(): Thenable<void>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface FormComponent {
|
export interface FormComponent {
|
||||||
@@ -3088,7 +3093,6 @@ declare module 'azdata' {
|
|||||||
ariaRowCount?: number;
|
ariaRowCount?: number;
|
||||||
ariaColumnCount?: number;
|
ariaColumnCount?: number;
|
||||||
ariaRole?: string;
|
ariaRole?: string;
|
||||||
focused?: boolean;
|
|
||||||
updateCells?: TableCell[];
|
updateCells?: TableCell[];
|
||||||
moveFocusOutWithTab?: boolean; //accessibility requirement for tables with no actionable cells
|
moveFocusOutWithTab?: boolean; //accessibility requirement for tables with no actionable cells
|
||||||
}
|
}
|
||||||
@@ -3123,7 +3127,6 @@ declare module 'azdata' {
|
|||||||
label?: string;
|
label?: string;
|
||||||
value?: string;
|
value?: string;
|
||||||
checked?: boolean;
|
checked?: boolean;
|
||||||
focused?: boolean;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface TextComponentProperties extends ComponentProperties, TitledComponentProperties {
|
export interface TextComponentProperties extends ComponentProperties, TitledComponentProperties {
|
||||||
|
|||||||
@@ -31,4 +31,5 @@ export interface IModelView extends IView {
|
|||||||
onEvent: Event<IModelViewEventArgs>;
|
onEvent: Event<IModelViewEventArgs>;
|
||||||
validate(componentId: string): Thenable<boolean>;
|
validate(componentId: string): Thenable<boolean>;
|
||||||
readonly onDestroy: Event<void>;
|
readonly onDestroy: Event<void>;
|
||||||
|
focus(componentId: string): void;
|
||||||
}
|
}
|
||||||
|
|||||||
5
src/sql/sqlops.proposed.d.ts
vendored
5
src/sql/sqlops.proposed.d.ts
vendored
@@ -183,6 +183,11 @@ declare module 'sqlops' {
|
|||||||
* Run the component's validations
|
* Run the component's validations
|
||||||
*/
|
*/
|
||||||
validate(): Thenable<boolean>;
|
validate(): Thenable<boolean>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Focuses the component.
|
||||||
|
*/
|
||||||
|
focus(): Thenable<void>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface FormComponent {
|
export interface FormComponent {
|
||||||
|
|||||||
@@ -97,6 +97,10 @@ export class MainThreadModelView extends Disposable implements MainThreadModelVi
|
|||||||
return new Promise(resolve => this.execModelViewAction(handle, (modelView) => resolve(modelView.validate(componentId))));
|
return new Promise(resolve => this.execModelViewAction(handle, (modelView) => resolve(modelView.validate(componentId))));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$focus(handle: number, componentId: string): Thenable<void> {
|
||||||
|
return new Promise(resolve => this.execModelViewAction(handle, (modelView) => resolve(modelView.focus(componentId))));
|
||||||
|
}
|
||||||
|
|
||||||
private runCustomValidations(handle: number, componentId: string): Thenable<boolean> {
|
private runCustomValidations(handle: number, componentId: string): Thenable<boolean> {
|
||||||
return this._proxy.$runCustomValidations(handle, componentId);
|
return this._proxy.$runCustomValidations(handle, componentId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -711,6 +711,10 @@ class ComponentWrapper implements azdata.Component {
|
|||||||
public get valid(): boolean {
|
public get valid(): boolean {
|
||||||
return this._valid;
|
return this._valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public focus() {
|
||||||
|
return this._proxy.$focus(this._handle, this._id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ComponentWithIconWrapper extends ComponentWrapper {
|
class ComponentWithIconWrapper extends ComponentWrapper {
|
||||||
@@ -1144,12 +1148,6 @@ class RadioButtonWrapper extends ComponentWrapper implements azdata.RadioButtonC
|
|||||||
public set checked(v: boolean) {
|
public set checked(v: boolean) {
|
||||||
this.setProperty('checked', v);
|
this.setProperty('checked', v);
|
||||||
}
|
}
|
||||||
public get focused(): boolean {
|
|
||||||
return this.properties['focused'];
|
|
||||||
}
|
|
||||||
public set focused(v: boolean) {
|
|
||||||
this.setProperty('focused', v);
|
|
||||||
}
|
|
||||||
|
|
||||||
public get onDidClick(): vscode.Event<any> {
|
public get onDidClick(): vscode.Event<any> {
|
||||||
let emitter = this._emitterMap.get(ComponentEventType.onDidClick);
|
let emitter = this._emitterMap.get(ComponentEventType.onDidClick);
|
||||||
@@ -1266,13 +1264,6 @@ class TableComponentWrapper extends ComponentWrapper implements azdata.TableComp
|
|||||||
this.setProperty('moveFocusOutWithTab', v);
|
this.setProperty('moveFocusOutWithTab', v);
|
||||||
}
|
}
|
||||||
|
|
||||||
public get focused(): boolean {
|
|
||||||
return this.properties['focused'];
|
|
||||||
}
|
|
||||||
public set focused(v: boolean) {
|
|
||||||
this.setProperty('focused', v);
|
|
||||||
}
|
|
||||||
|
|
||||||
public get updateCells(): azdata.TableCell[] {
|
public get updateCells(): azdata.TableCell[] {
|
||||||
return this.properties['updateCells'];
|
return this.properties['updateCells'];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -736,6 +736,7 @@ export interface MainThreadModelViewShape extends IDisposable {
|
|||||||
$validate(handle: number, componentId: string): Thenable<boolean>;
|
$validate(handle: number, componentId: string): Thenable<boolean>;
|
||||||
$setDataProvider(handle: number, componentId: string): Thenable<void>;
|
$setDataProvider(handle: number, componentId: string): Thenable<void>;
|
||||||
$refreshDataProvider(handle: number, componentId: string, item?: any): Thenable<void>;
|
$refreshDataProvider(handle: number, componentId: string, item?: any): Thenable<void>;
|
||||||
|
$focus(handle: number, componentId: string): Thenable<void>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ExtHostObjectExplorerShape {
|
export interface ExtHostObjectExplorerShape {
|
||||||
|
|||||||
@@ -125,6 +125,10 @@ export default class ButtonComponent extends ComponentWithIconBase implements IC
|
|||||||
this._changeRef.detectChanges();
|
this._changeRef.detectChanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public focus(): void {
|
||||||
|
this._button.focus();
|
||||||
|
}
|
||||||
|
|
||||||
protected updateIcon() {
|
protected updateIcon() {
|
||||||
if (this.iconPath) {
|
if (this.iconPath) {
|
||||||
if (!this._iconClass) {
|
if (!this._iconClass) {
|
||||||
|
|||||||
@@ -105,4 +105,8 @@ export default class CheckBoxComponent extends ComponentBase implements ICompone
|
|||||||
private set label(newValue: string) {
|
private set label(newValue: string) {
|
||||||
this.setPropertyFromUI<azdata.CheckBoxProperties, string>((properties, label) => { properties.label = label; }, newValue);
|
this.setPropertyFromUI<azdata.CheckBoxProperties, string>((properties, label) => { properties.label = label; }, newValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public focus(): void {
|
||||||
|
this._input.focus();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -262,6 +262,12 @@ export abstract class ComponentBase extends Disposable implements IComponent, On
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public focus(): void {
|
||||||
|
// Default is to just focus on the native element, components should override this if they
|
||||||
|
// want their own behavior (such as focusing a particular child element)
|
||||||
|
(<HTMLElement>this._el.nativeElement).focus();
|
||||||
|
}
|
||||||
|
|
||||||
protected onkeydown(domNode: HTMLElement, listener: (e: IKeyboardEvent) => void): void {
|
protected onkeydown(domNode: HTMLElement, listener: (e: IKeyboardEvent) => void): void {
|
||||||
this._register(addDisposableListener(domNode, EventType.KEY_DOWN, (e: KeyboardEvent) => listener(new StandardKeyboardEvent(e))));
|
this._register(addDisposableListener(domNode, EventType.KEY_DOWN, (e: KeyboardEvent) => listener(new StandardKeyboardEvent(e))));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -325,4 +325,8 @@ export default class InputBoxComponent extends ComponentBase implements ICompone
|
|||||||
public set stopEnterPropagation(newValue: boolean) {
|
public set stopEnterPropagation(newValue: boolean) {
|
||||||
this.setPropertyFromUI<azdata.InputBoxProperties, boolean>((props, value) => props.stopEnterPropagation = value, newValue);
|
this.setPropertyFromUI<azdata.InputBoxProperties, boolean>((props, value) => props.stopEnterPropagation = value, newValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public focus(): void {
|
||||||
|
this.inputElement.focus();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ export interface IComponent extends IDisposable {
|
|||||||
validate(): Thenable<boolean>;
|
validate(): Thenable<boolean>;
|
||||||
setDataProvider(handle: number, componentId: string, context: any): void;
|
setDataProvider(handle: number, componentId: string, context: any): void;
|
||||||
refreshDataProvider(item: any): void;
|
refreshDataProvider(item: any): void;
|
||||||
|
focus(): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const COMPONENT_CONFIG = new InjectionToken<IComponentConfig>('component_config');
|
export const COMPONENT_CONFIG = new InjectionToken<IComponentConfig>('component_config');
|
||||||
|
|||||||
@@ -75,7 +75,6 @@ export default class RadioButtonComponent extends ComponentBase implements IComp
|
|||||||
this._input.label = this.label;
|
this._input.label = this.label;
|
||||||
this._input.enabled = this.enabled;
|
this._input.enabled = this.enabled;
|
||||||
this._input.checked = this.checked;
|
this._input.checked = this.checked;
|
||||||
this.focused ? this._input.focus() : this._input.blur();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CSS-bound properties
|
// CSS-bound properties
|
||||||
@@ -116,11 +115,8 @@ export default class RadioButtonComponent extends ComponentBase implements IComp
|
|||||||
this.setPropertyFromUI<azdata.RadioButtonProperties, string>((properties, label) => { properties.name = label; }, newValue);
|
this.setPropertyFromUI<azdata.RadioButtonProperties, string>((properties, label) => { properties.name = label; }, newValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
public get focused(): boolean {
|
public focus(): void {
|
||||||
return this.getPropertyOrDefault<azdata.RadioButtonProperties, boolean>((props) => props.focused, false);
|
this._input.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
public set focused(newValue: boolean) {
|
|
||||||
this.setPropertyFromUI<azdata.RadioButtonProperties, boolean>((properties, value) => { properties.focused = value; }, newValue);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -252,10 +252,6 @@ export default class TableComponent extends ComponentBase implements IComponent,
|
|||||||
this._table.ariaRole = this.ariaRole;
|
this._table.ariaRole = this.ariaRole;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.focused) {
|
|
||||||
this._table.focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.updateCells !== undefined) {
|
if (this.updateCells !== undefined) {
|
||||||
this.updateTableCells(this.updateCells);
|
this.updateTableCells(this.updateCells);
|
||||||
}
|
}
|
||||||
@@ -368,14 +364,6 @@ export default class TableComponent extends ComponentBase implements IComponent,
|
|||||||
return this.getPropertyOrDefault<azdata.TableComponentProperties, boolean>((props) => props.moveFocusOutWithTab, false);
|
return this.getPropertyOrDefault<azdata.TableComponentProperties, boolean>((props) => props.moveFocusOutWithTab, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public get focused(): boolean {
|
|
||||||
return this.getPropertyOrDefault<azdata.RadioButtonProperties, boolean>((props) => props.focused, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public set focused(newValue: boolean) {
|
|
||||||
this.setPropertyFromUI<azdata.RadioButtonProperties, boolean>((properties, value) => { properties.focused = value; }, newValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
public get updateCells(): azdata.TableCell[] {
|
public get updateCells(): azdata.TableCell[] {
|
||||||
return this.getPropertyOrDefault<azdata.TableComponentProperties, azdata.TableCell[]>((props) => props.updateCells, undefined);
|
return this.getPropertyOrDefault<azdata.TableComponentProperties, azdata.TableCell[]>((props) => props.updateCells, undefined);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -146,4 +146,8 @@ export abstract class ViewBase extends AngularDisposable implements IModelView {
|
|||||||
public setDataProvider(handle: number, componentId: string, context: any): any {
|
public setDataProvider(handle: number, componentId: string, context: any): any {
|
||||||
return this.queueAction(componentId, (component) => component.setDataProvider(handle, componentId, context));
|
return this.queueAction(componentId, (component) => component.setDataProvider(handle, componentId, context));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public focus(componentId: string): void {
|
||||||
|
return this.queueAction(componentId, (component) => component.focus());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user