Skip to content
This repository has been archived by the owner on Feb 22, 2018. It is now read-only.

feat(OrderBy): allow Iterable for both items & expressions #1329

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 11 additions & 10 deletions lib/formatter/order_by.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ part of angular.formatter_internal;
typedef dynamic _Mapper(dynamic e);

/**
* Orders the the elements of a list using a predicate.
* Orders the the elements of an [Iterable] using a predicate.
*
* # Usage
*
Expand All @@ -14,9 +14,9 @@ typedef dynamic _Mapper(dynamic e);
* - **a string**: a string containing an expression, such as "user.lastName", used to order the list.
* - **a custom callable expression**: an expression that will be called to transform the element
* before a sort.
* - **a list**: the list may consist of either strings or callable expressions. A list expression
* indicates a list of fallback expressions to use when a comparision results in the items
* being equal.
* - **an [Iterable]**: it may consist of either strings or callable expressions. A list expression
* indicates a list of fallback expressions to use when a comparison results in the items being
* equal.
*
* If the expression is explicitly empty(`orderBy:''`), the elements are sorted in
* ascending order, using the default comparator, `+`.
Expand All @@ -26,8 +26,8 @@ typedef dynamic _Mapper(dynamic e);
* - `+`: sort the elements in ascending order. This is the default.
* - `-`: sort the elements in descending order.
*
* Alternately, by appending `true`, you can set "descending order" to true, which has the same effect as the `-`
* prefix.
* Alternately, by appending `true`, you can set "descending order" to true, which has the same
* effect as the `-` prefix.
*
* # Examples
*
Expand Down Expand Up @@ -166,15 +166,16 @@ class OrderBy implements Function {
* - `expression`: String/Function or Array of String/Function.
* - `descending`: When specified, use descending order. (The default is ascending order.)
*/
List call(List items, var expression, [bool descending=false]) {
if (items == null) {
return null;
}
List call(Iterable items, var expression, [bool descending=false]) {
if (items == null) return null;
if (items is! List) items = items.toList();
List expressions = null;
if (expression is String || expression is _Mapper) {
expressions = [expression];
} else if (expression is List) {
expressions = expression as List;
} else if (expression is Iterable) {
expressions = expression.toList();
}
if (expressions == null || expressions.length == 0) {
// AngularJS behavior. You must have an expression to get any work done.
Expand Down
16 changes: 16 additions & 0 deletions test/formatter/order_by_spec.dart
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ main() {
expect(parse('list | orderBy:"-"').eval(scope.context, formatters)).toEqual([3, 2, 1]);
});

it('should sort Iterables', (Scope scope, Parser parse, FormatterMap formatters) {
scope.context['iterable'] = [1, 3, 2].map((x) => x);
expect(parse('iterable | orderBy:""').eval(scope.context, formatters)).toEqual([1, 2, 3]);
});

it('should sort by expression', (Scope scope, Parser parse, FormatterMap formatters) {
expect(parse('authors | orderBy:"firstName"').eval(scope.context, formatters)).toEqual([
Emily___Bronte,
Expand Down Expand Up @@ -165,6 +170,17 @@ main() {
]);
});

it('should support an Iterable of expressions',
(Scope scope, Parser parse, FormatterMap formatters) {
scope.context['exp'] = ["-a", "-b"].map((x) => x);
expect(parse('items | orderBy:exp').eval(scope.context, formatters)).toEqual([
{'a': 20, 'b': 20},
{'a': 20, 'b': 10},
{'a': 10, 'b': 20},
{'a': 10, 'b': 10},
]);
});

it('should support function expressions',
(Scope scope, Parser parse, FormatterMap formatters) {
scope.context['func'] = (e) => -(e['a'] + e['b']);
Expand Down