diff --git a/TODO.md b/TODO.md
index 7dda2c0..3a85103 100644
--- a/TODO.md
+++ b/TODO.md
@@ -15,8 +15,7 @@
## 0.1.1
- [x] `Switch` and `Case` components
- [x] Fix bug with multiline nested component attributes.
-- [ ] `Each` with `Map`
-- [ ] `Each` with children in addition to `render`
+- [x] `Each` with `Map`
- [ ] `WhenNotEmpty` with `Map`
## 0.1.0
diff --git a/web-view-components/src/main/groovy/groowt/view/component/web/lib/Each.groovy b/web-view-components/src/main/groovy/groowt/view/component/web/lib/Each.groovy
index 3fca04b..a0f4ff5 100644
--- a/web-view-components/src/main/groovy/groowt/view/component/web/lib/Each.groovy
+++ b/web-view-components/src/main/groovy/groowt/view/component/web/lib/Each.groovy
@@ -6,7 +6,7 @@ import org.jetbrains.annotations.Nullable
class Each extends DelegatingWebViewComponent {
- private final Collection items
+ private final Object items
private final @Nullable Closure transform
Each(Map attr) {
@@ -18,8 +18,16 @@ class Each extends DelegatingWebViewComponent {
protected View getDelegate() {
return { Writer w ->
def cw = new DefaultComponentWriter(w, this.context.renderContext, this.context)
- items.forEach {
- cw << (transform ? transform(it) : it)
+ if (items instanceof Collection) {
+ items.each {
+ cw << (transform ? transform(it) : it)
+ }
+ } else if (items instanceof Map) {
+ items.each {
+ cw << (transform ? transform(it) : it)
+ }
+ } else {
+ throw new IllegalArgumentException("The 'items' attribute of Each may only be a Collection or Map.")
}
}
}
diff --git a/web-view-components/src/test/groovy/groowt/view/component/web/lib/EachTests.groovy b/web-view-components/src/test/groovy/groowt/view/component/web/lib/EachTests.groovy
index 21bab20..6439d81 100644
--- a/web-view-components/src/test/groovy/groowt/view/component/web/lib/EachTests.groovy
+++ b/web-view-components/src/test/groovy/groowt/view/component/web/lib/EachTests.groovy
@@ -17,4 +17,12 @@ class EachTests extends AbstractWebViewComponentTests {
)
}
+ @Test
+ void simpleMap() {
+ this.doTest(
+ '
a: 0
b: 1
' + ) + } + }