PROEDITOR-46: Added a core auto-installer.

Signed-off-by: Akos Kitta <kittaakos@typefox.io>
This commit is contained in:
Akos Kitta
2019-10-16 11:00:44 +02:00
parent fb6785c5d3
commit de1caf1451
5 changed files with 93 additions and 3 deletions

View File

@@ -1,5 +1,6 @@
import * as React from 'react';
import debounce = require('lodash.debounce');
import { Event } from '@theia/core/lib/common/event';
import { Searchable } from '../../../common/protocol/searchable';
import { Installable } from '../../../common/protocol/installable';
import { InstallationProgressDialog } from '../installation-progress-dialog';
@@ -20,6 +21,7 @@ export class FilterableListContainer<T> extends React.Component<FilterableListCo
componentWillMount(): void {
this.search = debounce(this.search, 500);
this.handleFilterTextChange('');
this.props.filterTextChangeEvent(this.handleFilterTextChange.bind(this));
}
render(): React.ReactNode {
@@ -57,8 +59,8 @@ export class FilterableListContainer<T> extends React.Component<FilterableListCo
this.setState({ filterText });
this.search(filterText);
}
protected search (query: string): void {
protected search(query: string): void {
const { searchable } = this.props;
searchable.search({ query: query.trim() }).then(result => {
const { items } = result;
@@ -97,6 +99,7 @@ export namespace FilterableListContainer {
readonly itemRenderer: ListItemRenderer<T>;
readonly resolveContainer: (element: HTMLElement) => void;
readonly resolveFocus: (element: HTMLElement | undefined) => void;
readonly filterTextChangeEvent: Event<string>;
}
export interface State<T> {

View File

@@ -2,6 +2,7 @@ import * as React from 'react';
import { injectable, postConstruct } from 'inversify';
import { Message } from '@phosphor/messaging';
import { Deferred } from '@theia/core/lib/common/promise-util';
import { Emitter } from '@theia/core/lib/common/event';
import { MaybePromise } from '@theia/core/lib/common/types';
import { ReactWidget } from '@theia/core/lib/browser/widgets/react-widget';
import { Installable } from '../../../common/protocol/installable';
@@ -17,6 +18,7 @@ export abstract class ListWidget<T> extends ReactWidget {
*/
protected focusNode: HTMLElement | undefined;
protected readonly deferredContainer = new Deferred<HTMLElement>();
protected readonly filterTextChangeEmitter = new Emitter<string>();
constructor(protected options: ListWidget.Options<T>) {
super();
@@ -31,6 +33,7 @@ export abstract class ListWidget<T> extends ReactWidget {
this.scrollOptions = {
suppressScrollX: true
}
this.toDispose.push(this.filterTextChangeEmitter);
}
@postConstruct()
@@ -63,7 +66,12 @@ export abstract class ListWidget<T> extends ReactWidget {
searchable={this.options.searchable}
installable={this.options.installable}
itemLabel={this.options.itemLabel}
itemRenderer={this.options.itemRenderer} />;
itemRenderer={this.options.itemRenderer}
filterTextChangeEvent={this.filterTextChangeEmitter.event}/>;
}
refresh(filterText: string): void {
this.deferredContainer.promise.then(() => this.filterTextChangeEmitter.fire(filterText));
}
}