ngx-order-pipe.js 5.8 KB

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