feat: Events
This commit is contained in:
parent
959241c16b
commit
a942723186
13 changed files with 69 additions and 14 deletions
|
@ -1,6 +1,6 @@
|
||||||
package top.davidon.sfs.dom
|
package top.davidon.sfs.dom
|
||||||
|
|
||||||
import top.davidon.sfs.dom.codecs.StringCodec
|
import top.davidon.sfs.dom.mods.Modifier
|
||||||
import top.davidon.sfs.dom.tags.Tag
|
import top.davidon.sfs.dom.tags.Tag
|
||||||
|
|
||||||
/** tag + modifiers + value */
|
/** tag + modifiers + value */
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package top.davidon.sfs.renderers
|
package top.davidon.sfs.dom
|
||||||
|
|
||||||
import org.scalajs.dom
|
import org.scalajs.dom
|
||||||
import top.davidon.sfs.dom.Modifier
|
import top.davidon.sfs.dom.mods.Modifier
|
||||||
|
|
||||||
trait ReactiveRenderer {
|
trait ReactiveRenderer {
|
||||||
def valueFunc[F](element: dom.Element, value: F): Unit
|
def valueFunc[F](element: dom.Element, value: F): Unit
|
|
@ -0,0 +1,5 @@
|
||||||
|
package top.davidon.sfs.dom
|
||||||
|
|
||||||
|
trait TriggerableValue[T] {
|
||||||
|
def trigger[T](value: T): Unit
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
package top.davidon.sfs.dom.codecs
|
||||||
|
|
||||||
|
class EmptyCodec[T] extends Codec[T, Unit] {
|
||||||
|
override def decode(domValue: Unit): T = ???
|
||||||
|
override def encode(scalaValue: T): Unit = {}
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
package top.davidon.sfs.dom.keys
|
package top.davidon.sfs.dom.keys
|
||||||
import top.davidon.sfs.dom.codecs.{Codec, StringCodec}
|
import top.davidon.sfs.dom.codecs.{Codec, StringCodec}
|
||||||
import top.davidon.sfs.dom.{Modifier, Value}
|
import top.davidon.sfs.dom.Value
|
||||||
|
import top.davidon.sfs.dom.mods.Modifier
|
||||||
|
|
||||||
class AriaAttr[V](
|
class AriaAttr[V](
|
||||||
suffix: String,
|
suffix: String,
|
||||||
|
|
|
@ -1,5 +1,33 @@
|
||||||
package top.davidon.sfs.dom.keys
|
package top.davidon.sfs.dom.keys
|
||||||
|
|
||||||
import org.scalajs.dom
|
import org.scalajs.dom
|
||||||
|
import top.davidon.sfs.dom.codecs.{EmptyCodec, StringAsIsCodec}
|
||||||
|
import top.davidon.sfs.dom.mods.{EventMod, Modifier}
|
||||||
|
import top.davidon.sfs.dom.{TriggerableValue, Value}
|
||||||
|
|
||||||
class EventProp[Event <: dom.Event](override val name: String) extends Key {}
|
class EventProp[E <: dom.Event](override val name: String) extends Key {
|
||||||
|
|
||||||
|
/** Don't use with StringRenderer and ssr off/false
|
||||||
|
* @param value
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
def :=(value: E => Unit): Modifier[EventMod[E], Unit] = {
|
||||||
|
Modifier(this, Value(EventMod(this, value), EmptyCodec()))
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Don't use with StringRenderer and ssr off/false
|
||||||
|
* @param value
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
def :=(value: TriggerableValue[E]): Modifier[EventMod[E], Unit] = {
|
||||||
|
Modifier(this, Value(EventMod(this, value.trigger), EmptyCodec()))
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Only use with StringRenderer and ssr off/false
|
||||||
|
* @param value
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
def :=(value: String): Modifier[String, String] = {
|
||||||
|
Modifier(this, Value(value, StringAsIsCodec))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
package top.davidon.sfs.dom.keys
|
package top.davidon.sfs.dom.keys
|
||||||
|
|
||||||
import top.davidon.sfs.dom.codecs.{Codec, StringCodec}
|
import top.davidon.sfs.dom.codecs.{Codec, StringCodec}
|
||||||
import top.davidon.sfs.dom.{Modifier, Value}
|
import top.davidon.sfs.dom.Value
|
||||||
|
import top.davidon.sfs.dom.mods.Modifier
|
||||||
|
|
||||||
class HtmlAttr[V](
|
class HtmlAttr[V](
|
||||||
override val name: String,
|
override val name: String,
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package top.davidon.sfs.dom.keys
|
package top.davidon.sfs.dom.keys
|
||||||
import top.davidon.sfs.dom.codecs.Codec
|
import top.davidon.sfs.dom.codecs.Codec
|
||||||
import top.davidon.sfs.dom.{Modifier, Value}
|
import top.davidon.sfs.dom.Value
|
||||||
|
import top.davidon.sfs.dom.mods.Modifier
|
||||||
|
|
||||||
class HtmlProp[V, DomV](
|
class HtmlProp[V, DomV](
|
||||||
override val name: String,
|
override val name: String,
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package top.davidon.sfs.dom.keys
|
package top.davidon.sfs.dom.keys
|
||||||
import top.davidon.sfs.dom.codecs.{Codec, StringCodec}
|
import top.davidon.sfs.dom.codecs.{Codec, StringCodec}
|
||||||
import top.davidon.sfs.dom.{Modifier, Value}
|
import top.davidon.sfs.dom.Value
|
||||||
|
import top.davidon.sfs.dom.mods.Modifier
|
||||||
|
|
||||||
class SvgAttr[V](
|
class SvgAttr[V](
|
||||||
val localName: String,
|
val localName: String,
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
package top.davidon.sfs.dom.mods
|
||||||
|
|
||||||
|
import org.scalajs.dom
|
||||||
|
import top.davidon.sfs.dom.keys.EventProp
|
||||||
|
|
||||||
|
class EventMod[E <: dom.Event](val key: EventProp[E], val value: E => Unit) {}
|
|
@ -1,5 +1,6 @@
|
||||||
package top.davidon.sfs.dom
|
package top.davidon.sfs.dom.mods
|
||||||
|
|
||||||
|
import top.davidon.sfs.dom.Value
|
||||||
import top.davidon.sfs.dom.codecs.Codec
|
import top.davidon.sfs.dom.codecs.Codec
|
||||||
import top.davidon.sfs.dom.keys.Key
|
import top.davidon.sfs.dom.keys.Key
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package top.davidon.sfs.dom.tags
|
package top.davidon.sfs.dom.tags
|
||||||
|
|
||||||
import org.scalajs.dom
|
import org.scalajs.dom
|
||||||
import top.davidon.sfs.dom.codecs.StringCodec
|
import top.davidon.sfs.dom.mods.{EventMod, Modifier}
|
||||||
import top.davidon.sfs.dom.{Element, Modifier, Value}
|
import top.davidon.sfs.dom.{Element, Value}
|
||||||
|
|
||||||
trait Tag[+Ref <: dom.Element] {
|
trait Tag[+Ref <: dom.Element] {
|
||||||
val name: String
|
val name: String
|
||||||
|
|
|
@ -2,7 +2,8 @@ package top.davidon.sfs.renderers
|
||||||
|
|
||||||
import org.scalajs.dom
|
import org.scalajs.dom
|
||||||
import top.davidon.sfs.dom.keys.{EventProp, HtmlProp}
|
import top.davidon.sfs.dom.keys.{EventProp, HtmlProp}
|
||||||
import top.davidon.sfs.dom.{Element, Renderer, Value}
|
import top.davidon.sfs.dom.mods.{EventMod, Modifier}
|
||||||
|
import top.davidon.sfs.dom.{Element, ReactiveRenderer, Renderer, Value}
|
||||||
|
|
||||||
import scala.scalajs.js
|
import scala.scalajs.js
|
||||||
|
|
||||||
|
@ -19,7 +20,7 @@ class ClientSideRenderer(val root: dom.Element)
|
||||||
override def valueFunc[F](element: dom.Element, value: F): Unit = {}
|
override def valueFunc[F](element: dom.Element, value: F): Unit = {}
|
||||||
|
|
||||||
override def modifierFunc[F, T](
|
override def modifierFunc[F, T](
|
||||||
modifier: top.davidon.sfs.dom.Modifier[F, T],
|
modifier: Modifier[F, T],
|
||||||
value: F
|
value: F
|
||||||
): Unit = {}
|
): Unit = {}
|
||||||
|
|
||||||
|
@ -33,7 +34,11 @@ class ClientSideRenderer(val root: dom.Element)
|
||||||
case _: HtmlProp[?, ?] =>
|
case _: HtmlProp[?, ?] =>
|
||||||
el.asInstanceOf[js.Dynamic]
|
el.asInstanceOf[js.Dynamic]
|
||||||
.updateDynamic(m.key.name)(m.value().asInstanceOf[js.Any])
|
.updateDynamic(m.key.name)(m.value().asInstanceOf[js.Any])
|
||||||
case _: EventProp[?] => ???
|
case _: EventProp[?] =>
|
||||||
|
el.addEventListener(
|
||||||
|
m.key.name,
|
||||||
|
m.value.value.asInstanceOf[EventMod[?]].value
|
||||||
|
)
|
||||||
case _ =>
|
case _ =>
|
||||||
el.setAttribute(m.key.name, m.value().asInstanceOf[String])
|
el.setAttribute(m.key.name, m.value().asInstanceOf[String])
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue