Skip to content

Commit 774687c

Browse files
authored
airframe-rx: Support generic event handlers (#893)
* airframe-rx-widget: Support registring onClick/onEvent handlers * Support generic event handlers
1 parent 7a8fd0c commit 774687c

File tree

3 files changed

+14
-15
lines changed

3 files changed

+14
-15
lines changed

airframe-rx-widget/src/main/scala/wvlet/airframe/rx/widget/RxDOM.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ private[widget] object RxDOM extends LogSupport {
5959
htmlNode.setAttribute(attrName, value.mkString(" "))
6060
}
6161
}
62+
for ((eventType, handler) <- config.onEventHandler) {
63+
htmlNode.setEventListener(eventType, handler.asInstanceOf[dom.Event => Unit])
64+
}
6265
htmlNode
6366
}
6467

airframe-rx-widget/src/main/scala/wvlet/airframe/rx/widget/RxWidget.scala

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ trait RxWidget {
4343
* Add an extra CSS style
4444
*/
4545
def addStyle(styleValue: String): this.type = updateConfig(config.addStyle(styleValue))
46+
47+
def onClick[U](handler: dom.MouseEvent => U): this.type = updateConfig(config.onClick(handler))
48+
4649
}
4750

4851
/**
@@ -119,7 +122,9 @@ trait RxElement extends RxWidget {
119122
}
120123

121124
object RxElement {
122-
def apply(node: xml.Node): RxElement = new RxElement { override def render: Node = node }
125+
def apply(node: xml.Node): RxElement = new RxElement { override def render: Node = node }
126+
def apply(elem: RxElement): RxElement = new RxElement { override def render: Node = new xml.Atom(elem) }
127+
def apply[A](rx: Rx[A]): RxElement = new RxElement { override def render: Node = new xml.Atom(rx) }
123128
}
124129

125130
/**
@@ -128,13 +133,13 @@ object RxElement {
128133
case class RxWidgetConfig(
129134
id: Option[String] = None,
130135
attributes: Map[String, Seq[String]] = Map.empty,
131-
onClickHandler: Option[dom.MouseEvent => Unit] = None,
132-
onEventHandler: Option[dom.Event => Unit] = None
136+
onEventHandler: Map[String, Function1[_, _]] = Map.empty
133137
) {
134138

135139
// TODO: Add all event types https://www.w3schools.com/jsref/dom_obj_event.asp
136-
def onClick(handler: dom.MouseEvent => Unit) = this.copy(onClickHandler = Some(handler))
137-
def onEvent(handler: dom.Event => Unit) = this.copy(onEventHandler = Some(handler))
140+
def onClick[U](handler: dom.MouseEvent => U): RxWidgetConfig = onEvent("onClick", handler)
141+
def onEvent[E <: dom.Event, U](eventType: String, handler: E => U): RxWidgetConfig =
142+
this.copy(onEventHandler = onEventHandler + (eventType -> handler))
138143

139144
def withId(id: String): RxWidgetConfig = this.copy(id = Some(id))
140145

airframe-rx-widget/src/main/scala/wvlet/airframe/rx/widget/ui/bootstrap/Button.scala

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
*/
1414
package wvlet.airframe.rx.widget.ui.bootstrap
1515

16-
import org.scalajs.dom
1716
import wvlet.airframe.rx.widget.RxElement
1817
import wvlet.log.LogSupport
1918

@@ -41,19 +40,11 @@ case class Button(
4140

4241
def render: xml.Node = {
4342
if (isActive) {
44-
<button type="button" class="btn" onclick={
45-
config.onClickHandler.getOrElse { x: dom.MouseEvent =>
46-
}
47-
}>{name}</button>
43+
<button type="button" class="btn">{name}</button>
4844
} else {
4945
<button type="button" class="btn" disabled="true">{name}</button>
5046
}
5147
}
52-
53-
def onClick(handler: dom.MouseEvent => Unit): Button = {
54-
updateConfig(config.onClick(handler))
55-
}
56-
5748
}
5849

5950
object Button extends LogSupport {

0 commit comments

Comments
 (0)