UNPKG

ngx-order-pipe

Version:

Angular order pipe, order collection by a field

198 lines 19.6 kB
import * as tslib_1 from "tslib"; import { Pipe } from '@angular/core'; var OrderPipe = /** @class */ (function () { function OrderPipe() { } OrderPipe_1 = OrderPipe; /** * Check if a value is a string * * @param value */ OrderPipe.isString = function (value) { return typeof value === 'string' || value instanceof String; }; /** * Sorts values ignoring the case * * @param a * @param b */ OrderPipe.caseInsensitiveSort = function (a, b) { if (OrderPipe_1.isString(a) && OrderPipe_1.isString(b)) { return a.localeCompare(b); } return OrderPipe_1.defaultCompare(a, b); }; /** * Default compare method * * @param a * @param b */ OrderPipe.defaultCompare = function (a, b) { if (a === b) { return 0; } if (a == null) { return 1; } if (b == null) { return -1; } return a > b ? 1 : -1; }; /** * Parse expression, split into items * @param expression * @returns {string[]} */ OrderPipe.parseExpression = function (expression) { expression = expression.replace(/\[(\w+)\]/g, '.$1'); expression = expression.replace(/^\./, ''); return expression.split('.'); }; /** * Get value by expression * * @param object * @param expression * @returns {any} */ OrderPipe.getValue = function (object, expression) { for (var i = 0, n = expression.length; i < n; ++i) { var k = expression[i]; if (!(k in object)) { return; } if (typeof object[k] === 'function') { object = object[k](); } else { object = object[k]; } } return object; }; /** * Set value by expression * * @param object * @param value * @param expression */ OrderPipe.setValue = function (object, value, expression) { var i; for (i = 0; i < expression.length - 1; i++) { object = object[expression[i]]; } object[expression[i]] = value; }; OrderPipe.prototype.transform = function (value, expression, reverse, isCaseInsensitive, comparator) { if (isCaseInsensitive === void 0) { isCaseInsensitive = false; } if (!value) { return value; } if (Array.isArray(expression)) { return this.multiExpressionTransform(value, expression, reverse, isCaseInsensitive, comparator); } if (Array.isArray(value)) { return this.sortArray(value.slice(), expression, reverse, isCaseInsensitive, comparator); } if (typeof value === 'object') { return this.transformObject(Object.assign({}, value), expression, reverse, isCaseInsensitive, comparator); } return value; }; /** * Sort array * * @param value * @param expression * @param reverse * @param isCaseInsensitive * @param comparator * @returns {any[]} */ OrderPipe.prototype.sortArray = function (value, expression, reverse, isCaseInsensitive, comparator) { var isDeepLink = expression && expression.indexOf('.') !== -1; if (isDeepLink) { expression = OrderPipe_1.parseExpression(expression); } var compareFn; if (comparator && typeof comparator === 'function') { compareFn = comparator; } else { compareFn = isCaseInsensitive ? OrderPipe_1.caseInsensitiveSort : OrderPipe_1.defaultCompare; } var array = value.sort(function (a, b) { if (!expression) { return compareFn(a, b); } if (!isDeepLink) { if (a && b) { return compareFn(a[expression], b[expression]); } return compareFn(a, b); } return compareFn(OrderPipe_1.getValue(a, expression), OrderPipe_1.getValue(b, expression)); }); if (reverse) { return array.reverse(); } return array; }; /** * Transform Object * * @param value * @param expression * @param reverse * @param isCaseInsensitive * @param comparator * @returns {any[]} */ OrderPipe.prototype.transformObject = function (value, expression, reverse, isCaseInsensitive, comparator) { var parsedExpression = OrderPipe_1.parseExpression(expression); var lastPredicate = parsedExpression.pop(); var oldValue = OrderPipe_1.getValue(value, parsedExpression); if (!Array.isArray(oldValue)) { parsedExpression.push(lastPredicate); lastPredicate = null; oldValue = OrderPipe_1.getValue(value, parsedExpression); } if (!oldValue) { return value; } OrderPipe_1.setValue(value, this.transform(oldValue, lastPredicate, reverse, isCaseInsensitive), parsedExpression); return value; }; /** * Apply multiple expressions * * @param value * @param {any[]} expressions * @param {boolean} reverse * @param {boolean} isCaseInsensitive * @param {Function} comparator * @returns {any} */ OrderPipe.prototype.multiExpressionTransform = function (value, expressions, reverse, isCaseInsensitive, comparator) { var _this = this; if (isCaseInsensitive === void 0) { isCaseInsensitive = false; } return expressions.reverse().reduce(function (result, expression) { return _this.transform(result, expression, reverse, isCaseInsensitive, comparator); }, value); }; var OrderPipe_1; OrderPipe = OrderPipe_1 = tslib_1.__decorate([ Pipe({ name: 'orderBy', pure: false }) ], OrderPipe); return OrderPipe; }()); export { OrderPipe }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW9yZGVyLnBpcGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtb3JkZXItcGlwZS8iLCJzb3VyY2VzIjpbInNyYy9hcHAvb3JkZXItcGlwZS9uZ3gtb3JkZXIucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFNcEQ7SUFBQTtJQWtOQSxDQUFDO2tCQWxOWSxTQUFTO0lBRXBCOzs7O09BSUc7SUFDSSxrQkFBUSxHQUFmLFVBQWdCLEtBQVU7UUFDeEIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxZQUFZLE1BQU0sQ0FBQztJQUM5RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSw2QkFBbUIsR0FBMUIsVUFBMkIsQ0FBTSxFQUFFLENBQU07UUFDdkMsSUFBSSxXQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDbEQsT0FBTyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsT0FBTyxXQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSx3QkFBYyxHQUFyQixVQUFzQixDQUFNLEVBQUUsQ0FBTTtRQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDWCxPQUFPLENBQUMsQ0FBQztTQUNWO1FBQ0QsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ2IsT0FBTyxDQUFDLENBQUM7U0FDVjtRQUNELElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtZQUNiLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDWDtRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7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O1FBSnJCLElBQUksQ0FBQztZQUNKLElBQUksRUFBRSxTQUFTO1lBQ2YsSUFBSSxFQUFFLEtBQUs7U0FDWixDQUFDO09BQ1csU0FBUyxDQWtOckI7SUFBRCxnQkFBQztDQUFBLEFBbE5ELElBa05DO1NBbE5ZLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBQaXBlKHtcbiAgbmFtZTogJ29yZGVyQnknLFxuICBwdXJlOiBmYWxzZVxufSlcbmV4cG9ydCBjbGFzcyBPcmRlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHN0cmluZ1xuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHN0YXRpYyBpc1N0cmluZyh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgdmFsdWVzIGlnbm9yaW5nIHRoZSBjYXNlXG4gICAqXG4gICAqIEBwYXJhbSBhXG4gICAqIEBwYXJhbSBiXG4gICAqL1xuICBzdGF0aWMgY2FzZUluc2Vuc2l0aXZlU29ydChhOiBhbnksIGI6IGFueSkge1xuICAgIGlmIChPcmRlclBpcGUuaXNTdHJpbmcoYSkgJiYgT3JkZXJQaXBlLmlzU3RyaW5nKGIpKSB7XG4gICAgICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO1xuICAgIH1cbiAgICByZXR1cm4gT3JkZXJQaXBlLmRlZmF1bHRDb21wYXJlKGEsIGIpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgY29tcGFyZSBtZXRob2RcbiAgICpcbiAgICogQHBhcmFtIGFcbiAgICogQHBhcmFtIGJcbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0Q29tcGFyZShhOiBhbnksIGI6IGFueSkge1xuICAgIGlmIChhID09PSBiKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKGEgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGlmIChiID09IG51bGwpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIGEgPiBiID8gMSA6IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGV4cHJlc3Npb24sIHNwbGl0IGludG8gaXRlbXNcbiAgICogQHBhcmFtIGV4cHJlc3Npb25cbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgc3RhdGljIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVwbGFjZSgvXFxbKFxcdyspXFxdL2csICcuJDEnKTtcbiAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5yZXBsYWNlKC9eXFwuLywgJycpO1xuICAgIHJldHVybiBleHByZXNzaW9uLnNwbGl0KCcuJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZhbHVlIGJ5IGV4cHJlc3Npb25cbiAgICpcbiAgICogQHBhcmFtIG9iamVjdFxuICAgKiBAcGFyYW0gZXhwcmVzc2lvblxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgc3RhdGljIGdldFZhbHVlKG9iamVjdDogYW55LCBleHByZXNzaW9uOiBzdHJpbmdbXSkge1xuICAgIGZvciAobGV0IGkgPSAwLCBuID0gZXhwcmVzc2lvbi5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIGNvbnN0IGsgPSBleHByZXNzaW9uW2ldO1xuICAgICAgaWYgKCEoayBpbiBvYmplY3QpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb2JqZWN0W2tdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFtrXSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W2tdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZhbHVlIGJ5IGV4cHJlc3Npb25cbiAgICpcbiAgICogQHBhcmFtIG9iamVjdFxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICogQHBhcmFtIGV4cHJlc3Npb25cbiAgICovXG4gIHN0YXRpYyBzZXRWYWx1ZShvYmplY3Q6IGFueSwgdmFsdWU6IGFueSwgZXhwcmVzc2lvbjogc3RyaW5nW10pIHtcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZXhwcmVzc2lvbi5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIG9iamVjdCA9IG9iamVjdFtleHByZXNzaW9uW2ldXTtcbiAgICB9XG5cbiAgICBvYmplY3RbZXhwcmVzc2lvbltpXV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHRyYW5zZm9ybSh2YWx1ZTogYW55IHwgYW55W10sIGV4cHJlc3Npb24/OiBhbnksIHJldmVyc2U/OiBib29sZWFuLCBpc0Nhc2VJbnNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlLCBjb21wYXJhdG9yPzogRnVuY3Rpb24pOiBhbnkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShleHByZXNzaW9uKSkge1xuICAgICAgcmV0dXJuIHRoaXMubXVsdGlFeHByZXNzaW9uVHJhbnNmb3JtKHZhbHVlLCBleHByZXNzaW9uLCByZXZlcnNlLCBpc0Nhc2VJbnNlbnNpdGl2ZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3J0QXJyYXkodmFsdWUuc2xpY2UoKSwgZXhwcmVzc2lvbiwgcmV2ZXJzZSwgaXNDYXNlSW5zZW5zaXRpdmUsIGNvbXBhcmF0b3IpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1PYmplY3QoT2JqZWN0LmFzc2lnbih7fSwgdmFsdWUpLCBleHByZXNzaW9uLCByZXZlcnNlLCBpc0Nhc2VJbnNlbnNpdGl2ZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnQgYXJyYXlcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEBwYXJhbSBleHByZXNzaW9uXG4gICAqIEBwYXJhbSByZXZlcnNlXG4gICAqIEBwYXJhbSBpc0Nhc2VJbnNlbnNpdGl2ZVxuICAgKiBAcGFyYW0gY29tcGFyYXRvclxuICAgKiBAcmV0dXJucyB7YW55W119XG4gICAqL1xuICBwcml2YXRlIHNvcnRBcnJheSh2YWx1ZTogYW55W10sIGV4cHJlc3Npb24/OiBhbnksIHJldmVyc2U/OiBib29sZWFuLCBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW4sIGNvbXBhcmF0b3I/OiBGdW5jdGlvbik6IGFueVtdIHtcbiAgICBjb25zdCBpc0RlZXBMaW5rID0gZXhwcmVzc2lvbiAmJiBleHByZXNzaW9uLmluZGV4T2YoJy4nKSAhPT0gLTE7XG5cbiAgICBpZiAoaXNEZWVwTGluaykge1xuICAgICAgZXhwcmVzc2lvbiA9IE9yZGVyUGlwZS5wYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbik7XG4gICAgfVxuXG4gICAgbGV0IGNvbXBhcmVGbjogRnVuY3Rpb247XG5cbiAgICBpZiAoY29tcGFyYXRvciAmJiB0eXBlb2YgY29tcGFyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcGFyZUZuID0gY29tcGFyYXRvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcGFyZUZuID0gaXNDYXNlSW5zZW5zaXRpdmUgPyBPcmRlclBpcGUuY2FzZUluc2Vuc2l0aXZlU29ydCA6IE9yZGVyUGlwZS5kZWZhdWx0Q29tcGFyZTtcbiAgICB9XG5cbiAgICBjb25zdCBhcnJheTogYW55W10gPSB2YWx1ZS5zb3J0KChhOiBhbnksIGI6IGFueSk6IG51bWJlciA9PiB7XG4gICAgICBpZiAoIWV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVGbihhLCBiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0RlZXBMaW5rKSB7XG4gICAgICAgIGlmIChhICYmIGIpIHtcbiAgICAgICAgICByZXR1cm4gY29tcGFyZUZuKGFbZXhwcmVzc2lvbl0sIGJbZXhwcmVzc2lvbl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wYXJlRm4oYSwgYik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wYXJlRm4oT3JkZXJQaXBlLmdldFZhbHVlKGEsIGV4cHJlc3Npb24pLCBPcmRlclBpcGUuZ2V0VmFsdWUoYiwgZXhwcmVzc2lvbikpO1xuICAgIH0pO1xuXG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgIHJldHVybiBhcnJheS5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSBPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEBwYXJhbSBleHByZXNzaW9uXG4gICAqIEBwYXJhbSByZXZlcnNlXG4gICAqIEBwYXJhbSBpc0Nhc2VJbnNlbnNpdGl2ZVxuICAgKiBAcGFyYW0gY29tcGFyYXRvclxuICAgKiBAcmV0dXJucyB7YW55W119XG4gICAqL1xuICBwcml2YXRlIHRyYW5zZm9ybU9iamVjdChcbiAgICB2YWx1ZTogYW55IHwgYW55W10sXG4gICAgZXhwcmVzc2lvbj86IGFueSxcbiAgICByZXZlcnNlPzogYm9vbGVhbixcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW4sXG4gICAgY29tcGFyYXRvcj86IEZ1bmN0aW9uXG4gICk6IGFueSB7XG4gICAgY29uc3QgcGFyc2VkRXhwcmVzc2lvbiA9IE9yZGVyUGlwZS5wYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbik7XG4gICAgbGV0IGxhc3RQcmVkaWNhdGUgPSBwYXJzZWRFeHByZXNzaW9uLnBvcCgpO1xuICAgIGxldCBvbGRWYWx1ZSA9IE9yZGVyUGlwZS5nZXRWYWx1ZSh2YWx1ZSwgcGFyc2VkRXhwcmVzc2lvbik7XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkob2xkVmFsdWUpKSB7XG4gICAgICBwYXJzZWRFeHByZXNzaW9uLnB1c2gobGFzdFByZWRpY2F0ZSk7XG4gICAgICBsYXN0UHJlZGljYXRlID0gbnVsbDtcbiAgICAgIG9sZFZhbHVlID0gT3JkZXJQaXBlLmdldFZhbHVlKHZhbHVlLCBwYXJzZWRFeHByZXNzaW9uKTtcbiAgICB9XG5cbiAgICBpZiAoIW9sZFZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgT3JkZXJQaXBlLnNldFZhbHVlKHZhbHVlLCB0aGlzLnRyYW5zZm9ybShvbGRWYWx1ZSwgbGFzdFByZWRpY2F0ZSwgcmV2ZXJzZSwgaXNDYXNlSW5zZW5zaXRpdmUpLCBwYXJzZWRFeHByZXNzaW9uKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgbXVsdGlwbGUgZXhwcmVzc2lvbnNcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEBwYXJhbSB7YW55W119IGV4cHJlc3Npb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmV2ZXJzZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzQ2FzZUluc2Vuc2l0aXZlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3JcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIHByaXZhdGUgbXVsdGlFeHByZXNzaW9uVHJhbnNmb3JtKHZhbHVlOiBhbnksIGV4cHJlc3Npb25zOiBhbnlbXSwgcmV2ZXJzZTogYm9vbGVhbiwgaXNDYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZSwgY29tcGFyYXRvcj86IEZ1bmN0aW9uKTogYW55IHtcbiAgICByZXR1cm4gZXhwcmVzc2lvbnMucmV2ZXJzZSgpLnJlZHVjZSgocmVzdWx0OiBhbnksIGV4cHJlc3Npb246IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtKHJlc3VsdCwgZXhwcmVzc2lvbiwgcmV2ZXJzZSwgaXNDYXNlSW5zZW5zaXRpdmUsIGNvbXBhcmF0b3IpO1xuICAgIH0sIHZhbHVlKTtcbiAgfVxufVxuIl19