wngx-filter
Version:
Angular 7 generic components for array filter in *ngFor directive.
280 lines (198 loc) • 7.35 kB
Markdown
# wngx-filter
Angular 7 generic components for array filter in *ngFor directive.
Original project (migrate from): [w-ng5](https://www.npmjs.com/package/w-ng5) -> lib release compatible with version angular ^5x.
# Objective
Filter records of your listings with simple strings using a single field or multiple fields on plan objects. Filter also by using fields in non-plan structured objects by observing one or more attributes or sub-attributes of these objects by browsing their OGNL properties.
# Details
Details about this project and user tutorial
## Composition package
* Generic Filter for using in directives ngFor
## How to install and configure
For use this components, before, install this package with [npm](https://www.npmjs.com/package/wngx-filter):
npm install wngx-filter --save
After, import module in app.module
...
import { WngxFilterModule, WfilterPipe } from 'wngx-filter';
In the next step, add in declare section of app.module:
imports: [
WngxFilterModule,
...
],
providers: [..., WfilterPipe, ...],
And, enjoy....
## Sample use
A **online examples** can be accessed at:
* [stackblitz - Sample Code](https://stackblitz.com/edit/angular-ivy-wngx-filter)
* [stackblitz - Article Demo Code](https://stackblitz.com/edit/article-demo)
### Domain model using in Samples
```
export interface Phone {
ddd: string;
number: number;
}
export interface Role {
id: string;
description: string;
}
export interface IUser {
nome: string;
idade: number;
phone: Phone;
roles: Role[] | null;
}
```
**Method provider data list of simple string for using in samples**
```
getStrings() {
const retorno = [];
for (let i = 0; i < 10; i++) {
retorno.push(`Item ${i}`);
}
return retorno;
}
```
**Method provider array complex data for using in samples:**
```
getComplexType(): IUser[] {
const retorno: IUser[] = [];
for (let i = 0; i < 10; i++) {
retorno.push({nome: `Nome ${i}`, idade: i});
}
retorno.push({nome: `Nómê com acêntó`, idade: 10});
retorno.push({nome: `Nómê com trëma`, idade: 10});
retorno.push({nome: `Nómê com pável`, idade: 10});
return retorno;
}
```
### Using in HTML
**Filter simple string array (no complex type):**
```
<label>String filter 0 - Simple string array (no complex type) </label>
<br>
<input type="text" [(ngModel)]="filter0">
<br>
<h5>Using simple string array filter</h5>
<ul>
<li *ngFor="let s of getStrings() | wfilter:filter0">
{{s}}
</li>
</ul>
<hr>
```
**Field filter in Level 1 (fields 'nome' and 'idade' of IUser interface):**
```
<label>String filter 1 - Field filter in Level 1</label>
<br>
<input type="text" [(ngModel)]="filter1">
<br>
<h5>Using complex type and field level 1 filter</h5>
<ul>
<li *ngFor="let s of getComplexType() | wfilter: [{field:'nome', value:filter1}, {field:'idade', value:filter1}]">
name: {{s.nome}} - idade: {{s.idade}} - phone.ddd: {{s.phone.ddd}} - phone.number: {{s.phone.number}}
</li>
</ul>
<hr>
```
**Field filter in Level 2 (String & Number) (fields 'ddd' and 'number' of 'phone' atribute of IUser interface):**
```
<label>String and Number filter 2 - Field filter in Level 2</label>
<br>
<input type="text" [(ngModel)]="filter2">
<br>
<h5>Using complex type and field level 2 filter</h5>
<ul>
<li *ngFor="let s of getComplexType() | wfilter: [{field:'phone.ddd', value:filter2}, {field:'phone.number', value:filter2}]">
name: {{s.nome}} - idade: {{s.idade}} - phone.ddd: {{s.phone.ddd}} - phone.number: {{s.phone.number}}
</li>
</ul>
<hr>
```
**Filter in all fields of object in all levels (String & Number):**
```
<label>String filter 3 - Any Fileds of Object filter</label>
<br>
<input type="text" [(ngModel)]="filter3">
<br>
<h5>Using complex type and any field filter</h5>
<ul>
<li *ngFor="let s of getComplexType() | wfilter: [{field:'nome',value:filter3},
{field:'idade',value:filter3},
{field:'phone.ddd',value:filter3},
{field:'phone.number',value:filter3}]">
name: {{s.nome}} - idade: {{s.idade}} - phone.ddd: {{s.phone.ddd}} - phone.number: {{s.phone.number}}
</li>
</ul>
<hr>
```
### Filtering in declarative code
**HTML:**
```
<label>String filter 4 - Filter in declarative code</label>
<br>
<input type="text" [(ngModel)]="filter4">
<br>
<h5>Using filter in declarative code</h5>
<ul>
<li *ngFor="let s of getDataFilterDeclarativeCode(filter4)">
name: {{s.nome}} - idade: {{s.idade}} - phone.ddd: {{s.phone.ddd}} - phone.number: {{s.phone.number}}
</li>
</ul>
<hr>
```
### Filter child fields of complex type array
*Filter a Array complex type 'Roles' attribute of IUser interface*
**Typescript**
```
getDataFilterDeclarativeCode(filter): IUser[] {
return this.pipe.transform(this.getComplexType(), // Get array data to filter
[
{field: 'nome', value: filter}, // Filter in nome field - level 1
{field: 'phone.number', value: filter}, // Filter in phone.number field - level 2
{field: 'roles', value: [
{field: 'id', value: filter}, // Filter in roles[?].id
{field: 'role', value: filter}, // Filter in roles[?].role
]}
]);
}
```
**HTML**
```
<ul>
<li *ngFor="let s of getComplexType() | wfilter:
[
{field:'nome',value:filter3},
{field:'roles', value:
[
{field: 'role', value: filter3}
]
}
]">
name: {{s.nome}} - idade: {{s.idade}} - phone.ddd: {{s.phone.ddd}} - phone.number: {{s.phone.number}}
<ul>
<li *ngFor="let r of s.roles">{{r.id}} - {{r.description}}</li>
</ul>
</li>
</ul>
```
**Typescript code:**
Import component in typescript file header, for example, *my-component.ts*:
```
import { WfilterPipe } from 'wngx-filter';
```
After, import the component in constructor of component
```
constructor(private pipe: WfilterPipe) {}
```
Then use the pipe to filter in any method:
```
getDataFilterDeclarativeCode(filter): IUser[] {
return this.pipe.transform(this.getComplexType(), // Get array data to filter
[
{field: 'nome', value: filter}, // Filter in nome field - level 1
{field: 'phone.number', value: filter} // Filter in phone.number field - level 2
]);
}
```
This component work with **infinite attribute level filters** ...
# Project info - source code
This project is stored in [wngx-library](https://github.com/wquintanilhadasilva/wngx-library) and was generated with [Angular CLI](https://github.com/angular/angular-cli) version ^1.7.