wngx-filter
Version:
Angular 7 generic components for array filter in *ngFor directive.
250 lines • 18.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Pipe } from '@angular/core';
import { ASCIIFolder } from './ASCIIFolder';
/**
* @record
*/
export function FilterParam() { }
if (false) {
/** @type {?} */
FilterParam.prototype.field;
/** @type {?} */
FilterParam.prototype.value;
}
var WfilterPipe = /** @class */ (function () {
function WfilterPipe() {
}
/**
* @param {?} values
* @param {?} filter
* @return {?}
*/
WfilterPipe.prototype.transform = /**
* @param {?} values
* @param {?} filter
* @return {?}
*/
function (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 {?}
*/
WfilterPipe.prototype._checkSimpleType = /**
* @private
* @param {?} values
* @param {?} filter
* @return {?}
*/
function (values, filter) {
var _this = this;
if (!values || !filter) {
return values;
}
/** @type {?} */
var normalizedValues = tslib_1.__spread(values);
/** @type {?} */
var normalizedSearch = this._replaceSpecialChars(filter.toString().toLowerCase());
return normalizedValues.filter(function (item) {
return _this._replaceSpecialChars(item.toString())
.toLowerCase()
.includes(normalizedSearch);
});
};
/**
* @private
* @param {?} values
* @param {?} filter
* @return {?}
*/
WfilterPipe.prototype._checkComplexType = /**
* @private
* @param {?} values
* @param {?} filter
* @return {?}
*/
function (values, filter) {
var _this = this;
if (!values || !filter || !filter.length) {
return values;
}
/** @type {?} */
var result = [];
// find in all records
values.forEach(function (row) {
/** @type {?} */
var match = false;
// find in all filters in the array of filters
filter.forEach(function (field) {
// lê o valor da propriedade
/** @type {?} */
var 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 {?} */
var 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 {?}
*/
WfilterPipe.prototype._checkValue = /**
* @private
* @param {?} item
* @param {?} filter
* @return {?}
*/
function (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 {?} */
var value = item[filter.field];
if (value) {
value = this._replaceSpecialChars(item[filter.field].toString());
/** @type {?} */
var normalizedSearch = this._replaceSpecialChars(filter.value.toString().toLowerCase());
return value.toLowerCase().includes(normalizedSearch);
}
else {
return false;
}
}
};
/**
* @private
* @param {?} reference
* @param {?} search
* @param {?} filter
* @return {?}
*/
WfilterPipe.prototype._parseValue = /**
* @private
* @param {?} reference
* @param {?} search
* @param {?} filter
* @return {?}
*/
function (reference, search, filter) {
/** @type {?} */
var fields = filter.split('.');
return this._existFieldValue(reference, search, fields, 0);
};
/**
* @private
* @param {?} path
* @return {?}
*/
WfilterPipe.prototype._existDot = /**
* @private
* @param {?} path
* @return {?}
*/
function (path) {
return path.indexOf('.') > -1;
};
/**
* @private
* @param {?} obj
* @param {?} search
* @param {?} fieldFind
* @param {?} indexFind
* @return {?}
*/
WfilterPipe.prototype._existFieldValue = /**
* @private
* @param {?} obj
* @param {?} search
* @param {?} fieldFind
* @param {?} indexFind
* @return {?}
*/
function (obj, search, fieldFind, indexFind) {
// Lê o valor da propriedade
/** @type {?} */
var 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 {?} */
var value = this._replaceSpecialChars(ref.toString());
/** @type {?} */
var 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 {?}
*/
WfilterPipe.prototype._replaceSpecialChars = /**
* @private
* @param {?} str
* @return {?}
*/
function (str) {
return ASCIIFolder.fold(str);
};
WfilterPipe.decorators = [
{ type: Pipe, args: [{
name: 'wfilter',
pure: true,
},] }
];
return WfilterPipe;
}());
export { WfilterPipe };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ZpbHRlci5waXBlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vd25neC1maWx0ZXIvIiwic291cmNlcyI6WyJsaWIvcGlwZXMvd2ZpbHRlci5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7OztBQUU1QyxpQ0FHQzs7O0lBRkMsNEJBQWM7O0lBQ2QsNEJBQThCOztBQUdoQztJQUFBO0lBcUlBLENBQUM7Ozs7OztJQS9IQywrQkFBUzs7Ozs7SUFBVCxVQUFVLE1BQWEsRUFBRSxNQUF1QztRQUM5RCw0Q0FBNEM7UUFDNUMsSUFBSSxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sWUFBWSxLQUFLLENBQUMsRUFBRTtZQUN4QyxPQUFPLE1BQU0sQ0FBQztTQUNmO1FBRUQsMkNBQTJDO1FBQzNDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxPQUFPLE1BQU0sQ0FBQztTQUNmO1FBRUQsSUFBSSxNQUFNLFlBQVksS0FBSyxFQUFFO1lBQzNCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUMvQzthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzlDO0lBQ0gsQ0FBQzs7Ozs7OztJQUVPLHNDQUFnQjs7Ozs7O0lBQXhCLFVBQXlCLE1BQWEsRUFBRSxNQUF1QjtRQUEvRCxpQkFjQztRQWJDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDdEIsT0FBTyxNQUFNLENBQUM7U0FDZjs7WUFFSyxnQkFBZ0Isb0JBQWMsTUFBTSxDQUFDOztZQUNyQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQ2hELE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FD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Q0FBb0I7Ozs7O0lBQTVCLFVBQTZCLEdBQVc7UUFDdEMsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7O2dCQW5JRixJQUFJLFNBQUM7b0JBQ0osSUFBSSxFQUFFLFNBQVM7b0JBQ2YsSUFBSSxFQUFFLElBQUk7aUJBQ1g7O0lBa0lELGtCQUFDO0NBQUEsQUFySUQsSUFxSUM7U0FqSVksV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFTQ0lJRm9sZGVyIH0gZnJvbSAnLi9BU0NJSUZvbGRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyUGFyYW0ge1xuICBmaWVsZDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nIHwgRmlsdGVyUGFyYW1bXTtcbn1cblxuQFBpcGUoe1xuICBuYW1lOiAnd2ZpbHRlcicsXG4gIHB1cmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIFdmaWx0ZXJQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG5cbiAgdHJhbnNmb3JtKHZhbHVlczogYW55W10sIGZpbHRlcjogRmlsdGVyUGFyYW1bXSB8IHN0cmluZyB8IG51bWJlcik6IGFueSB7XG4gICAgLy8gaWYgdmFsdWVzIGlzIG5vdCBhcnJheSwgdGhlbiByZXR1cm4gaXQuLi5cbiAgICBpZiAodmFsdWVzICYmICEodmFsdWVzIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cblxuICAgIC8vIGlmIGZpbHRlciBpcyBudWxsICwgdGhlbiByZXR1cm4gdmFsdWUuLi5cbiAgICBpZiAoIWZpbHRlcikge1xuICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG5cbiAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jaGVja0NvbXBsZXhUeXBlKHZhbHVlcywgZmlsdGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrU2ltcGxlVHlwZSh2YWx1ZXMsIGZpbHRlcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tTaW1wbGVUeXBlKHZhbHVlczogYW55W10sIGZpbHRlcjogc3RyaW5nIHwgbnVtYmVyICk6IGFueSB7XG4gICAgaWYgKCF2YWx1ZXMgfHwgIWZpbHRlcikge1xuICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkVmFsdWVzOiBhbnlbXSA9IFsuLi52YWx1ZXNdO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSB0aGlzLl9yZXBsYWNlU3BlY2lhbENoYXJzKFxuICAgICAgZmlsdGVyLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSxcbiAgICApO1xuICAgIHJldHVybiBub3JtYWxpemVkVmFsdWVzLmZpbHRlcigoaXRlbSkgPT5cbiAgICAgIHRoaXMuX3JlcGxhY2VTcGVjaWFsQ2hhcnMoaXRlbS50b1N0cmluZygpKVxuICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAuaW5jbHVkZXMobm9ybWFsaXplZFNlYXJjaCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrQ29tcGxleFR5cGUodmFsdWVzLCBmaWx0ZXI6IEZpbHRlclBhcmFtW10pOiBhbnkge1xuICAgIGlmICghdmFsdWVzIHx8ICFmaWx0ZXIgfHwgIWZpbHRlci5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICAvLyBmaW5kIGluIGFsbCByZWNvcmRzXG4gICAgdmFsdWVzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgbGV0IG1hdGNoID0gZmFsc2U7XG4gICAgICAvLyBmaW5kIGluIGFsbCBmaWx0ZXJzIGluIHRoZSBhcnJheSBvZiBmaWx0ZXJzXG4gICAgICBmaWx0ZXIuZm9yRWFjaCgoZmllbGQpID0+IHtcblxuICAgICAgICAvLyBsw6ogbyB2YWxvciBkYSBwcm9wcmllZGFkZVxuICAgICAgICBjb25zdCB2ID0gcm93W2ZpZWxkLmZpZWxkXTtcbiAgICAgICAgLy8gU2UgbyB2YWxvciBmb3IgdW0gYXJyYXksIGVudMOjbyBmYXogYSBjaGFtYWRhIHJlY3Vyc2l2YVxuICAgICAgICBpZiAodiAhPT0gbnVsbCAmJiB2ICE9PSB1bmRlZmluZWQgJiYgdiBpbnN0YW5jZW9mIEFycmF5KSB7XG5cbiAgICAgICAgICBjb25zdCB0ZW1wOiBhbnlbXSA9IHRoaXMudHJhbnNmb3JtKHYsIGZpZWxkLnZhbHVlKTtcbiAgICAgICAgICAvLyBzZSBob3V2ZXIgcmVnaXN0cm8sIMOpIHBxIGRldmUgcGFydGljaXBhciBkbyByZXN1bHRhZG9cbiAgICAgICAgICBtYXRjaCA9IG1hdGNoIHx8ICh0ZW1wICE9PSBudWxsICYmIHRlbXAgIT09IHVuZGVmaW5lZCAmJiB0ZW1wLmxlbmd0aCA+IDApO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWF0Y2ggPSBtYXRjaCB8fCB0aGlzLl9jaGVja1ZhbHVlKHJvdywgZmllbGQpO1xuICAgICAgICB9XG5cbiAgICAgIH0pO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHJvdyk7IC8vIGFkZCByb3cgaW4gcmV0dXJuXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tWYWx1ZShpdGVtLCBmaWx0ZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIWZpbHRlciB8fCAhZmlsdGVyLmZpZWxkIHx8ICFmaWx0ZXIudmFsdWUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZXhpc3REb3QoZmlsdGVyLmZpZWxkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlVmFsdWUoaXRlbSwgZmlsdGVyLnZhbHVlLCBmaWx0ZXIuZmllbGQpO1xuICAgICAgLy8gcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdmFsdWUgPSBpdGVtW2ZpbHRlci5maWVsZF07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLl9yZXBsYWNlU3BlY2lhbENoYXJzKGl0ZW1bZmlsdGVyLmZpZWxkXS50b1N0cmluZygpKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IHRoaXMuX3JlcGxhY2VTcGVjaWFsQ2hhcnMoXG4gICAgICAgICAgZmlsdGVyLnZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobm9ybWFsaXplZFNlYXJjaCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VWYWx1ZShyZWZlcmVuY2UsIHNlYXJjaCwgZmlsdGVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZmllbGRzID0gZmlsdGVyLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHRoaXMuX2V4aXN0RmllbGRWYWx1ZShyZWZlcmVuY2UsIHNlYXJjaCwgZmllbGRzLCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgX2V4aXN0RG90KHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwYXRoLmluZGV4T2YoJy4nKSA+IC0xO1xuICB9XG5cbiAgcHJpdmF0ZSBfZXhpc3RGaWVsZFZhbHVlKG9iaiwgc2VhcmNoLCBmaWVsZEZpbmQsIGluZGV4RmluZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gTMOqIG8gdmFsb3IgZGEgcHJvcHJpZWRhZGVcbiAgICBjb25zdCByZWYgPSBvYmpbZmllbGRGaW5kW2luZGV4RmluZF1dO1xuICAgIC8vIFNlIGVzdGl2ZXIgbm8gw7psdGltbyBuw612ZWwuLi5cbiAgICBpZiAoaW5kZXhGaW5kID09PSBmaWVsZEZpbmQubGVuZ3RoIC0gMSkge1xuICAgICAgLy8gU2UgdGl2ZXIgdmFsb3IsIGNvbmZlcmUgc2UgY29udMOpbSBvIHF1ZSBlc3TDoSBwcm9jdXJhbmRvLi4uXG4gICAgICBpZiAocmVmKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fcmVwbGFjZVNwZWNpYWxDaGFycyhyZWYudG9TdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSB0aGlzLl9yZXBsYWNlU3BlY2lhbENoYXJzKFxuICAgICAgICAgIHNlYXJjaC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKG5vcm1hbGl6ZWRTZWFyY2gpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gTsOjbyBlc3TDoSBubyDDumx0aW1vIG7DrXZlbCBtYXMgaMOhIHZhbG9yIG5hIHJlZmVyw6puY2lhXG4gICAgfSBlbHNlIGlmIChyZWYpIHtcbiAgICAgIHJldHVybiB0aGlzLl9leGlzdEZpZWxkVmFsdWUocmVmLCBzZWFyY2gsIGZpZWxkRmluZCwgKytpbmRleEZpbmQpO1xuICAgICAgLy8gTsOjbyBlc3TDoSBubyDDumx0aW1vIG7DrXZlbCBlIG7Do28gaMOhIHZhbG9yIG5hIHJlZmVyw6puY2lhIChudWxsKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVwbGFjZVNwZWNpYWxDaGFycyhzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBBU0NJSUZvbGRlci5mb2xkKHN0cik7XG4gIH1cblxufVxuXG4vKipcbiAqIGZ1bmN0aW9uIGNoZWNrVHlwZUlzT2JqZWN0KHY6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsO1xuICAgfVxuICovXG4iXX0=