feat: Events

This commit is contained in:
DavidOnTop 2024-09-21 18:17:23 +02:00
parent 959241c16b
commit a942723186
No known key found for this signature in database
GPG key ID: 5D05538A45D5149F
13 changed files with 69 additions and 14 deletions

View file

@ -1,6 +1,6 @@
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
/** tag + modifiers + value */

View file

@ -1,7 +1,7 @@
package top.davidon.sfs.renderers
package top.davidon.sfs.dom
import org.scalajs.dom
import top.davidon.sfs.dom.Modifier
import top.davidon.sfs.dom.mods.Modifier
trait ReactiveRenderer {
def valueFunc[F](element: dom.Element, value: F): Unit

View file

@ -0,0 +1,5 @@
package top.davidon.sfs.dom
trait TriggerableValue[T] {
def trigger[T](value: T): Unit
}

View file

@ -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 = {}
}

View file

@ -1,6 +1,7 @@
package top.davidon.sfs.dom.keys
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](
suffix: String,

View file

@ -1,5 +1,33 @@
package top.davidon.sfs.dom.keys
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))
}
}

View file

@ -1,7 +1,8 @@
package top.davidon.sfs.dom.keys
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](
override val name: String,

View file

@ -1,6 +1,7 @@
package top.davidon.sfs.dom.keys
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](
override val name: String,

View file

@ -1,6 +1,7 @@
package top.davidon.sfs.dom.keys
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](
val localName: String,

View file

@ -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) {}

View file

@ -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.keys.Key

View file

@ -1,8 +1,8 @@
package top.davidon.sfs.dom.tags
import org.scalajs.dom
import top.davidon.sfs.dom.codecs.StringCodec
import top.davidon.sfs.dom.{Element, Modifier, Value}
import top.davidon.sfs.dom.mods.{EventMod, Modifier}
import top.davidon.sfs.dom.{Element, Value}
trait Tag[+Ref <: dom.Element] {
val name: String

View file

@ -2,7 +2,8 @@ package top.davidon.sfs.renderers
import org.scalajs.dom
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
@ -19,7 +20,7 @@ class ClientSideRenderer(val root: dom.Element)
override def valueFunc[F](element: dom.Element, value: F): Unit = {}
override def modifierFunc[F, T](
modifier: top.davidon.sfs.dom.Modifier[F, T],
modifier: Modifier[F, T],
value: F
): Unit = {}
@ -33,7 +34,11 @@ class ClientSideRenderer(val root: dom.Element)
case _: HtmlProp[?, ?] =>
el.asInstanceOf[js.Dynamic]
.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 _ =>
el.setAttribute(m.key.name, m.value().asInstanceOf[String])
}