diff --git a/src/sql/base/browser/ui/table/plugins/headerFilter.plugin.ts b/src/sql/base/browser/ui/table/plugins/headerFilter.plugin.ts index 4762bb68e8..f299a0634d 100644 --- a/src/sql/base/browser/ui/table/plugins/headerFilter.plugin.ts +++ b/src/sql/base/browser/ui/table/plugins/headerFilter.plugin.ts @@ -10,7 +10,7 @@ import { escape } from 'sql/base/common/strings'; import { addDisposableListener } from 'vs/base/browser/dom'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { withNullAsUndefined } from 'vs/base/common/types'; -import { IDisposableDataProvider } from 'sql/base/common/dataProvider'; +import { instanceOfIDisposableDataProvider } from 'sql/base/common/dataProvider'; import { IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview'; import { IInputBoxStyles, InputBox } from 'sql/base/browser/ui/inputBox/inputBox'; import { trapKeyboardNavigation } from 'sql/base/browser/dom'; @@ -224,13 +224,13 @@ export class HeaderFilter { let filterItems: Array; - const provider = this.grid.getData() as IDisposableDataProvider; + const dataView = this.grid.getData() as Slick.DataProvider; - if (provider.getColumnValues) { + if (instanceOfIDisposableDataProvider(dataView)) { if (this.workingFilters.length === 0) { - filterItems = await provider.getColumnValues(this.columnDef); + filterItems = await dataView.getColumnValues(this.columnDef); } else { - filterItems = await provider.getFilteredColumnValues(this.columnDef); + filterItems = await dataView.getFilteredColumnValues(this.columnDef); } } else { if (this.workingFilters.length === 0) { @@ -287,7 +287,7 @@ export class HeaderFilter { this.clearButton.label = localize('headerFilter.clear', "Clear"); this.clearButton.title = localize('headerFilter.clear', "Clear"); this.clearButton.element.id = 'filter-clear-button'; - this.okButton.onDidClick(() => { + this.clearButton.onDidClick(() => { this.columnDef.filterValues!.length = 0; this.setButtonImage($menuButton, false); this.handleApply(this.columnDef); @@ -378,10 +378,9 @@ export class HeaderFilter { private handleApply(columnDef: Slick.Column) { this.hideMenu(); - const provider = this.grid.getData() as IDisposableDataProvider; - - if (provider.filter) { - provider.filter(this.grid.getColumns()); + const dataView = this.grid.getData(); + if (instanceOfIDisposableDataProvider(dataView)) { + dataView.filter(this.grid.getColumns()); this.grid.invalidateAllRows(); this.grid.updateRowCount(); this.grid.render(); @@ -401,11 +400,11 @@ export class HeaderFilter { } private async getFilterValuesByInput(column: Slick.Column, filter: string): Promise> { - const dataView = this.grid.getData() as IDisposableDataProvider, + const dataView = this.grid.getData() as Slick.DataProvider, seen: Set = new Set(); let columnValues: any[]; - if (dataView.getColumnValues) { + if (instanceOfIDisposableDataProvider(dataView)) { columnValues = await dataView.getColumnValues(this.columnDef); } else { columnValues = dataView.getItems().map(item => item[column.field]); @@ -442,10 +441,9 @@ export class HeaderFilter { private async handleMenuItemClick(command: HeaderFilterCommands, columnDef: Slick.Column) { this.hideMenu(); - const provider = this.grid.getData() as IDisposableDataProvider; - - if (provider.sort && (command === 'sort-asc' || command === 'sort-desc')) { - await provider.sort({ + const dataView = this.grid.getData(); + if (instanceOfIDisposableDataProvider(dataView) && (command === 'sort-asc' || command === 'sort-desc')) { + await dataView.sort({ grid: this.grid, multiColumnSort: false, sortCol: this.columnDef, @@ -455,6 +453,7 @@ export class HeaderFilter { this.grid.updateRowCount(); this.grid.render(); } + this.onCommand.notify({ grid: this.grid, column: columnDef, diff --git a/src/sql/base/common/dataProvider.ts b/src/sql/base/common/dataProvider.ts index 7c984f2268..cd1bda3dc4 100644 --- a/src/sql/base/common/dataProvider.ts +++ b/src/sql/base/common/dataProvider.ts @@ -59,3 +59,11 @@ export interface IDisposableDataProvider extends Slick.DataProvider { */ readonly isDataInMemory: boolean; } + +/** + * Check whether the object is an instance of IDisposableDataProvider + */ +export function instanceOfIDisposableDataProvider(obj: any): obj is IDisposableDataProvider { + const provider = obj as IDisposableDataProvider; + return obj && provider.dispose && provider.sort && provider.isDataInMemory !== undefined; +}