ngx-order-pipe
Version:
Angular order pipe, order collection by a field
191 lines • 19 kB
JavaScript
import * as tslib_1 from "tslib";
var OrderPipe_1;
import { Pipe } from '@angular/core';
let OrderPipe = OrderPipe_1 = class OrderPipe {
/**
* Check if a value is a string
*
* @param value
*/
static isString(value) {
return typeof value === 'string' || value instanceof String;
}
/**
* Sorts values ignoring the case
*
* @param a
* @param b
*/
static caseInsensitiveSort(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
*/
static defaultCompare(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[]}
*/
static parseExpression(expression) {
expression = expression.replace(/\[(\w+)\]/g, '.$1');
expression = expression.replace(/^\./, '');
return expression.split('.');
}
/**
* Get value by expression
*
* @param object
* @param expression
* @returns {any}
*/
static getValue(object, expression) {
for (let i = 0, n = expression.length; i < n; ++i) {
const 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
*/
static setValue(object, value, expression) {
let i;
for (i = 0; i < expression.length - 1; i++) {
object = object[expression[i]];
}
object[expression[i]] = value;
}
transform(value, expression, reverse, isCaseInsensitive = false, comparator) {
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[]}
*/
sortArray(value, expression, reverse, isCaseInsensitive, comparator) {
const isDeepLink = expression && expression.indexOf('.') !== -1;
if (isDeepLink) {
expression = OrderPipe_1.parseExpression(expression);
}
let compareFn;
if (comparator && typeof comparator === 'function') {
compareFn = comparator;
}
else {
compareFn = isCaseInsensitive ? OrderPipe_1.caseInsensitiveSort : OrderPipe_1.defaultCompare;
}
const array = value.sort((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[]}
*/
transformObject(value, expression, reverse, isCaseInsensitive, comparator) {
const parsedExpression = OrderPipe_1.parseExpression(expression);
let lastPredicate = parsedExpression.pop();
let 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}
*/
multiExpressionTransform(value, expressions, reverse, isCaseInsensitive = false, comparator) {
return expressions.reverse().reduce((result, expression) => {
return this.transform(result, expression, reverse, isCaseInsensitive, comparator);
}, value);
}
};
OrderPipe = OrderPipe_1 = tslib_1.__decorate([
Pipe({
name: 'orderBy',
pure: false
})
], OrderPipe);
export { OrderPipe };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW9yZGVyLnBpcGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtb3JkZXItcGlwZS8iLCJzb3VyY2VzIjpbInNyYy9hcHAvb3JkZXItcGlwZS9uZ3gtb3JkZXIucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBTXBELElBQWEsU0FBUyxpQkFBdEIsTUFBYSxTQUFTO0lBRXBCOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQVU7UUFDeEIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxZQUFZLE1BQU0sQ0FBQztJQUM5RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBTSxFQUFFLENBQU07UUFDdkMsSUFBSSxXQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDbEQsT0FBTyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsT0FBTyxXQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLENBQU0sRUFBRSxDQUFNO1FBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNYLE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7UUFDRCxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDYixPQUFPLENBQUMsQ0FBQztTQUNWO1FBQ0QsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ2IsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUNYO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLENB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U0FBUztRQUNmLElBQUksRUFBRSxLQUFLO0tBQ1osQ0FBQztHQUNXLFNBQVMsQ0FrTnJCO1NBbE5ZLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBQaXBlKHtcbiAgbmFtZTogJ29yZGVyQnknLFxuICBwdXJlOiBmYWxzZVxufSlcbmV4cG9ydCBjbGFzcyBPcmRlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHN0cmluZ1xuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHN0YXRpYyBpc1N0cmluZyh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgdmFsdWVzIGlnbm9yaW5nIHRoZSBjYXNlXG4gICAqXG4gICAqIEBwYXJhbSBhXG4gICAqIEBwYXJhbSBiXG4gICAqL1xuICBzdGF0aWMgY2FzZUluc2Vuc2l0aXZlU29ydChhOiBhbnksIGI6IGFueSkge1xuICAgIGlmIChPcmRlclBpcGUuaXNTdHJpbmcoYSkgJiYgT3JkZXJQaXBlLmlzU3RyaW5nKGIpKSB7XG4gICAgICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO1xuICAgIH1cbiAgICByZXR1cm4gT3JkZXJQaXBlLmRlZmF1bHRDb21wYXJlKGEsIGIpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgY29tcGFyZSBtZXRob2RcbiAgICpcbiAgICogQHBhcmFtIGFcbiAgICogQHBhcmFtIGJcbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0Q29tcGFyZShhOiBhbnksIGI6IGFueSkge1xuICAgIGlmIChhID09PSBiKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKGEgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGlmIChiID09IG51bGwpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIGEgPiBiID8gMSA6IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGV4cHJlc3Npb24sIHNwbGl0IGludG8gaXRlbXNcbiAgICogQHBhcmFtIGV4cHJlc3Npb25cbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgc3RhdGljIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVwbGFjZSgvXFxbKFxcdyspXFxdL2csICcuJDEnKTtcbiAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5yZXBsYWNlKC9eXFwuLywgJycpO1xuICAgIHJldHVybiBleHByZXNzaW9uLnNwbGl0KCcuJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZhbHVlIGJ5IGV4cHJlc3Npb25cbiAgICpcbiAgICogQHBhcmFtIG9iamVjdFxuICAgKiBAcGFyYW0gZXhwcmVzc2lvblxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgc3RhdGljIGdldFZhbHVlKG9iamVjdDogYW55LCBleHByZXNzaW9uOiBzdHJpbmdbXSkge1xuICAgIGZvciAobGV0IGkgPSAwLCBuID0gZXhwcmVzc2lvbi5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIGNvbnN0IGsgPSBleHByZXNzaW9uW2ldO1xuICAgICAgaWYgKCEoayBpbiBvYmplY3QpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb2JqZWN0W2tdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFtrXSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W2tdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZhbHVlIGJ5IGV4cHJlc3Npb25cbiAgICpcbiAgICogQHBhcmFtIG9iamVjdFxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICogQHBhcmFtIGV4cHJlc3Npb25cbiAgICovXG4gIHN0YXRpYyBzZXRWYWx1ZShvYmplY3Q6IGFueSwgdmFsdWU6IGFueSwgZXhwcmVzc2lvbjogc3RyaW5nW10pIHtcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZXhwcmVzc2lvbi5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIG9iamVjdCA9IG9iamVjdFtleHByZXNzaW9uW2ldXTtcbiAgICB9XG5cbiAgICBvYmplY3RbZXhwcmVzc2lvbltpXV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHRyYW5zZm9ybSh2YWx1ZTogYW55IHwgYW55W10sIGV4cHJlc3Npb24/OiBhbnksIHJldmVyc2U/OiBib29sZWFuLCBpc0Nhc2VJbnNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlLCBjb21wYXJhdG9yPzogRnVuY3Rpb24pOiBhbnkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShleHByZXNzaW9uKSkge1xuICAgICAgcmV0dXJuIHRoaXMubXVsdGlFeHByZXNzaW9uVHJhbnNmb3JtKHZhbHVlLCBleHByZXNzaW9uLCByZXZlcnNlLCBpc0Nhc2VJbnNlbnNpdGl2ZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3J0QXJyYXkodmFsdWUuc2xpY2UoKSwgZXhwcmVzc2lvbiwgcmV2ZXJzZSwgaXNDYXNlSW5zZW5zaXRpdmUsIGNvbXBhcmF0b3IpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1PYmplY3QoT2JqZWN0LmFzc2lnbih7fSwgdmFsdWUpLCBleHByZXNzaW9uLCByZXZlcnNlLCBpc0Nhc2VJbnNlbnNpdGl2ZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnQgYXJyYXlcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEBwYXJhbSBleHByZXNzaW9uXG4gICAqIEBwYXJhbSByZXZlcnNlXG4gICAqIEBwYXJhbSBpc0Nhc2VJbnNlbnNpdGl2ZVxuICAgKiBAcGFyYW0gY29tcGFyYXRvclxuICAgKiBAcmV0dXJucyB7YW55W119XG4gICAqL1xuICBwcml2YXRlIHNvcnRBcnJheSh2YWx1ZTogYW55W10sIGV4cHJlc3Npb24/OiBhbnksIHJldmVyc2U/OiBib29sZWFuLCBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW4sIGNvbXBhcmF0b3I/OiBGdW5jdGlvbik6IGFueVtdIHtcbiAgICBjb25zdCBpc0RlZXBMaW5rID0gZXhwcmVzc2lvbiAmJiBleHByZXNzaW9uLmluZGV4T2YoJy4nKSAhPT0gLTE7XG5cbiAgICBpZiAoaXNEZWVwTGluaykge1xuICAgICAgZXhwcmVzc2lvbiA9IE9yZGVyUGlwZS5wYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbik7XG4gICAgfVxuXG4gICAgbGV0IGNvbXBhcmVGbjogRnVuY3Rpb247XG5cbiAgICBpZiAoY29tcGFyYXRvciAmJiB0eXBlb2YgY29tcGFyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcGFyZUZuID0gY29tcGFyYXRvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcGFyZUZuID0gaXNDYXNlSW5zZW5zaXRpdmUgPyBPcmRlclBpcGUuY2FzZUluc2Vuc2l0aXZlU29ydCA6IE9yZGVyUGlwZS5kZWZhdWx0Q29tcGFyZTtcbiAgICB9XG5cbiAgICBjb25zdCBhcnJheTogYW55W10gPSB2YWx1ZS5zb3J0KChhOiBhbnksIGI6IGFueSk6IG51bWJlciA9PiB7XG4gICAgICBpZiAoIWV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVGbihhLCBiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0RlZXBMaW5rKSB7XG4gICAgICAgIGlmIChhICYmIGIpIHtcbiAgICAgICAgICByZXR1cm4gY29tcGFyZUZuKGFbZXhwcmVzc2lvbl0sIGJbZXhwcmVzc2lvbl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wYXJlRm4oYSwgYik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wYXJlRm4oT3JkZXJQaXBlLmdldFZhbHVlKGEsIGV4cHJlc3Npb24pLCBPcmRlclBpcGUuZ2V0VmFsdWUoYiwgZXhwcmVzc2lvbikpO1xuICAgIH0pO1xuXG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgIHJldHVybiBhcnJheS5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSBPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEBwYXJhbSBleHByZXNzaW9uXG4gICAqIEBwYXJhbSByZXZlcnNlXG4gICAqIEBwYXJhbSBpc0Nhc2VJbnNlbnNpdGl2ZVxuICAgKiBAcGFyYW0gY29tcGFyYXRvclxuICAgKiBAcmV0dXJucyB7YW55W119XG4gICAqL1xuICBwcml2YXRlIHRyYW5zZm9ybU9iamVjdChcbiAgICB2YWx1ZTogYW55IHwgYW55W10sXG4gICAgZXhwcmVzc2lvbj86IGFueSxcbiAgICByZXZlcnNlPzogYm9vbGVhbixcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW4sXG4gICAgY29tcGFyYXRvcj86IEZ1bmN0aW9uXG4gICk6IGFueSB7XG4gICAgY29uc3QgcGFyc2VkRXhwcmVzc2lvbiA9IE9yZGVyUGlwZS5wYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbik7XG4gICAgbGV0IGxhc3RQcmVkaWNhdGUgPSBwYXJzZWRFeHByZXNzaW9uLnBvcCgpO1xuICAgIGxldCBvbGRWYWx1ZSA9IE9yZGVyUGlwZS5nZXRWYWx1ZSh2YWx1ZSwgcGFyc2VkRXhwcmVzc2lvbik7XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkob2xkVmFsdWUpKSB7XG4gICAgICBwYXJzZWRFeHByZXNzaW9uLnB1c2gobGFzdFByZWRpY2F0ZSk7XG4gICAgICBsYXN0UHJlZGljYXRlID0gbnVsbDtcbiAgICAgIG9sZFZhbHVlID0gT3JkZXJQaXBlLmdldFZhbHVlKHZhbHVlLCBwYXJzZWRFeHByZXNzaW9uKTtcbiAgICB9XG5cbiAgICBpZiAoIW9sZFZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgT3JkZXJQaXBlLnNldFZhbHVlKHZhbHVlLCB0aGlzLnRyYW5zZm9ybShvbGRWYWx1ZSwgbGFzdFByZWRpY2F0ZSwgcmV2ZXJzZSwgaXNDYXNlSW5zZW5zaXRpdmUpLCBwYXJzZWRFeHByZXNzaW9uKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgbXVsdGlwbGUgZXhwcmVzc2lvbnNcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEBwYXJhbSB7YW55W119IGV4cHJlc3Npb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmV2ZXJzZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzQ2FzZUluc2Vuc2l0aXZlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3JcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIHByaXZhdGUgbXVsdGlFeHByZXNzaW9uVHJhbnNmb3JtKHZhbHVlOiBhbnksIGV4cHJlc3Npb25zOiBhbnlbXSwgcmV2ZXJzZTogYm9vbGVhbiwgaXNDYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZSwgY29tcGFyYXRvcj86IEZ1bmN0aW9uKTogYW55IHtcbiAgICByZXR1cm4gZXhwcmVzc2lvbnMucmV2ZXJzZSgpLnJlZHVjZSgocmVzdWx0OiBhbnksIGV4cHJlc3Npb246IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtKHJlc3VsdCwgZXhwcmVzc2lvbiwgcmV2ZXJzZSwgaXNDYXNlSW5zZW5zaXRpdmUsIGNvbXBhcmF0b3IpO1xuICAgIH0sIHZhbHVlKTtcbiAgfVxufVxuIl19