2025-09-12 17:35:11 +02:00
|
|
|
import ListLiveView.*
|
|
|
|
|
import monocle.syntax.all.*
|
|
|
|
|
import scalive.*
|
|
|
|
|
import zio.*
|
|
|
|
|
import zio.json.*
|
|
|
|
|
import zio.stream.ZStream
|
|
|
|
|
|
|
|
|
|
class ListLiveView(someParam: String) extends LiveView[Msg, Model]:
|
|
|
|
|
|
|
|
|
|
def init = ZIO.succeed(
|
|
|
|
|
Model(
|
|
|
|
|
elems = List(
|
|
|
|
|
NestedModel("a", 10),
|
|
|
|
|
NestedModel("b", 15),
|
|
|
|
|
NestedModel("c", 20)
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def update(model: Model) =
|
|
|
|
|
case Msg.IncAge(value) =>
|
|
|
|
|
ZIO.succeed(model.focus(_.elems.index(2).age).modify(_ + value))
|
|
|
|
|
|
|
|
|
|
def view(model: Dyn[Model]) =
|
|
|
|
|
div(
|
2025-09-17 02:29:38 +02:00
|
|
|
cls := "mx-auto card bg-base-100 max-w-2xl shadow-xl space-y-6",
|
|
|
|
|
div(
|
|
|
|
|
cls := "card-body",
|
|
|
|
|
h1(cls := "card-title", someParam),
|
|
|
|
|
ul(
|
|
|
|
|
cls := "divide-y divide-base-200",
|
|
|
|
|
model(_.elems).splitByIndex((_, elem) =>
|
|
|
|
|
li(
|
|
|
|
|
cls := "py-3 flex flex-wrap items-center justify-between gap-2",
|
|
|
|
|
span(
|
|
|
|
|
cls := "text-base-content",
|
|
|
|
|
"Nom: ",
|
|
|
|
|
span(cls := "font-semibold", elem(_.name))
|
|
|
|
|
),
|
|
|
|
|
span(
|
|
|
|
|
cls := "text-sm opacity-70",
|
|
|
|
|
"Age: ",
|
|
|
|
|
span(cls := "font-bold", elem(_.age.toString))
|
|
|
|
|
)
|
2025-09-12 17:35:11 +02:00
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
),
|
2025-09-17 02:29:38 +02:00
|
|
|
div(
|
|
|
|
|
cls := "card-actions",
|
|
|
|
|
button(
|
|
|
|
|
cls := "btn btn-default",
|
|
|
|
|
phx.click := Msg.IncAge(1),
|
|
|
|
|
"Inc age"
|
|
|
|
|
),
|
|
|
|
|
span(cls := "grow"),
|
|
|
|
|
button(
|
|
|
|
|
cls := "btn btn-neutral",
|
2025-09-18 01:27:38 +02:00
|
|
|
phx.click := JS.toggleClass("btn-neutral btn-accent").push(Msg.IncAge(-5)),
|
2025-09-17 02:29:38 +02:00
|
|
|
"Toggle color"
|
|
|
|
|
)
|
2025-09-16 03:16:50 +02:00
|
|
|
)
|
2025-09-12 17:35:11 +02:00
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def subscriptions(model: Model) = ZStream.empty
|
|
|
|
|
|
|
|
|
|
end ListLiveView
|
|
|
|
|
|
|
|
|
|
object ListLiveView:
|
|
|
|
|
|
|
|
|
|
enum Msg derives JsonCodec:
|
|
|
|
|
case IncAge(value: Int)
|
|
|
|
|
|
|
|
|
|
final case class Model(
|
|
|
|
|
elems: List[NestedModel])
|
|
|
|
|
final case class NestedModel(name: String, age: Int)
|