diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala index 7e2b259..f79dfd8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala @@ -7,18 +7,31 @@ import com.raquo.laminar.nodes.ReactiveHtmlElement import com.raquo.laminar.nodes.CommentNode import org.scalajs.dom +import works.iterative.ui.components.ComponentContext +import works.iterative.core.UserMessage +import LaminarExtensions.* class ComputableComponent[Ref <: dom.html.Element]( as: HtmlTag[Ref], mods: Mod[ReactiveHtmlElement[Ref]]* )( c: Signal[Computable[HtmlElement]] -): +)(using ComponentContext[?]): val element: ReactiveHtmlElement[Ref] = as( mods, child <-- c.map { - case Uninitialized => CommentNode("Uninitialized") - case Computing(_) => CommentNode("Computing") + case Uninitialized => CommentNode("Uninitialized") + case Computing(_) => + div( + cls("text-center"), + h3( + cls("mt-2 text-sm font-semibold text-gray-900"), + UserMessage("loading").asElement + ), + UserMessage("loading.description").asOptionalElement.map(dm => + p(cls("mt-1 text-sm text-gray-500"), dm) + ) + ) case Ready(element) => element case Failed(_) => CommentNode("Failed") case Recomputing(_, element) => element diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala index 7e2b259..f79dfd8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala @@ -7,18 +7,31 @@ import com.raquo.laminar.nodes.ReactiveHtmlElement import com.raquo.laminar.nodes.CommentNode import org.scalajs.dom +import works.iterative.ui.components.ComponentContext +import works.iterative.core.UserMessage +import LaminarExtensions.* class ComputableComponent[Ref <: dom.html.Element]( as: HtmlTag[Ref], mods: Mod[ReactiveHtmlElement[Ref]]* )( c: Signal[Computable[HtmlElement]] -): +)(using ComponentContext[?]): val element: ReactiveHtmlElement[Ref] = as( mods, child <-- c.map { - case Uninitialized => CommentNode("Uninitialized") - case Computing(_) => CommentNode("Computing") + case Uninitialized => CommentNode("Uninitialized") + case Computing(_) => + div( + cls("text-center"), + h3( + cls("mt-2 text-sm font-semibold text-gray-900"), + UserMessage("loading").asElement + ), + UserMessage("loading.description").asOptionalElement.map(dm => + p(cls("mt-1 text-sm text-gray-500"), dm) + ) + ) case Ready(element) => element case Failed(_) => CommentNode("Failed") case Recomputing(_, element) => element diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageComponent.scala index 9f4514f..6fe35f3 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageComponent.scala @@ -5,12 +5,14 @@ import works.iterative.ui.components.laminar.LaminarComponent import works.iterative.ui.components.laminar.forms.FormBuilderModule import works.iterative.ui.components.laminar.forms.FormBuilderContext +import works.iterative.ui.components.ComponentContext trait FormPageComponent[T]: self: FormPageModel[T] with FormPageView[T] with FormBuilderModule => class Component(effectHandler: EffectHandler[Effect, Action])(using - fctx: FormBuilderContext + fctx: FormBuilderContext, + cctx: ComponentContext[?] ) extends LaminarComponent[Model, Action, Effect, HtmlElement](effectHandler) with Module: override def render( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala index 7e2b259..f79dfd8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala @@ -7,18 +7,31 @@ import com.raquo.laminar.nodes.ReactiveHtmlElement import com.raquo.laminar.nodes.CommentNode import org.scalajs.dom +import works.iterative.ui.components.ComponentContext +import works.iterative.core.UserMessage +import LaminarExtensions.* class ComputableComponent[Ref <: dom.html.Element]( as: HtmlTag[Ref], mods: Mod[ReactiveHtmlElement[Ref]]* )( c: Signal[Computable[HtmlElement]] -): +)(using ComponentContext[?]): val element: ReactiveHtmlElement[Ref] = as( mods, child <-- c.map { - case Uninitialized => CommentNode("Uninitialized") - case Computing(_) => CommentNode("Computing") + case Uninitialized => CommentNode("Uninitialized") + case Computing(_) => + div( + cls("text-center"), + h3( + cls("mt-2 text-sm font-semibold text-gray-900"), + UserMessage("loading").asElement + ), + UserMessage("loading.description").asOptionalElement.map(dm => + p(cls("mt-1 text-sm text-gray-500"), dm) + ) + ) case Ready(element) => element case Failed(_) => CommentNode("Failed") case Recomputing(_, element) => element diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageComponent.scala index 9f4514f..6fe35f3 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageComponent.scala @@ -5,12 +5,14 @@ import works.iterative.ui.components.laminar.LaminarComponent import works.iterative.ui.components.laminar.forms.FormBuilderModule import works.iterative.ui.components.laminar.forms.FormBuilderContext +import works.iterative.ui.components.ComponentContext trait FormPageComponent[T]: self: FormPageModel[T] with FormPageView[T] with FormBuilderModule => class Component(effectHandler: EffectHandler[Effect, Action])(using - fctx: FormBuilderContext + fctx: FormBuilderContext, + cctx: ComponentContext[?] ) extends LaminarComponent[Model, Action, Effect, HtmlElement](effectHandler) with Module: override def render( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageView.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageView.scala index 4e97b73..63d6ab8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageView.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageView.scala @@ -5,13 +5,15 @@ import works.iterative.ui.components.laminar.forms.FormBuilderModule import works.iterative.ui.components.laminar.forms.Form import works.iterative.ui.components.laminar.ComputableComponent +import works.iterative.ui.components.ComponentContext import works.iterative.ui.components.laminar.forms.FormBuilderContext trait FormPageView[T: Form]: self: FormPageModel[T] with FormBuilderModule => class View(model: Signal[Model], actions: Observer[Action])(using - fctx: FormBuilderContext + fctx: FormBuilderContext, + cctx: ComponentContext[?] ): val element: HtmlElement = diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala index 7e2b259..f79dfd8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala @@ -7,18 +7,31 @@ import com.raquo.laminar.nodes.ReactiveHtmlElement import com.raquo.laminar.nodes.CommentNode import org.scalajs.dom +import works.iterative.ui.components.ComponentContext +import works.iterative.core.UserMessage +import LaminarExtensions.* class ComputableComponent[Ref <: dom.html.Element]( as: HtmlTag[Ref], mods: Mod[ReactiveHtmlElement[Ref]]* )( c: Signal[Computable[HtmlElement]] -): +)(using ComponentContext[?]): val element: ReactiveHtmlElement[Ref] = as( mods, child <-- c.map { - case Uninitialized => CommentNode("Uninitialized") - case Computing(_) => CommentNode("Computing") + case Uninitialized => CommentNode("Uninitialized") + case Computing(_) => + div( + cls("text-center"), + h3( + cls("mt-2 text-sm font-semibold text-gray-900"), + UserMessage("loading").asElement + ), + UserMessage("loading.description").asOptionalElement.map(dm => + p(cls("mt-1 text-sm text-gray-500"), dm) + ) + ) case Ready(element) => element case Failed(_) => CommentNode("Failed") case Recomputing(_, element) => element diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageComponent.scala index 9f4514f..6fe35f3 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageComponent.scala @@ -5,12 +5,14 @@ import works.iterative.ui.components.laminar.LaminarComponent import works.iterative.ui.components.laminar.forms.FormBuilderModule import works.iterative.ui.components.laminar.forms.FormBuilderContext +import works.iterative.ui.components.ComponentContext trait FormPageComponent[T]: self: FormPageModel[T] with FormPageView[T] with FormBuilderModule => class Component(effectHandler: EffectHandler[Effect, Action])(using - fctx: FormBuilderContext + fctx: FormBuilderContext, + cctx: ComponentContext[?] ) extends LaminarComponent[Model, Action, Effect, HtmlElement](effectHandler) with Module: override def render( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageView.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageView.scala index 4e97b73..63d6ab8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageView.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageView.scala @@ -5,13 +5,15 @@ import works.iterative.ui.components.laminar.forms.FormBuilderModule import works.iterative.ui.components.laminar.forms.Form import works.iterative.ui.components.laminar.ComputableComponent +import works.iterative.ui.components.ComponentContext import works.iterative.ui.components.laminar.forms.FormBuilderContext trait FormPageView[T: Form]: self: FormPageModel[T] with FormBuilderModule => class View(model: Signal[Model], actions: Observer[Action])(using - fctx: FormBuilderContext + fctx: FormBuilderContext, + cctx: ComponentContext[?] ): val element: HtmlElement = diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageComponent.scala index d9ed2aa..508fcaa 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageComponent.scala @@ -3,12 +3,14 @@ import com.raquo.laminar.api.L.* import works.iterative.ui.components.laminar.{EffectHandler, LaminarComponent} import works.iterative.ui.components.laminar.tables.HtmlTableBuilderModule +import works.iterative.ui.components.ComponentContext trait ListPageComponent[T]: self: ListPageView[T] with ListPageModel[T] with HtmlTableBuilderModule => - class Component(effectHandler: EffectHandler[Effect, Action]) - extends LaminarComponent[Model, Action, Effect, HtmlElement]( + class Component(effectHandler: EffectHandler[Effect, Action])(using + ComponentContext[?] + ) extends LaminarComponent[Model, Action, Effect, HtmlElement]( effectHandler ) with Module: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala index 7e2b259..f79dfd8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ComputableComponent.scala @@ -7,18 +7,31 @@ import com.raquo.laminar.nodes.ReactiveHtmlElement import com.raquo.laminar.nodes.CommentNode import org.scalajs.dom +import works.iterative.ui.components.ComponentContext +import works.iterative.core.UserMessage +import LaminarExtensions.* class ComputableComponent[Ref <: dom.html.Element]( as: HtmlTag[Ref], mods: Mod[ReactiveHtmlElement[Ref]]* )( c: Signal[Computable[HtmlElement]] -): +)(using ComponentContext[?]): val element: ReactiveHtmlElement[Ref] = as( mods, child <-- c.map { - case Uninitialized => CommentNode("Uninitialized") - case Computing(_) => CommentNode("Computing") + case Uninitialized => CommentNode("Uninitialized") + case Computing(_) => + div( + cls("text-center"), + h3( + cls("mt-2 text-sm font-semibold text-gray-900"), + UserMessage("loading").asElement + ), + UserMessage("loading.description").asOptionalElement.map(dm => + p(cls("mt-1 text-sm text-gray-500"), dm) + ) + ) case Ready(element) => element case Failed(_) => CommentNode("Failed") case Recomputing(_, element) => element diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageComponent.scala index 9f4514f..6fe35f3 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageComponent.scala @@ -5,12 +5,14 @@ import works.iterative.ui.components.laminar.LaminarComponent import works.iterative.ui.components.laminar.forms.FormBuilderModule import works.iterative.ui.components.laminar.forms.FormBuilderContext +import works.iterative.ui.components.ComponentContext trait FormPageComponent[T]: self: FormPageModel[T] with FormPageView[T] with FormBuilderModule => class Component(effectHandler: EffectHandler[Effect, Action])(using - fctx: FormBuilderContext + fctx: FormBuilderContext, + cctx: ComponentContext[?] ) extends LaminarComponent[Model, Action, Effect, HtmlElement](effectHandler) with Module: override def render( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageView.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageView.scala index 4e97b73..63d6ab8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageView.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/formpage/FormPageView.scala @@ -5,13 +5,15 @@ import works.iterative.ui.components.laminar.forms.FormBuilderModule import works.iterative.ui.components.laminar.forms.Form import works.iterative.ui.components.laminar.ComputableComponent +import works.iterative.ui.components.ComponentContext import works.iterative.ui.components.laminar.forms.FormBuilderContext trait FormPageView[T: Form]: self: FormPageModel[T] with FormBuilderModule => class View(model: Signal[Model], actions: Observer[Action])(using - fctx: FormBuilderContext + fctx: FormBuilderContext, + cctx: ComponentContext[?] ): val element: HtmlElement = diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageComponent.scala index d9ed2aa..508fcaa 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageComponent.scala @@ -3,12 +3,14 @@ import com.raquo.laminar.api.L.* import works.iterative.ui.components.laminar.{EffectHandler, LaminarComponent} import works.iterative.ui.components.laminar.tables.HtmlTableBuilderModule +import works.iterative.ui.components.ComponentContext trait ListPageComponent[T]: self: ListPageView[T] with ListPageModel[T] with HtmlTableBuilderModule => - class Component(effectHandler: EffectHandler[Effect, Action]) - extends LaminarComponent[Model, Action, Effect, HtmlElement]( + class Component(effectHandler: EffectHandler[Effect, Action])(using + ComponentContext[?] + ) extends LaminarComponent[Model, Action, Effect, HtmlElement]( effectHandler ) with Module: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageView.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageView.scala index 49641da..1d003ef 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageView.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageView.scala @@ -6,11 +6,14 @@ import works.iterative.ui.components.laminar.HtmlTabular import io.laminext.syntax.core.* import works.iterative.ui.components.laminar.tables.HtmlTableBuilderModule +import works.iterative.ui.components.ComponentContext trait ListPageView[T: HtmlTabular]: self: ListPageModel[T] with HtmlTableBuilderModule => - class View(model: Signal[Model], actions: Observer[Action]): + class View(model: Signal[Model], actions: Observer[Action])(using + ComponentContext[?] + ): val element: HtmlElement = ComputableComponent(div)(