ngx-order-pipe.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. import { __decorate } from 'tslib';
  2. import { Pipe, NgModule } from '@angular/core';
  3. var OrderPipe = /** @class */ (function () {
  4. function OrderPipe() {
  5. }
  6. OrderPipe_1 = OrderPipe;
  7. /**
  8. * Check if a value is a string
  9. *
  10. * @param value
  11. */
  12. OrderPipe.isString = function (value) {
  13. return typeof value === "string" || value instanceof String;
  14. };
  15. /**
  16. * Sorts values ignoring the case
  17. *
  18. * @param a
  19. * @param b
  20. */
  21. OrderPipe.caseInsensitiveSort = function (a, b) {
  22. if (OrderPipe_1.isString(a) && OrderPipe_1.isString(b)) {
  23. return a.localeCompare(b);
  24. }
  25. return OrderPipe_1.defaultCompare(a, b);
  26. };
  27. /**
  28. * Default compare method
  29. *
  30. * @param a
  31. * @param b
  32. */
  33. OrderPipe.defaultCompare = function (a, b) {
  34. if (a === b) {
  35. return 0;
  36. }
  37. if (a == null) {
  38. return 1;
  39. }
  40. if (b == null) {
  41. return -1;
  42. }
  43. return a > b ? 1 : -1;
  44. };
  45. /**
  46. * Parse expression, split into items
  47. * @param expression
  48. * @returns {string[]}
  49. */
  50. OrderPipe.parseExpression = function (expression) {
  51. expression = expression.replace(/\[(\w+)\]/g, ".$1");
  52. expression = expression.replace(/^\./, "");
  53. return expression.split(".");
  54. };
  55. /**
  56. * Get value by expression
  57. *
  58. * @param object
  59. * @param expression
  60. * @returns {any}
  61. */
  62. OrderPipe.getValue = function (object, expression) {
  63. for (var i = 0, n = expression.length; i < n; ++i) {
  64. if (!object) {
  65. return;
  66. }
  67. var k = expression[i];
  68. if (!(k in object)) {
  69. return;
  70. }
  71. if (typeof object[k] === "function") {
  72. object = object[k]();
  73. }
  74. else {
  75. object = object[k];
  76. }
  77. }
  78. return object;
  79. };
  80. /**
  81. * Set value by expression
  82. *
  83. * @param object
  84. * @param value
  85. * @param expression
  86. */
  87. OrderPipe.setValue = function (object, value, expression) {
  88. var i;
  89. for (i = 0; i < expression.length - 1; i++) {
  90. object = object[expression[i]];
  91. }
  92. object[expression[i]] = value;
  93. };
  94. OrderPipe.prototype.transform = function (value, expression, reverse, isCaseInsensitive, comparator) {
  95. if (isCaseInsensitive === void 0) { isCaseInsensitive = false; }
  96. if (!value) {
  97. return value;
  98. }
  99. if (Array.isArray(expression)) {
  100. return this.multiExpressionTransform(value, expression, reverse, isCaseInsensitive, comparator);
  101. }
  102. if (Array.isArray(value)) {
  103. return this.sortArray(value.slice(), expression, reverse, isCaseInsensitive, comparator);
  104. }
  105. if (typeof value === "object") {
  106. return this.transformObject(Object.assign({}, value), expression, reverse, isCaseInsensitive, comparator);
  107. }
  108. return value;
  109. };
  110. /**
  111. * Sort array
  112. *
  113. * @param value
  114. * @param expression
  115. * @param reverse
  116. * @param isCaseInsensitive
  117. * @param comparator
  118. * @returns {any[]}
  119. */
  120. OrderPipe.prototype.sortArray = function (value, expression, reverse, isCaseInsensitive, comparator) {
  121. var isDeepLink = expression && expression.indexOf(".") !== -1;
  122. if (isDeepLink) {
  123. expression = OrderPipe_1.parseExpression(expression);
  124. }
  125. var compareFn;
  126. if (comparator && typeof comparator === "function") {
  127. compareFn = comparator;
  128. }
  129. else {
  130. compareFn = isCaseInsensitive
  131. ? OrderPipe_1.caseInsensitiveSort
  132. : OrderPipe_1.defaultCompare;
  133. }
  134. var array = value.sort(function (a, b) {
  135. if (!expression) {
  136. return compareFn(a, b);
  137. }
  138. if (!isDeepLink) {
  139. if (a && b) {
  140. return compareFn(a[expression], b[expression]);
  141. }
  142. return compareFn(a, b);
  143. }
  144. return compareFn(OrderPipe_1.getValue(a, expression), OrderPipe_1.getValue(b, expression));
  145. });
  146. if (reverse) {
  147. return array.reverse();
  148. }
  149. return array;
  150. };
  151. /**
  152. * Transform Object
  153. *
  154. * @param value
  155. * @param expression
  156. * @param reverse
  157. * @param isCaseInsensitive
  158. * @param comparator
  159. * @returns {any[]}
  160. */
  161. OrderPipe.prototype.transformObject = function (value, expression, reverse, isCaseInsensitive, comparator) {
  162. var parsedExpression = OrderPipe_1.parseExpression(expression);
  163. var lastPredicate = parsedExpression.pop();
  164. var oldValue = OrderPipe_1.getValue(value, parsedExpression);
  165. if (!Array.isArray(oldValue)) {
  166. parsedExpression.push(lastPredicate);
  167. lastPredicate = null;
  168. oldValue = OrderPipe_1.getValue(value, parsedExpression);
  169. }
  170. if (!oldValue) {
  171. return value;
  172. }
  173. OrderPipe_1.setValue(value, this.transform(oldValue, lastPredicate, reverse, isCaseInsensitive), parsedExpression);
  174. return value;
  175. };
  176. /**
  177. * Apply multiple expressions
  178. *
  179. * @param value
  180. * @param {any[]} expressions
  181. * @param {boolean} reverse
  182. * @param {boolean} isCaseInsensitive
  183. * @param {Function} comparator
  184. * @returns {any}
  185. */
  186. OrderPipe.prototype.multiExpressionTransform = function (value, expressions, reverse, isCaseInsensitive, comparator) {
  187. var _this = this;
  188. if (isCaseInsensitive === void 0) { isCaseInsensitive = false; }
  189. return expressions.reverse().reduce(function (result, expression) {
  190. return _this.transform(result, expression, reverse, isCaseInsensitive, comparator);
  191. }, value);
  192. };
  193. var OrderPipe_1;
  194. OrderPipe = OrderPipe_1 = __decorate([
  195. Pipe({
  196. name: "orderBy",
  197. pure: false
  198. })
  199. ], OrderPipe);
  200. return OrderPipe;
  201. }());
  202. var OrderModule = /** @class */ (function () {
  203. function OrderModule() {
  204. }
  205. OrderModule = __decorate([
  206. NgModule({
  207. declarations: [OrderPipe],
  208. exports: [OrderPipe],
  209. providers: [OrderPipe]
  210. })
  211. ], OrderModule);
  212. return OrderModule;
  213. }());
  214. export { OrderModule, OrderPipe };
  215. //# sourceMappingURL=ngx-order-pipe.js.map