wngx-filter
Version:
Angular 7 generic components for array filter in *ngFor directive.
193 lines • 16.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Pipe } from '@angular/core';
import { ASCIIFolder } from './ASCIIFolder';
/**
* @record
*/
export function FilterParam() { }
if (false) {
/** @type {?} */
FilterParam.prototype.field;
/** @type {?} */
FilterParam.prototype.value;
}
export class WfilterPipe {
/**
* @param {?} values
* @param {?} filter
* @return {?}
*/
transform(values, filter) {
// if values is not array, then return it...
if (values && !(values instanceof Array)) {
return values;
}
// if filter is null , then return value...
if (!filter) {
return values;
}
if (filter instanceof Array) {
return this._checkComplexType(values, filter);
}
else {
return this._checkSimpleType(values, filter);
}
}
/**
* @private
* @param {?} values
* @param {?} filter
* @return {?}
*/
_checkSimpleType(values, filter) {
if (!values || !filter) {
return values;
}
/** @type {?} */
const normalizedValues = [...values];
/** @type {?} */
const normalizedSearch = this._replaceSpecialChars(filter.toString().toLowerCase());
return normalizedValues.filter((item) => this._replaceSpecialChars(item.toString())
.toLowerCase()
.includes(normalizedSearch));
}
/**
* @private
* @param {?} values
* @param {?} filter
* @return {?}
*/
_checkComplexType(values, filter) {
if (!values || !filter || !filter.length) {
return values;
}
/** @type {?} */
const result = [];
// find in all records
values.forEach((row) => {
/** @type {?} */
let match = false;
// find in all filters in the array of filters
filter.forEach((field) => {
// lê o valor da propriedade
/** @type {?} */
const v = row[field.field];
// Se o valor for um array, então faz a chamada recursiva
if (v !== null && v !== undefined && v instanceof Array) {
/** @type {?} */
const temp = this.transform(v, field.value);
// se houver registro, é pq deve participar do resultado
match = match || (temp !== null && temp !== undefined && temp.length > 0);
}
else {
match = match || this._checkValue(row, field);
}
});
if (match) {
result.push(row); // add row in return
}
});
return result;
}
/**
* @private
* @param {?} item
* @param {?} filter
* @return {?}
*/
_checkValue(item, filter) {
if (!filter || !filter.field || !filter.value) {
return true;
}
if (this._existDot(filter.field)) {
return this._parseValue(item, filter.value, filter.field);
// return false;
}
else {
/** @type {?} */
let value = item[filter.field];
if (value) {
value = this._replaceSpecialChars(item[filter.field].toString());
/** @type {?} */
const normalizedSearch = this._replaceSpecialChars(filter.value.toString().toLowerCase());
return value.toLowerCase().includes(normalizedSearch);
}
else {
return false;
}
}
}
/**
* @private
* @param {?} reference
* @param {?} search
* @param {?} filter
* @return {?}
*/
_parseValue(reference, search, filter) {
/** @type {?} */
const fields = filter.split('.');
return this._existFieldValue(reference, search, fields, 0);
}
/**
* @private
* @param {?} path
* @return {?}
*/
_existDot(path) {
return path.indexOf('.') > -1;
}
/**
* @private
* @param {?} obj
* @param {?} search
* @param {?} fieldFind
* @param {?} indexFind
* @return {?}
*/
_existFieldValue(obj, search, fieldFind, indexFind) {
// Lê o valor da propriedade
/** @type {?} */
const ref = obj[fieldFind[indexFind]];
// Se estiver no último nível...
if (indexFind === fieldFind.length - 1) {
// Se tiver valor, confere se contém o que está procurando...
if (ref) {
/** @type {?} */
const value = this._replaceSpecialChars(ref.toString());
/** @type {?} */
const normalizedSearch = this._replaceSpecialChars(search.toString().toLowerCase());
return value.toLowerCase().includes(normalizedSearch);
}
else {
return false;
}
// Não está no último nível mas há valor na referência
}
else if (ref) {
return this._existFieldValue(ref, search, fieldFind, ++indexFind);
// Não está no último nível e não há valor na referência (null)
}
else {
return false;
}
}
/**
* @private
* @param {?} str
* @return {?}
*/
_replaceSpecialChars(str) {
return ASCIIFolder.fold(str);
}
}
WfilterPipe.decorators = [
{ type: Pipe, args: [{
name: 'wfilter',
pure: true,
},] }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ZpbHRlci5waXBlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vd25neC1maWx0ZXIvIiwic291cmNlcyI6WyJsaWIvcGlwZXMvd2ZpbHRlci5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBRTVDLGlDQUdDOzs7SUFGQyw0QkFBYzs7SUFDZCw0QkFBOEI7O0FBT2hDLE1BQU0sT0FBTyxXQUFXOzs7Ozs7SUFFdEIsU0FBUyxDQUFDLE1BQWEsRUFBRSxNQUF1QztRQUM5RCw0Q0FBNEM7UUFDNUMsSUFBSSxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sWUFBWSxLQUFLLENBQUMsRUFBRTtZQUN4QyxPQUFPLE1BQU0sQ0FBQztTQUNmO1FBRUQsMkNBQTJDO1FBQzNDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxPQUFPLE1BQU0sQ0FBQztTQUNmO1FBRUQsSUFBSSxNQUFNLFlBQVksS0FBSyxFQUFFO1lBQzNCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUMvQzthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzlDO0lBQ0gsQ0FBQzs7Ozs7OztJQUVPLGdCQUFnQixDQUFDLE1BQWEsRUFBRSxNQUF1QjtRQUM3RCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3RCLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7O2NBRUssZ0JBQWdCLEdBQVUsQ0FBQyxHQUFHLE1BQU0sQ0FBQzs7Y0FDckMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUNoRCxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQ2hDO1FBQ0QsT0FBTyxnQkFBZ0IsQ0FBQyxN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Z0JBQ0osSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsSUFBSSxFQUFFLElBQUk7YUFDWCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFTQ0lJRm9sZGVyIH0gZnJvbSAnLi9BU0NJSUZvbGRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyUGFyYW0ge1xuICBmaWVsZDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nIHwgRmlsdGVyUGFyYW1bXTtcbn1cblxuQFBpcGUoe1xuICBuYW1lOiAnd2ZpbHRlcicsXG4gIHB1cmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIFdmaWx0ZXJQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG5cbiAgdHJhbnNmb3JtKHZhbHVlczogYW55W10sIGZpbHRlcjogRmlsdGVyUGFyYW1bXSB8IHN0cmluZyB8IG51bWJlcik6IGFueSB7XG4gICAgLy8gaWYgdmFsdWVzIGlzIG5vdCBhcnJheSwgdGhlbiByZXR1cm4gaXQuLi5cbiAgICBpZiAodmFsdWVzICYmICEodmFsdWVzIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cblxuICAgIC8vIGlmIGZpbHRlciBpcyBudWxsICwgdGhlbiByZXR1cm4gdmFsdWUuLi5cbiAgICBpZiAoIWZpbHRlcikge1xuICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG5cbiAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jaGVja0NvbXBsZXhUeXBlKHZhbHVlcywgZmlsdGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrU2ltcGxlVHlwZSh2YWx1ZXMsIGZpbHRlcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tTaW1wbGVUeXBlKHZhbHVlczogYW55W10sIGZpbHRlcjogc3RyaW5nIHwgbnVtYmVyICk6IGFueSB7XG4gICAgaWYgKCF2YWx1ZXMgfHwgIWZpbHRlcikge1xuICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkVmFsdWVzOiBhbnlbXSA9IFsuLi52YWx1ZXNdO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSB0aGlzLl9yZXBsYWNlU3BlY2lhbENoYXJzKFxuICAgICAgZmlsdGVyLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSxcbiAgICApO1xuICAgIHJldHVybiBub3JtYWxpemVkVmFsdWVzLmZpbHRlcigoaXRlbSkgPT5cbiAgICAgIHRoaXMuX3JlcGxhY2VTcGVjaWFsQ2hhcnMoaXRlbS50b1N0cmluZygpKVxuICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAuaW5jbHVkZXMobm9ybWFsaXplZFNlYXJjaCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrQ29tcGxleFR5cGUodmFsdWVzLCBmaWx0ZXI6IEZpbHRlclBhcmFtW10pOiBhbnkge1xuICAgIGlmICghdmFsdWVzIHx8ICFmaWx0ZXIgfHwgIWZpbHRlci5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICAvLyBmaW5kIGluIGFsbCByZWNvcmRzXG4gICAgdmFsdWVzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgbGV0IG1hdGNoID0gZmFsc2U7XG4gICAgICAvLyBmaW5kIGluIGFsbCBmaWx0ZXJzIGluIHRoZSBhcnJheSBvZiBmaWx0ZXJzXG4gICAgICBmaWx0ZXIuZm9yRWFjaCgoZmllbGQpID0+IHtcblxuICAgICAgICAvLyBsw6ogbyB2YWxvciBkYSBwcm9wcmllZGFkZVxuICAgICAgICBjb25zdCB2ID0gcm93W2ZpZWxkLmZpZWxkXTtcbiAgICAgICAgLy8gU2UgbyB2YWxvciBmb3IgdW0gYXJyYXksIGVudMOjbyBmYXogYSBjaGFtYWRhIHJlY3Vyc2l2YVxuICAgICAgICBpZiAodiAhPT0gbnVsbCAmJiB2ICE9PSB1bmRlZmluZWQgJiYgdiBpbnN0YW5jZW9mIEFycmF5KSB7XG5cbiAgICAgICAgICBjb25zdCB0ZW1wOiBhbnlbXSA9IHRoaXMudHJhbnNmb3JtKHYsIGZpZWxkLnZhbHVlKTtcbiAgICAgICAgICAvLyBzZSBob3V2ZXIgcmVnaXN0cm8sIMOpIHBxIGRldmUgcGFydGljaXBhciBkbyByZXN1bHRhZG9cbiAgICAgICAgICBtYXRjaCA9IG1hdGNoIHx8ICh0ZW1wICE9PSBudWxsICYmIHRlbXAgIT09IHVuZGVmaW5lZCAmJiB0ZW1wLmxlbmd0aCA+IDApO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWF0Y2ggPSBtYXRjaCB8fCB0aGlzLl9jaGVja1ZhbHVlKHJvdywgZmllbGQpO1xuICAgICAgICB9XG5cbiAgICAgIH0pO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHJvdyk7IC8vIGFkZCByb3cgaW4gcmV0dXJuXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tWYWx1ZShpdGVtLCBmaWx0ZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIWZpbHRlciB8fCAhZmlsdGVyLmZpZWxkIHx8ICFmaWx0ZXIudmFsdWUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZXhpc3REb3QoZmlsdGVyLmZpZWxkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlVmFsdWUoaXRlbSwgZmlsdGVyLnZhbHVlLCBmaWx0ZXIuZmllbGQpO1xuICAgICAgLy8gcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdmFsdWUgPSBpdGVtW2ZpbHRlci5maWVsZF07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLl9yZXBsYWNlU3BlY2lhbENoYXJzKGl0ZW1bZmlsdGVyLmZpZWxkXS50b1N0cmluZygpKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IHRoaXMuX3JlcGxhY2VTcGVjaWFsQ2hhcnMoXG4gICAgICAgICAgZmlsdGVyLnZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobm9ybWFsaXplZFNlYXJjaCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VWYWx1ZShyZWZlcmVuY2UsIHNlYXJjaCwgZmlsdGVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZmllbGRzID0gZmlsdGVyLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHRoaXMuX2V4aXN0RmllbGRWYWx1ZShyZWZlcmVuY2UsIHNlYXJjaCwgZmllbGRzLCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgX2V4aXN0RG90KHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwYXRoLmluZGV4T2YoJy4nKSA+IC0xO1xuICB9XG5cbiAgcHJpdmF0ZSBfZXhpc3RGaWVsZFZhbHVlKG9iaiwgc2VhcmNoLCBmaWVsZEZpbmQsIGluZGV4RmluZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gTMOqIG8gdmFsb3IgZGEgcHJvcHJpZWRhZGVcbiAgICBjb25zdCByZWYgPSBvYmpbZmllbGRGaW5kW2luZGV4RmluZF1dO1xuICAgIC8vIFNlIGVzdGl2ZXIgbm8gw7psdGltbyBuw612ZWwuLi5cbiAgICBpZiAoaW5kZXhGaW5kID09PSBmaWVsZEZpbmQubGVuZ3RoIC0gMSkge1xuICAgICAgLy8gU2UgdGl2ZXIgdmFsb3IsIGNvbmZlcmUgc2UgY29udMOpbSBvIHF1ZSBlc3TDoSBwcm9jdXJhbmRvLi4uXG4gICAgICBpZiAocmVmKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fcmVwbGFjZVNwZWNpYWxDaGFycyhyZWYudG9TdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSB0aGlzLl9yZXBsYWNlU3BlY2lhbENoYXJzKFxuICAgICAgICAgIHNlYXJjaC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKG5vcm1hbGl6ZWRTZWFyY2gpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gTsOjbyBlc3TDoSBubyDDumx0aW1vIG7DrXZlbCBtYXMgaMOhIHZhbG9yIG5hIHJlZmVyw6puY2lhXG4gICAgfSBlbHNlIGlmIChyZWYpIHtcbiAgICAgIHJldHVybiB0aGlzLl9leGlzdEZpZWxkVmFsdWUocmVmLCBzZWFyY2gsIGZpZWxkRmluZCwgKytpbmRleEZpbmQpO1xuICAgICAgLy8gTsOjbyBlc3TDoSBubyDDumx0aW1vIG7DrXZlbCBlIG7Do28gaMOhIHZhbG9yIG5hIHJlZmVyw6puY2lhIChudWxsKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVwbGFjZVNwZWNpYWxDaGFycyhzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBBU0NJSUZvbGRlci5mb2xkKHN0cik7XG4gIH1cblxufVxuXG4vKipcbiAqIGZ1bmN0aW9uIGNoZWNrVHlwZUlzT2JqZWN0KHY6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsO1xuICAgfVxuICovXG4iXX0=