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
|
||||
|
||||
import top.davidon.sfs.dom.codecs.StringCodec
|
||||
import top.davidon.sfs.dom.mods.Modifier
|
||||
import top.davidon.sfs.dom.tags.Tag
|
||||
|
||||
/** tag + modifiers + value */
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
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,
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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.keys.Key
|
||||
|
|
@ -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
|
||||
|
|
|
@ -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])
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue