ag-grid
Version:
Advanced Javascript Datagrid. Supports raw Javascript, AngularJS 1.x, AngularJS 2.0 and Web Components
222 lines (197 loc) • 8.16 kB
text/typescript
/// <reference path="../utils.ts" />
/// <reference path="textAndNumberFilterParameters.ts" />
module ag.grid {
var utils = Utils;
var template =
'<div>'+
'<div>'+
'<select class="ag-filter-select" id="filterType">'+
'<option value="1">[CONTAINS]</option>'+
'<option value="2">[EQUALS]</option>'+
'<option value="3">[STARTS WITH]</option>'+
'<option value="4">[ENDS WITH]</option>'+
'</select>'+
'</div>'+
'<div>'+
'<input class="ag-filter-filter" id="filterText" type="text" placeholder="[FILTER...]"/>'+
'</div>'+
'<div class="ag-filter-apply-panel" id="applyPanel">'+
'<button type="button" id="applyButton">[APPLY FILTER]</button>' +
'</div>'+
'</div>';
var CONTAINS = 1;
var EQUALS = 2;
var STARTS_WITH = 3;
var ENDS_WITH = 4;
export class TextFilter implements Filter {
private filterParams: any;
private filterChangedCallback: any;
private filterModifiedCallback: any;
private localeTextFunc: any;
private valueGetter: any;
private filterText: any;
private filterType: any;
private api: any;
private eGui: any;
private eFilterTextField: any;
private eTypeSelect: any;
private applyActive: any;
private eApplyButton: any;
public init(params: any): void {
this.filterParams = params.filterParams;
this.applyActive = this.filterParams && this.filterParams.apply == true;
this.filterChangedCallback = params.filterChangedCallback;
this.filterModifiedCallback = params.filterModifiedCallback;
this.localeTextFunc = params.localeTextFunc;
this.valueGetter = params.valueGetter;
this.createGui();
this.filterText = null;
this.filterType = CONTAINS;
this.createApi();
}
public onNewRowsLoaded() {
var keepSelection = this.filterParams && this.filterParams.newRowsAction === 'keep';
if (!keepSelection) {
this.api.setType(CONTAINS);
this.api.setFilter(null);
}
}
public afterGuiAttached() {
this.eFilterTextField.focus();
}
public doesFilterPass(node: any) {
if (!this.filterText) {
return true;
}
var value = this.valueGetter(node);
if (!value) {
return false;
}
var valueLowerCase = value.toString().toLowerCase();
switch (this.filterType) {
case CONTAINS:
return valueLowerCase.indexOf(this.filterText) >= 0;
case EQUALS:
return valueLowerCase === this.filterText;
case STARTS_WITH:
return valueLowerCase.indexOf(this.filterText) === 0;
case ENDS_WITH:
var index = valueLowerCase.indexOf(this.filterText);
return index >= 0 && index === (valueLowerCase.length - this.filterText.length);
default:
// should never happen
console.warn('invalid filter type ' + this.filterType);
return false;
}
}
public getGui() {
return this.eGui;
}
public isFilterActive() {
return this.filterText !== null;
}
private createTemplate() {
return template
.replace('[FILTER...]', this.localeTextFunc('filterOoo', 'Filter...'))
.replace('[EQUALS]', this.localeTextFunc('equals', 'Equals'))
.replace('[CONTAINS]', this.localeTextFunc('contains', 'Contains'))
.replace('[STARTS WITH]', this.localeTextFunc('startsWith', 'Starts with'))
.replace('[ENDS WITH]', this.localeTextFunc('endsWith', 'Ends with'))
.replace('[APPLY FILTER]', this.localeTextFunc('applyFilter', 'Apply Filter'));
}
private createGui() {
this.eGui = utils.loadTemplate(this.createTemplate());
this.eFilterTextField = this.eGui.querySelector("#filterText");
this.eTypeSelect = this.eGui.querySelector("#filterType");
utils.addChangeListener(this.eFilterTextField, this.onFilterChanged.bind(this));
this.eTypeSelect.addEventListener("change", this.onTypeChanged.bind(this));
this.setupApply();
}
private setupApply() {
if (this.applyActive) {
this.eApplyButton = this.eGui.querySelector('#applyButton');
this.eApplyButton.addEventListener('click', () => {
this.filterChangedCallback();
});
} else {
utils.removeElement(this.eGui, '#applyPanel');
}
}
private onTypeChanged() {
this.filterType = parseInt(this.eTypeSelect.value);
this.filterChanged();
}
private onFilterChanged() {
var filterText = utils.makeNull(this.eFilterTextField.value);
if (filterText && filterText.trim() === '') {
filterText = null;
}
var newFilterText: string;
if (filterText!==null && filterText!==undefined) {
newFilterText = filterText.toLowerCase();
} else {
newFilterText = null;
}
if (this.filterText !== newFilterText) {
this.filterText = newFilterText;
this.filterChanged();
}
}
private filterChanged() {
this.filterModifiedCallback();
if (!this.applyActive) {
this.filterChangedCallback();
}
}
private createApi() {
var that = this;
this.api = {
EQUALS: EQUALS,
CONTAINS: CONTAINS,
STARTS_WITH: STARTS_WITH,
ENDS_WITH: ENDS_WITH,
setType: function (type: any) {
that.filterType = type;
that.eTypeSelect.value = type;
},
setFilter: function (filter: any) {
filter = utils.makeNull(filter);
if (filter) {
that.filterText = filter.toLowerCase();
that.eFilterTextField.value = filter;
} else {
that.filterText = null;
that.eFilterTextField.value = null;
}
},
getType: function () {
return that.filterType;
},
getFilter: function () {
return that.filterText;
},
getModel: function () {
if (that.isFilterActive()) {
return {
type: that.filterType,
filter: that.filterText
};
} else {
return null;
}
},
setModel: function (dataModel: any) {
if (dataModel) {
this.setType(dataModel.type);
this.setFilter(dataModel.filter);
} else {
this.setFilter(null);
}
}
};
}
private getApi() {
return this.api;
}
}
}