fix filter not applied issue (#15186)

This commit is contained in:
Alan Ren
2021-04-19 13:46:17 -07:00
committed by GitHub
parent e3ef4e1755
commit 1914546553
2 changed files with 23 additions and 16 deletions

View File

@@ -10,7 +10,7 @@ import { escape } from 'sql/base/common/strings';
import { addDisposableListener } from 'vs/base/browser/dom'; import { addDisposableListener } from 'vs/base/browser/dom';
import { DisposableStore } from 'vs/base/common/lifecycle'; import { DisposableStore } from 'vs/base/common/lifecycle';
import { withNullAsUndefined } from 'vs/base/common/types'; 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 { IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview';
import { IInputBoxStyles, InputBox } from 'sql/base/browser/ui/inputBox/inputBox'; import { IInputBoxStyles, InputBox } from 'sql/base/browser/ui/inputBox/inputBox';
import { trapKeyboardNavigation } from 'sql/base/browser/dom'; import { trapKeyboardNavigation } from 'sql/base/browser/dom';
@@ -224,13 +224,13 @@ export class HeaderFilter<T extends Slick.SlickData> {
let filterItems: Array<string>; let filterItems: Array<string>;
const provider = this.grid.getData() as IDisposableDataProvider<T>; const dataView = this.grid.getData() as Slick.DataProvider<T>;
if (provider.getColumnValues) { if (instanceOfIDisposableDataProvider(dataView)) {
if (this.workingFilters.length === 0) { if (this.workingFilters.length === 0) {
filterItems = await provider.getColumnValues(this.columnDef); filterItems = await dataView.getColumnValues(this.columnDef);
} else { } else {
filterItems = await provider.getFilteredColumnValues(this.columnDef); filterItems = await dataView.getFilteredColumnValues(this.columnDef);
} }
} else { } else {
if (this.workingFilters.length === 0) { if (this.workingFilters.length === 0) {
@@ -287,7 +287,7 @@ export class HeaderFilter<T extends Slick.SlickData> {
this.clearButton.label = localize('headerFilter.clear', "Clear"); this.clearButton.label = localize('headerFilter.clear', "Clear");
this.clearButton.title = localize('headerFilter.clear', "Clear"); this.clearButton.title = localize('headerFilter.clear', "Clear");
this.clearButton.element.id = 'filter-clear-button'; this.clearButton.element.id = 'filter-clear-button';
this.okButton.onDidClick(() => { this.clearButton.onDidClick(() => {
this.columnDef.filterValues!.length = 0; this.columnDef.filterValues!.length = 0;
this.setButtonImage($menuButton, false); this.setButtonImage($menuButton, false);
this.handleApply(this.columnDef); this.handleApply(this.columnDef);
@@ -378,10 +378,9 @@ export class HeaderFilter<T extends Slick.SlickData> {
private handleApply(columnDef: Slick.Column<T>) { private handleApply(columnDef: Slick.Column<T>) {
this.hideMenu(); this.hideMenu();
const provider = this.grid.getData() as IDisposableDataProvider<T>; const dataView = this.grid.getData();
if (instanceOfIDisposableDataProvider(dataView)) {
if (provider.filter) { dataView.filter(this.grid.getColumns());
provider.filter(this.grid.getColumns());
this.grid.invalidateAllRows(); this.grid.invalidateAllRows();
this.grid.updateRowCount(); this.grid.updateRowCount();
this.grid.render(); this.grid.render();
@@ -401,11 +400,11 @@ export class HeaderFilter<T extends Slick.SlickData> {
} }
private async getFilterValuesByInput(column: Slick.Column<T>, filter: string): Promise<Array<string>> { private async getFilterValuesByInput(column: Slick.Column<T>, filter: string): Promise<Array<string>> {
const dataView = this.grid.getData() as IDisposableDataProvider<T>, const dataView = this.grid.getData() as Slick.DataProvider<T>,
seen: Set<any> = new Set(); seen: Set<any> = new Set();
let columnValues: any[]; let columnValues: any[];
if (dataView.getColumnValues) { if (instanceOfIDisposableDataProvider(dataView)) {
columnValues = await dataView.getColumnValues(this.columnDef); columnValues = await dataView.getColumnValues(this.columnDef);
} else { } else {
columnValues = dataView.getItems().map(item => item[column.field]); columnValues = dataView.getItems().map(item => item[column.field]);
@@ -442,10 +441,9 @@ export class HeaderFilter<T extends Slick.SlickData> {
private async handleMenuItemClick(command: HeaderFilterCommands, columnDef: Slick.Column<T>) { private async handleMenuItemClick(command: HeaderFilterCommands, columnDef: Slick.Column<T>) {
this.hideMenu(); this.hideMenu();
const provider = this.grid.getData() as IDisposableDataProvider<T>; const dataView = this.grid.getData();
if (instanceOfIDisposableDataProvider<T>(dataView) && (command === 'sort-asc' || command === 'sort-desc')) {
if (provider.sort && (command === 'sort-asc' || command === 'sort-desc')) { await dataView.sort({
await provider.sort({
grid: this.grid, grid: this.grid,
multiColumnSort: false, multiColumnSort: false,
sortCol: this.columnDef, sortCol: this.columnDef,
@@ -455,6 +453,7 @@ export class HeaderFilter<T extends Slick.SlickData> {
this.grid.updateRowCount(); this.grid.updateRowCount();
this.grid.render(); this.grid.render();
} }
this.onCommand.notify({ this.onCommand.notify({
grid: this.grid, grid: this.grid,
column: columnDef, column: columnDef,

View File

@@ -59,3 +59,11 @@ export interface IDisposableDataProvider<T> extends Slick.DataProvider<T> {
*/ */
readonly isDataInMemory: boolean; readonly isDataInMemory: boolean;
} }
/**
* Check whether the object is an instance of IDisposableDataProvider
*/
export function instanceOfIDisposableDataProvider<T>(obj: any): obj is IDisposableDataProvider<T> {
const provider = obj as IDisposableDataProvider<T>;
return obj && provider.dispose && provider.sort && provider.isDataInMemory !== undefined;
}