I\'ve been trying to get this working with no luck. I\'ve been referencing these resources for help:
http://swimlane.github.io/ngx-datatable/#filter
https://github.com/swiml
import { DatatableComponent } from '@swimlane/ngx-datatable';
ViewChild(DatatableComponent) table: DatatableComponent;
updateFilter(event) {
const val = event.target.value.toLowerCase();
var returnData: any;
// filter our data
const temp = this.temp.filter(function (d) {
if (d.yourFirstColumnName.toLowerCase().indexOf(val) !== -1 || !val) {
returnData = d.user_name.toLowerCase().indexOf(val) !== -1 || !val;
} else if (d.yourSecondColumnName.toLowerCase().indexOf(val) !== -1 || !val) {
returnData = d.notes_title.toLowerCase().indexOf(val) !== -1 || !val;
}
return returnData;
});
<input placeholder="Search Order" (keyup)='updateFilter($event)'>
This answer improves an existing answer by Cole Paciano :
null
values are correctly handled (no console errors)Here are the steps:
In the template
(html) file add an input with a keyup
handler
Search:
<input type="text" (keyup)='filterDatatable($event)'>
<ngx-datatable
class="material"
[rows]="rows"
[columns]="columns"
headerHeight="35"
rowHeight ="35">
</ngx-datatable>
In the component
add the following filteredData
and columnsWithSearch
export class ListParkingsComponent implements OnInit {
columns = [];
rows = [];
filteredData = [];
columnsWithSearch : string[] = [];
ngOnInit() {
this.rows = getData() ; //recover data from API/database/datasource
this.filteredData = this.rows;
// for specific columns to be search instead of all you can list them by name
this.columnsWithSearch = Object.keys(this.rows[0]);
}
getData() {
//your current logic to fill the rows of the table
}
// filters results
filterDatatable(event){
// get the value of the key pressed and make it lowercase
let filter = event.target.value.toLowerCase();
// assign filtered matches to the active datatable
this.rows = this.filteredData.filter(item => {
// iterate through each row's column data
for (let i = 0; i < this.columnsWithSearch.length; i++){
var colValue = item[this.columnsWithSearch[i]] ;
// if no filter OR colvalue is NOT null AND contains the given filter
if (!filter || (!!colValue && colValue.toString().toLowerCase().indexOf(filter) !== -1)) {
// found match, return true to add to result set
return true;
}
}
});
// TODO - whenever the filter changes, always go back to the first page
//this.table.offset = 0;
}
here is an example of your code with multiple columns filtering:
updateFilter(filter: string): void {
const val = filter.trim().toLowerCase();
this.filteredList = this.items.slice().filter((item: any) => {
let searchStr = '';
for (let i = 0; i < this.gridProperties.FilteredColumns.length; i++) {
searchStr += (item[this.gridProperties.FilteredColumns[i]]).toString().toLowerCase();
}
return searchStr.indexOf(val) !== -1 || !val;
});
}
If I did not made any errors, it should work correctly.
updateFilter(event) {
const val = event.target.value.toLowerCase();
const temp = this.temp.filter(index => {
return (index.name.toLowerCase().indexOf(val) !== -1 ||
index.company.toLowerCase().indexOf(val) !== -1 ||
index.gender.toLowerCase().indexOf(val) !== -1 ||
!val);
});
this.company = temp;
this.table.offset = 0;
}
You might be helped
<input
type="text"
style="padding:8px;margin:15px auto;width:30%;"
placeholder="Type to filter the name column..."
(keyup)="updateFilter($event)"
/>
<ngx-datatable
#table
class="material"
[columns]="columns"
[columnMode]="ColumnMode.force"
[headerHeight]="50"
[footerHeight]="50"
rowHeight="auto"
[limit]="10"
[rows]="rows"
>
</ngx-datatable>
updateFilter(event) {
const val = event.target.value.toLowerCase();
// filter our data
const temp = this.temp.filter(function(d) {
return d.name.toLowerCase().indexOf(val) !== -1 ||
d.address.toLowerCase().indexOf(val) !== -1 ||
d.gender.toLowerCase().indexOf(val) !== -1 || !val;
});
// update the rows
this.rows = temp;
// Whenever the filter changes, always go back to the first page
this.table.offset = 0;
}
https://github.com/swimlane/ngx-datatable/blob/master/src/app/basic/dark-theme.component.ts
Using the example TS file for filtering (https://github.com/swimlane/ngx-datatable/blob/master/demo/basic/filter.component.ts) as a foundation, I was able to successfully make it filter all columns dynamically (it will filter all columns without the need to specify them). I've included what I believe to be all the necessary parts for this to work but also trimmed the code down as much as I could to make it easier to understand.
HTML
<ngx-datatable
#table
class="material striped scroll-vertical"
[rows]="data"
[columns]="cols"
[columnMode]="'force'"
[headerHeight]="35"
[footerHeight]="35"
[rowHeight]="'auto'"
[limit]="pageSize"
[selectionType]="'single'">
<input type="text" (keyup)='filterDatatable($event)'>
TYPESCRIPT
cols = [{name:'First Name'},{name:'Last Name'},{name:'Address'}];
data = [];
filteredData = [];
// dummy data for datatable rows
dummyData = [
{firstName:'Daenarys',lastName:'Targaryen',address:'Dragonstone'},
{firstName:'Sansa',lastName:'Stark',address:'Winterfell'},
{firstName:'Cersei',lastName:'Lannister',address:'Kings Landing'},
{firstName:'Brienne',lastName:'Tarth',address:'Sapphire Island'},
{firstName:'Lyanna',lastName:'Mormont',address:'Bear Island'},
{firstName:'Margaery',lastName:'Tyrell',address:'Highgarden'}
]
ngOnInit(){
// populate datatable rows
this.data = this.dummyData;
// copy over dataset to empty object
this.filteredData = this.dummyData;
}
// filters results
filterDatatable(event){
// get the value of the key pressed and make it lowercase
let val = event.target.value.toLowerCase();
// get the amount of columns in the table
let colsAmt = this.cols.length;
// get the key names of each column in the dataset
let keys = Object.keys(this.dummyData[0]);
// assign filtered matches to the active datatable
this.data = this.filteredData.filter(function(item){
// iterate through each row's column data
for (let i=0; i<colsAmt; i++){
// check for a match
if (item[keys[i]].toString().toLowerCase().indexOf(val) !== -1 || !val){
// found match, return true to add to result set
return true;
}
}
});
// whenever the filter changes, always go back to the first page
this.table.offset = 0;
}