Skip to content

Commit

Permalink
fix todolist input state
Browse files Browse the repository at this point in the history
  • Loading branch information
rmgk committed Mar 10, 2024
1 parent 37ed3dc commit f91a7b4
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 17 deletions.
16 changes: 11 additions & 5 deletions Modules/Example Todolist/src/main/scala/todo/TaskData.scala
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,13 @@ class TaskReferences(toggleAll: Event[dom.Event], storePrefix: String) {
`type` := "checkbox",
doneClick.data,
).render.reattach(Signal:
checked := (if (taskData.value.done) then Some(checked.v) else None)
if taskData.value.done
then (elem: dom.html.Input) =>
elem.checked = true
elem.setAttribute("checked", "checked")
else (elem: dom.html.Input) =>
elem.checked = false
elem.removeAttribute("checked")
),
label.render.reattach(taskData.map(c => c.desc)),
removeButton.data
Expand All @@ -156,17 +162,17 @@ class TaskReferences(toggleAll: Event[dom.Event], storePrefix: String) {
}
}

given RangeSplice[Modifier] with {
given RangeSplice[dom.Element, Modifier] with {
override def splice(anchor: dom.Element, range: dom.Range, value: Modifier): Unit =
println(s"applying $value to $anchor")
anchor match
case elem: dom.Element => value.applyTo(elem)
}

given RangeSplice[dom.Element => Unit] with {
override def splice(anchor: dom.Element, range: dom.Range, value: dom.Element => Unit): Unit =
given [A <: dom.Element]: RangeSplice[A, A => Unit] with {
override def splice(anchor: A, range: dom.Range, value: A => Unit): Unit =
anchor match
case elem: dom.Element => value.apply(elem)
case elem: A => value.apply(elem)
}

implicit def optionAttrValue[T](implicit ev: AttrValue[T]): AttrValue[Option[T]] =
Expand Down
23 changes: 12 additions & 11 deletions Modules/Reactives/js/src/main/scala/reactives/extra/Tags.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,34 +15,35 @@ import scala.scalajs.js

object Tags {

trait RangeSplice[-T]:
def splice(anchor: dom.Element, range: dom.Range, value: T): Unit
trait RangeSplice[-A <: dom.Element, -T]:
def splice(anchor: A, range: dom.Range, value: T): Unit
object RangeSplice:
given elem: RangeSplice[dom.Element] with {
given elem: RangeSplice[dom.Element, dom.Element] with {
override def splice(anchor: dom.Element, range: Range, value: dom.Element) =
range.insertNode(value)
}
given many[T](using other: RangeSplice[T]): RangeSplice[Seq[T]] with {
override def splice(anchor: dom.Element, range: Range, value: Seq[T]) =
given many[A <: dom.Element, T](using other: RangeSplice[A, T]): RangeSplice[A, Seq[T]] with {
override def splice(anchor: A, range: Range, value: Seq[T]) =
value.reverseIterator.foreach(v => other.splice(anchor, range, v))
}
given string: RangeSplice[String] with {
given string: RangeSplice[dom.Element, String] with {
override def splice(anchor: dom.Element, range: Range, value: String) =
anchor.textContent = value
}

extension (anchor: dom.Element)
extension [A <: dom.Element](anchor: A)
def reattach[T](signal: Signal[T])(using
splicer: RangeSplice[T],
splicer: RangeSplice[A, T],
creationTicket: CreationTicket[Interface.State]
): anchor.type = {
val range = document.createRange()
range.selectNodeContents(anchor)
range.collapse(toStart = false)
Observe.strong(signal, true) {
tagObserver(anchor, signal) { v =>
if range.commonAncestorContainer != anchor then
range.selectNodeContents(anchor)
range.collapse(toStart = false)
range.deleteContents()
println(s"weird state $anchor; $range; ${range.commonAncestorContainer} ${range.startContainer}; ${range.endContainer}")
range.extractContents()
splicer.splice(anchor, range, v)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class RescalatagsTest extends RETests {

}

given RangeSplice[Modifier] with {
given RangeSplice[dom.Element, Modifier] with {
override def splice(anchor: dom.Element, range: dom.Range, value: Modifier): Unit =
val parent = range.commonAncestorContainer
parent match
Expand Down

0 comments on commit f91a7b4

Please sign in to comment.