From d2780f8bb849c62d995d939d00594ebe93428631 Mon Sep 17 00:00:00 2001 From: Marko Vuksanovic Date: Sat, 19 Apr 2014 09:19:12 +1000 Subject: [PATCH] feat(formatter): Add arrayify formatter. MapFormatter can be used with map and ng-repeat to display a list of key value pairs Closes #394 Closes #931 --- lib/formatter/arrayify.dart | 27 +++++++++++++++++++++++++++ lib/formatter/module.dart | 1 + lib/formatter/module_internal.dart | 2 ++ test/angular_spec.dart | 1 + test/formatter/arrayify_spec.dart | 18 ++++++++++++++++++ 5 files changed, 49 insertions(+) create mode 100644 lib/formatter/arrayify.dart create mode 100644 test/formatter/arrayify_spec.dart diff --git a/lib/formatter/arrayify.dart b/lib/formatter/arrayify.dart new file mode 100644 index 000000000..e38bc1a34 --- /dev/null +++ b/lib/formatter/arrayify.dart @@ -0,0 +1,27 @@ +part of angular.formatter_internal; + +/** + * Given a Map, returns a list of items which have `key` and `value` property. + * + * Usage: + * + *
+ * {{item.key}}: {{item.value}} + *
+ */ +@Formatter(name:'arrayify') +class Arrayify implements Function { + List<_KeyValue> call(Map inputMap) { + if (inputMap == null) return null; + List<_KeyValue> result = []; + inputMap.forEach((k, v) => result.add(new _KeyValue(k, v))); + return result; + } +} + +class _KeyValue { + K key; + V value; + + _KeyValue(this.key, this.value); +} diff --git a/lib/formatter/module.dart b/lib/formatter/module.dart index c2dc22e15..ea84d0231 100644 --- a/lib/formatter/module.dart +++ b/lib/formatter/module.dart @@ -29,6 +29,7 @@ export "package:angular/formatter/module_internal.dart" show Json, LimitTo, Lowercase, + Arrayify, Number, OrderBy, Uppercase, diff --git a/lib/formatter/module_internal.dart b/lib/formatter/module_internal.dart index 576b9959c..f11bc9587 100644 --- a/lib/formatter/module_internal.dart +++ b/lib/formatter/module_internal.dart @@ -13,6 +13,7 @@ part 'filter.dart'; part 'json.dart'; part 'limit_to.dart'; part 'lowercase.dart'; +part 'arrayify.dart'; part 'number.dart'; part 'order_by.dart'; part 'uppercase.dart'; @@ -20,6 +21,7 @@ part 'stringify.dart'; class FormatterModule extends Module { FormatterModule() { + type(Arrayify); type(Currency); type(Date); type(Filter); diff --git a/test/angular_spec.dart b/test/angular_spec.dart index 13d89c631..26c023deb 100644 --- a/test/angular_spec.dart +++ b/test/angular_spec.dart @@ -215,6 +215,7 @@ main() { "angular.formatter_internal.Json", "angular.formatter_internal.LimitTo", "angular.formatter_internal.Lowercase", + "angular.formatter_internal.Arrayify", "angular.formatter_internal.Number", "angular.formatter_internal.OrderBy", "angular.formatter_internal.Stringify", diff --git a/test/formatter/arrayify_spec.dart b/test/formatter/arrayify_spec.dart new file mode 100644 index 000000000..049cd486c --- /dev/null +++ b/test/formatter/arrayify_spec.dart @@ -0,0 +1,18 @@ +library map_spec; + +import '../_specs.dart'; +import 'package:angular/formatter/module.dart'; + +void main() { + describe('arrayify', () { + it('should convert a map to list of key value pairs', (Parser parse, FormatterMap formatters) { + List result = parse('{"key1": "value1", "key2": "value2"} | arrayify').eval(null, formatters); + expect(result.map((kv) => kv.key)).toEqual(["key1", "key2"]); + expect(result.map((kv) => kv.value)).toEqual(["value1", "value2"]); + }); + + it('should treat null as noop', (Parser parse, FormatterMap formatters) { + expect(parse('null | arrayify').eval(null, formatters)).toEqual(null); + }); + }); +}