angular-5-data-table icon indicating copy to clipboard operation
angular-5-data-table copied to clipboard

Filtering concept in angular-5-data-table?

Open prakashkaruppiah opened this issue 7 years ago • 4 comments

Can we use filtering concept in angular-5-data-table?Please help us.

prakashkaruppiah avatar Feb 20 '18 11:02 prakashkaruppiah

I just want to second this request. I've tried many data tables for Angular, and this is the only that I was able to get working without issues. Unfortunately I must be able to filter the data set using Angular pipes (or some other method) or I can't use this. If there is a simple solution, please post. If not, at least let us know so we can go find some other solution. Thanks!

eappell avatar Feb 22 '18 18:02 eappell

I tried lodash filter pipe concept. its working but we need to do some customization. Please see my code Data-filter-pipe.ts import * as _ from "lodash"; import {Pipe, PipeTransform} from "@angular/core"; @Pipe({ name: 'dataFilter', pure: false }) export class DataFilterPipe implements PipeTransform { transform(value: any, input: string, searchableList: any) { if (input) { input = input.toLowerCase(); return value.filter(function (el: any) { var isTrue = false; for (var k in searchableList) { if (el[searchableList[k]].toLowerCase().indexOf(input) > -1) { isTrue = true; } if (isTrue) { return el } } }) } return value; } } Then we need to add input search box to table.html under data-table -> components ->table.html folder

<input type="text" name="term" [(ngModel)]="term" />
Here we implement pipe filter to ng for loop

Table.ts import { Component, Input, Output, EventEmitter, ContentChildren, QueryList, TemplateRef, ContentChild, ViewChildren, OnInit,Pipe,PipeTransform } from '@angular/core'; import {DataFilterPipe} from "../data-filter.pipe"; @Pipe({ name:'dataFilter', pure: false }) export class DataTable implements DataTableParams, OnInit { @Input() searchableList=[]; private _items: any[] = []; } Test-component.ts export class testcompaonent implements OnInit { searchableList=[]; ngOnInit(){ this.searchableList=[‘column1’,’column2’]; } }

prakashkaruppiah avatar Feb 26 '18 05:02 prakashkaruppiah

Hi prakashkaruppiah,

Can you give me the complete code of your code for filtering.

Thank you

Kushansameera avatar Jun 25 '18 10:06 Kushansameera

dataFilterpipe.ts

import * as _ from "lodash"; import {Pipe, PipeTransform} from "@angular/core";

@Pipe({ name: 'dataFilter', pure: false })

export class DataFilterPipe implements PipeTransform { finalValue:any; startvalue:boolean=false; transform(value: any, input: string, searchableList: any) { if(value!=undefined && value!=null && value!=0 && this.startvalue==false) { this.startvalue=true; this.finalValue=value; } if (input!="" && input !=null && input !=undefined) {
input = input.toLowerCase(); return this.finalValue.filter(function (el: any) { var isTrue = false; for (var k in searchableList) { if(el[searchableList[k]]!=null) { if (el[searchableList[k]].toLowerCase().indexOf(input) > -1) { isTrue = true; } if (isTrue) { return el } }

            }
        })
    }
    return value;
}

}

table.html

###
    </form>
    <data-table-header *ngIf="header"></data-table-header>
    <div class="table-responsive admin-tbl">
        <table class="table table-condensed table-bordered data-table"> 
           
            <thead>
                <tr>
                    <th [hide]="!expandColumnVisible" class="expand-column-header">
                <th  [hide]="!indexColumnVisible" class="index-column-header">
                    <span>S.No</span>
                    </th>
                <th [hide]="!selectColumnVisible" class="select-column-header">
                    <input [hide]="!multiSelect" type="checkbox"  [(ngModel)]="selectAllCheckbox"/>
                </th>                  
                
                    <th  *ngFor="let column of columns" #th [hide]="!column.visible"  (click)="headerClicked(column, $event)"
                        [class.sortable]="column.sortable" [class.resizable]="column.resizable"
                        [ngClass]="column.styleClassObject" class="column-header" [style.width]="column.width | px">
                        <span *ngIf="!column.headerTemplate" [textContent]="column.header"></span>
                        <span *ngIf="column.headerTemplate" [ngTemplateOutlet]="column.headerTemplate" [ngTemplateOutletContext]="{column: column}"></span>
                        <span class="column-sort-icon" *ngIf="column.sortable">
                            <span  [hide]="column.property === sortBy"></span>
                            <span [hide]="column.property !== sortBy">
                                <span class="fa  fa-long-arrow-down arrow" [hide]="sortAsc"></span>
                                <span class="fa fa-long-arrow-up arrow" [hide]="!sortAsc"></span>
                            </span>
                        </span>
                        <span *ngIf="column.resizable" class="column-resize-handle" (mousedown)="resizeColumnStart($event, column, th)"></span>
                    </th>
                </tr>
            </thead>
            <tbody   ### *ngFor="let item of items | dataFilter : term: searchableList; let index=index" class="data-table-row-wrapper"
            dataTableRow #row [item]="item"  [index]="index" (selectedChange)="onRowSelectChanged(row)">
            </tbody>
            <tbody *ngIf="itemCount === 0 && noDataMessage">
                    <tr>
                      <td [attr.colspan]="columnCount">{{ noDataMessage }}</td>
                    </tr>
                  </tbody>
            <tbody class="substitute-rows" *ngIf="pagination && substituteRows">
                <tr *ngFor="let item of substituteItems, let index = index"
                    [class.row-odd]="(index + items.length) % 2 === 0"
                    [class.row-even]="(index + items.length) % 2 === 1"
                    >
                    <td [hide]="!expandColumnVisible"></td>
                    <td [hide]="!indexColumnVisible">&nbsp;</td>
                    <td style="text-align: center;" [hide]="!selectColumnVisible"></td>
                    <td *ngFor="let column of columns" [hide]="!column.visible">
                    
            
                </tr>
            </tbody>
        </table>
       
    </div>
    <div class="loading-cover" *ngIf="showReloading && reloading"></div>
</div>

<data-table-pagination *ngIf="pagination"></data-table-pagination>

tableComponent.ts

import { Component, Input, Output, EventEmitter, ContentChildren, QueryList, TemplateRef, ContentChild, ViewChildren, OnInit,Pipe,PipeTransform } from '@angular/core'; import { DataTableColumn } from './column'; import { DataTableRow } from './row'; import { DataTableParams, RowCallback, DataTableTranslations, defaultTranslations } from './types'; import {DataFilterPipe} from "../data-filter.pipe";

@Pipe({ name:'dataFilter', pure: false })

@Component({ selector: 'data-table', templateUrl: './table.html', styleUrls: ['./table.css'] }) export class DataTable implements DataTableParams, OnInit { @Input() searchableList=[]; }

Test.Component.html

   <data-table id="films-Grid" ###  [searchableList]="searchableList"  [items]="Items"   [itemCount]="TotalItemCount" (reload)="reload($event)" (selectColumnproperty)="onSelectColumn($event)" 
                                
                                (rowClick)="rowClick($event)" [limit]="10" [sortBy]="'Code'" [sortAsc]="false" [selectColumn]="true"
                                [multiSelect]="false" [substituteRows]="false" [expandableRows]="false" [translations]="translations"
                                [indexColumnHeader]="'#'" [selectOnRowClick]="false" [rowTooltip]="rowTooltip">

                                <data-table-column [property]="'PI_Id'" [header]="'PI_Id'" [sortable]="false" [visible]="false"  [columnSelect]="false">
                                </data-table-column>
                                <data-table-column  [property]="'PI_Number'" [header]="'PI Number'" [sortable]="true" [width]="90" [visible]="APINumber">
                                </data-table-column>

Test.Component.ts

reload(params) { this.DataResource.query(params).then(Items => this.Items = Items); this.DataResource.count().then(count => this.TotalItemCount = count);

this.searchableList = ['PI_Number','ApprovedStatus'];

}

prakashkaruppiah avatar Jul 16 '18 04:07 prakashkaruppiah