diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala index 6812d90..c17d87d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala @@ -4,9 +4,9 @@ import works.iterative.ui.components.laminar.HtmlTabular import works.iterative.ui.components.laminar.tables.HtmlTableBuilderModule -trait ListPage[T: Tag: HtmlTabular] - extends ListPageModel[T] - with ListPageZIOHandler[T] +trait ListPage[T: Tag: HtmlTabular, Q: Tag] + extends ListPageModel[T, Q] + with ListPageZIOHandler[T, Q] with ListPageView[T] with ListPageComponent[T] with HtmlTableBuilderModule diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala index 6812d90..c17d87d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala @@ -4,9 +4,9 @@ import works.iterative.ui.components.laminar.HtmlTabular import works.iterative.ui.components.laminar.tables.HtmlTableBuilderModule -trait ListPage[T: Tag: HtmlTabular] - extends ListPageModel[T] - with ListPageZIOHandler[T] +trait ListPage[T: Tag: HtmlTabular, Q: Tag] + extends ListPageModel[T, Q] + with ListPageZIOHandler[T, Q] with ListPageView[T] with ListPageComponent[T] with HtmlTableBuilderModule 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 508fcaa..a458071 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 @@ -6,7 +6,7 @@ import works.iterative.ui.components.ComponentContext trait ListPageComponent[T]: - self: ListPageView[T] with ListPageModel[T] with HtmlTableBuilderModule => + self: ListPageView[T] with ListPageModel[T, ?] with HtmlTableBuilderModule => class Component(effectHandler: EffectHandler[Effect, Action])(using ComponentContext[?] diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala index 6812d90..c17d87d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala @@ -4,9 +4,9 @@ import works.iterative.ui.components.laminar.HtmlTabular import works.iterative.ui.components.laminar.tables.HtmlTableBuilderModule -trait ListPage[T: Tag: HtmlTabular] - extends ListPageModel[T] - with ListPageZIOHandler[T] +trait ListPage[T: Tag: HtmlTabular, Q: Tag] + extends ListPageModel[T, Q] + with ListPageZIOHandler[T, Q] with ListPageView[T] with ListPageComponent[T] with HtmlTableBuilderModule 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 508fcaa..a458071 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 @@ -6,7 +6,7 @@ import works.iterative.ui.components.ComponentContext trait ListPageComponent[T]: - self: ListPageView[T] with ListPageModel[T] with HtmlTableBuilderModule => + self: ListPageView[T] with ListPageModel[T, ?] with HtmlTableBuilderModule => class Component(effectHandler: EffectHandler[Effect, Action])(using ComponentContext[?] diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageHandler.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageHandler.scala index 028e2cd..aad4e78 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageHandler.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageHandler.scala @@ -3,14 +3,16 @@ import zio.* import works.iterative.core.UserMessage -trait ListPageHandler[T]: - def loadItems(): UIO[List[T]] +trait ListPageHandler[T, Q]: + def loadItems(query: Q): UIO[List[T]] def reportError(message: UserMessage): UIO[Unit] object ListPageHandler: - def loadItems[T: Tag](): URIO[ListPageHandler[T], List[T]] = - ZIO.serviceWithZIO(_.loadItems()) - def reportError[T: Tag]( + def loadItems[T: Tag, Q: Tag]( + query: Q + ): URIO[ListPageHandler[T, Q], List[T]] = + ZIO.serviceWithZIO(_.loadItems(query)) + def reportError[T: Tag, Q: Tag]( message: UserMessage - ): URIO[ListPageHandler[T], Unit] = + ): URIO[ListPageHandler[T, Q], Unit] = ZIO.serviceWithZIO(_.reportError(message)) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala index 6812d90..c17d87d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala @@ -4,9 +4,9 @@ import works.iterative.ui.components.laminar.HtmlTabular import works.iterative.ui.components.laminar.tables.HtmlTableBuilderModule -trait ListPage[T: Tag: HtmlTabular] - extends ListPageModel[T] - with ListPageZIOHandler[T] +trait ListPage[T: Tag: HtmlTabular, Q: Tag] + extends ListPageModel[T, Q] + with ListPageZIOHandler[T, Q] with ListPageView[T] with ListPageComponent[T] with HtmlTableBuilderModule 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 508fcaa..a458071 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 @@ -6,7 +6,7 @@ import works.iterative.ui.components.ComponentContext trait ListPageComponent[T]: - self: ListPageView[T] with ListPageModel[T] with HtmlTableBuilderModule => + self: ListPageView[T] with ListPageModel[T, ?] with HtmlTableBuilderModule => class Component(effectHandler: EffectHandler[Effect, Action])(using ComponentContext[?] diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageHandler.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageHandler.scala index 028e2cd..aad4e78 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageHandler.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageHandler.scala @@ -3,14 +3,16 @@ import zio.* import works.iterative.core.UserMessage -trait ListPageHandler[T]: - def loadItems(): UIO[List[T]] +trait ListPageHandler[T, Q]: + def loadItems(query: Q): UIO[List[T]] def reportError(message: UserMessage): UIO[Unit] object ListPageHandler: - def loadItems[T: Tag](): URIO[ListPageHandler[T], List[T]] = - ZIO.serviceWithZIO(_.loadItems()) - def reportError[T: Tag]( + def loadItems[T: Tag, Q: Tag]( + query: Q + ): URIO[ListPageHandler[T, Q], List[T]] = + ZIO.serviceWithZIO(_.loadItems(query)) + def reportError[T: Tag, Q: Tag]( message: UserMessage - ): URIO[ListPageHandler[T], Unit] = + ): URIO[ListPageHandler[T, Q], Unit] = ZIO.serviceWithZIO(_.reportError(message)) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageModel.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageModel.scala index dfaef8b..477e4b0 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageModel.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageModel.scala @@ -3,15 +3,18 @@ import works.iterative.core.UserMessage import works.iterative.ui.model.Computable -trait ListPageModel[T]: +trait ListPageModel[T, Q]: + + def emptyQuery: Q enum Action: + case SetFilter(query: Q) case SetItems(items: List[T]) case VisitDetail(item: T) case SetError(message: UserMessage) enum Effect: - case LoadItems + case LoadItems(query: Q) case ReportError(message: UserMessage) case VisitDetail(item: T) @@ -21,10 +24,11 @@ trait Module extends works.iterative.ui.Module[Model, Action, Effect]: override def init: (Model, Option[Effect]) = - Model() -> Some(Effect.LoadItems) + Model() -> Some(Effect.LoadItems(emptyQuery)) override def handle(action: Action, model: Model): (Model, Option[Effect]) = action match + case Action.SetFilter(q) => model -> Some(Effect.LoadItems(q)) case Action.SetItems(items) => model.copy(items = model.items.update(items)) -> None case Action.SetError(msg) => diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala index 6812d90..c17d87d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala @@ -4,9 +4,9 @@ import works.iterative.ui.components.laminar.HtmlTabular import works.iterative.ui.components.laminar.tables.HtmlTableBuilderModule -trait ListPage[T: Tag: HtmlTabular] - extends ListPageModel[T] - with ListPageZIOHandler[T] +trait ListPage[T: Tag: HtmlTabular, Q: Tag] + extends ListPageModel[T, Q] + with ListPageZIOHandler[T, Q] with ListPageView[T] with ListPageComponent[T] with HtmlTableBuilderModule 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 508fcaa..a458071 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 @@ -6,7 +6,7 @@ import works.iterative.ui.components.ComponentContext trait ListPageComponent[T]: - self: ListPageView[T] with ListPageModel[T] with HtmlTableBuilderModule => + self: ListPageView[T] with ListPageModel[T, ?] with HtmlTableBuilderModule => class Component(effectHandler: EffectHandler[Effect, Action])(using ComponentContext[?] diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageHandler.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageHandler.scala index 028e2cd..aad4e78 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageHandler.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageHandler.scala @@ -3,14 +3,16 @@ import zio.* import works.iterative.core.UserMessage -trait ListPageHandler[T]: - def loadItems(): UIO[List[T]] +trait ListPageHandler[T, Q]: + def loadItems(query: Q): UIO[List[T]] def reportError(message: UserMessage): UIO[Unit] object ListPageHandler: - def loadItems[T: Tag](): URIO[ListPageHandler[T], List[T]] = - ZIO.serviceWithZIO(_.loadItems()) - def reportError[T: Tag]( + def loadItems[T: Tag, Q: Tag]( + query: Q + ): URIO[ListPageHandler[T, Q], List[T]] = + ZIO.serviceWithZIO(_.loadItems(query)) + def reportError[T: Tag, Q: Tag]( message: UserMessage - ): URIO[ListPageHandler[T], Unit] = + ): URIO[ListPageHandler[T, Q], Unit] = ZIO.serviceWithZIO(_.reportError(message)) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageModel.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageModel.scala index dfaef8b..477e4b0 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageModel.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageModel.scala @@ -3,15 +3,18 @@ import works.iterative.core.UserMessage import works.iterative.ui.model.Computable -trait ListPageModel[T]: +trait ListPageModel[T, Q]: + + def emptyQuery: Q enum Action: + case SetFilter(query: Q) case SetItems(items: List[T]) case VisitDetail(item: T) case SetError(message: UserMessage) enum Effect: - case LoadItems + case LoadItems(query: Q) case ReportError(message: UserMessage) case VisitDetail(item: T) @@ -21,10 +24,11 @@ trait Module extends works.iterative.ui.Module[Model, Action, Effect]: override def init: (Model, Option[Effect]) = - Model() -> Some(Effect.LoadItems) + Model() -> Some(Effect.LoadItems(emptyQuery)) override def handle(action: Action, model: Model): (Model, Option[Effect]) = action match + case Action.SetFilter(q) => model -> Some(Effect.LoadItems(q)) case Action.SetItems(items) => model.copy(items = model.items.update(items)) -> None case Action.SetError(msg) => 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 1d003ef..b60fbe7 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 @@ -9,7 +9,7 @@ import works.iterative.ui.components.ComponentContext trait ListPageView[T: HtmlTabular]: - self: ListPageModel[T] with HtmlTableBuilderModule => + self: ListPageModel[T, ?] with HtmlTableBuilderModule => class View(model: Signal[Model], actions: Observer[Action])(using ComponentContext[?] diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala index 6812d90..c17d87d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPage.scala @@ -4,9 +4,9 @@ import works.iterative.ui.components.laminar.HtmlTabular import works.iterative.ui.components.laminar.tables.HtmlTableBuilderModule -trait ListPage[T: Tag: HtmlTabular] - extends ListPageModel[T] - with ListPageZIOHandler[T] +trait ListPage[T: Tag: HtmlTabular, Q: Tag] + extends ListPageModel[T, Q] + with ListPageZIOHandler[T, Q] with ListPageView[T] with ListPageComponent[T] with HtmlTableBuilderModule 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 508fcaa..a458071 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 @@ -6,7 +6,7 @@ import works.iterative.ui.components.ComponentContext trait ListPageComponent[T]: - self: ListPageView[T] with ListPageModel[T] with HtmlTableBuilderModule => + self: ListPageView[T] with ListPageModel[T, ?] with HtmlTableBuilderModule => class Component(effectHandler: EffectHandler[Effect, Action])(using ComponentContext[?] diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageHandler.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageHandler.scala index 028e2cd..aad4e78 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageHandler.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageHandler.scala @@ -3,14 +3,16 @@ import zio.* import works.iterative.core.UserMessage -trait ListPageHandler[T]: - def loadItems(): UIO[List[T]] +trait ListPageHandler[T, Q]: + def loadItems(query: Q): UIO[List[T]] def reportError(message: UserMessage): UIO[Unit] object ListPageHandler: - def loadItems[T: Tag](): URIO[ListPageHandler[T], List[T]] = - ZIO.serviceWithZIO(_.loadItems()) - def reportError[T: Tag]( + def loadItems[T: Tag, Q: Tag]( + query: Q + ): URIO[ListPageHandler[T, Q], List[T]] = + ZIO.serviceWithZIO(_.loadItems(query)) + def reportError[T: Tag, Q: Tag]( message: UserMessage - ): URIO[ListPageHandler[T], Unit] = + ): URIO[ListPageHandler[T, Q], Unit] = ZIO.serviceWithZIO(_.reportError(message)) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageModel.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageModel.scala index dfaef8b..477e4b0 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageModel.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageModel.scala @@ -3,15 +3,18 @@ import works.iterative.core.UserMessage import works.iterative.ui.model.Computable -trait ListPageModel[T]: +trait ListPageModel[T, Q]: + + def emptyQuery: Q enum Action: + case SetFilter(query: Q) case SetItems(items: List[T]) case VisitDetail(item: T) case SetError(message: UserMessage) enum Effect: - case LoadItems + case LoadItems(query: Q) case ReportError(message: UserMessage) case VisitDetail(item: T) @@ -21,10 +24,11 @@ trait Module extends works.iterative.ui.Module[Model, Action, Effect]: override def init: (Model, Option[Effect]) = - Model() -> Some(Effect.LoadItems) + Model() -> Some(Effect.LoadItems(emptyQuery)) override def handle(action: Action, model: Model): (Model, Option[Effect]) = action match + case Action.SetFilter(q) => model -> Some(Effect.LoadItems(q)) case Action.SetItems(items) => model.copy(items = model.items.update(items)) -> None case Action.SetError(msg) => 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 1d003ef..b60fbe7 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 @@ -9,7 +9,7 @@ import works.iterative.ui.components.ComponentContext trait ListPageView[T: HtmlTabular]: - self: ListPageModel[T] with HtmlTableBuilderModule => + self: ListPageModel[T, ?] with HtmlTableBuilderModule => class View(model: Signal[Model], actions: Observer[Action])(using ComponentContext[?] diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageZIOHandler.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageZIOHandler.scala index 34209a3..e68c1ff 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageZIOHandler.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/modules/listpage/ListPageZIOHandler.scala @@ -4,16 +4,18 @@ import works.iterative.ui.ZIOEffectHandler import zio.stream.ZStream -trait ListPageZIOHandler[T: Tag]: - self: ListPageModel[T] => +trait ListPageZIOHandler[T: Tag, Q: Tag]: + self: ListPageModel[T, Q] => - class Handler(itemsHandler: ListPageHandler[T], onVisitDetail: T => UIO[Unit]) - extends ZIOEffectHandler[Any, Effect, Action]: + class Handler( + itemsHandler: ListPageHandler[T, Q], + onVisitDetail: T => UIO[Unit] + ) extends ZIOEffectHandler[Any, Effect, Action]: override def handle(e: Effect): ZStream[Any, Throwable, Action] = e match - case Effect.LoadItems => + case Effect.LoadItems(q) => fromZIO( - itemsHandler.loadItems().map(Action.SetItems(_)) + itemsHandler.loadItems(q).map(Action.SetItems(_)) ) case Effect.ReportError(msg) => fromZIOUnit(itemsHandler.reportError(msg)) @@ -21,4 +23,4 @@ fromZIOUnit(onVisitDetail(item)) object ListPageZIOHandler: - type Env[T] = ListPageHandler[T] + type Env[T, Q] = ListPageHandler[T, Q]