diff --git a/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala b/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala new file mode 100644 index 0000000..711ec85 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala @@ -0,0 +1,4 @@ +package works.iterative.core + +trait HasUserMessage: + def userMessage: UserMessage diff --git a/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala b/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala new file mode 100644 index 0000000..711ec85 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala @@ -0,0 +1,4 @@ +package works.iterative.core + +trait HasUserMessage: + def userMessage: UserMessage diff --git a/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala b/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala index 1a04dae..6a5c831 100644 --- a/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala +++ b/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala @@ -2,13 +2,40 @@ import zio.* +opaque type PermissionOp = String +object PermissionOp: + def apply(op: String): PermissionOp = op + + extension (op: PermissionOp) def value: String = op + +opaque type PermissionTarget = String +object PermissionTarget: + def apply(namespace: String, id: String): PermissionTarget = + require( + namespace.trim.nonEmpty && id.trim.nonEmpty, + "Both namespece and id must be defined" + ) + require( + namespace.indexOf(':') == -1 && id.indexOf(':') == -1, + "Neither namespace nor id can contain ':'" + ) + s"$namespace:$id" + + extension (target: PermissionTarget) + def namespace: String = target.split(":", 2).head + def value: String = target.split(":", 2).last + trait PermissionService: - def isAllowed(subj: UserInfo, action: String, obj: String): UIO[Boolean] + def isAllowed( + subj: Option[UserInfo], + action: PermissionOp, + obj: PermissionTarget + ): UIO[Boolean] object PermissionService: def isAllowed( - subj: UserInfo, - action: String, - obj: String + subj: Option[UserInfo], + action: PermissionOp, + obj: PermissionTarget ): URIO[PermissionService, Boolean] = ZIO.serviceWithZIO(_.isAllowed(subj, action, obj)) diff --git a/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala b/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala new file mode 100644 index 0000000..711ec85 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala @@ -0,0 +1,4 @@ +package works.iterative.core + +trait HasUserMessage: + def userMessage: UserMessage diff --git a/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala b/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala index 1a04dae..6a5c831 100644 --- a/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala +++ b/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala @@ -2,13 +2,40 @@ import zio.* +opaque type PermissionOp = String +object PermissionOp: + def apply(op: String): PermissionOp = op + + extension (op: PermissionOp) def value: String = op + +opaque type PermissionTarget = String +object PermissionTarget: + def apply(namespace: String, id: String): PermissionTarget = + require( + namespace.trim.nonEmpty && id.trim.nonEmpty, + "Both namespece and id must be defined" + ) + require( + namespace.indexOf(':') == -1 && id.indexOf(':') == -1, + "Neither namespace nor id can contain ':'" + ) + s"$namespace:$id" + + extension (target: PermissionTarget) + def namespace: String = target.split(":", 2).head + def value: String = target.split(":", 2).last + trait PermissionService: - def isAllowed(subj: UserInfo, action: String, obj: String): UIO[Boolean] + def isAllowed( + subj: Option[UserInfo], + action: PermissionOp, + obj: PermissionTarget + ): UIO[Boolean] object PermissionService: def isAllowed( - subj: UserInfo, - action: String, - obj: String + subj: Option[UserInfo], + action: PermissionOp, + obj: PermissionTarget ): URIO[PermissionService, Boolean] = ZIO.serviceWithZIO(_.isAllowed(subj, action, obj)) diff --git a/core/shared/src/main/scala/works/iterative/core/service/Repository.scala b/core/shared/src/main/scala/works/iterative/core/service/Repository.scala new file mode 100644 index 0000000..dc7d292 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/service/Repository.scala @@ -0,0 +1,15 @@ +package works.iterative.core.service + +import zio.* + +trait ReadRepository[-Key, +Value]: + type Op[A] = UIO[A] + def find(id: Key): Op[Option[Value]] + +trait WriteRepository[-Key, -Value]: + type Op[A] = UIO[A] + def save(key: Key, value: Value): Op[Unit] + +trait Repository[-Key, Value] + extends ReadRepository[Key, Value] + with WriteRepository[Key, Value] diff --git a/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala b/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala new file mode 100644 index 0000000..711ec85 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala @@ -0,0 +1,4 @@ +package works.iterative.core + +trait HasUserMessage: + def userMessage: UserMessage diff --git a/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala b/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala index 1a04dae..6a5c831 100644 --- a/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala +++ b/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala @@ -2,13 +2,40 @@ import zio.* +opaque type PermissionOp = String +object PermissionOp: + def apply(op: String): PermissionOp = op + + extension (op: PermissionOp) def value: String = op + +opaque type PermissionTarget = String +object PermissionTarget: + def apply(namespace: String, id: String): PermissionTarget = + require( + namespace.trim.nonEmpty && id.trim.nonEmpty, + "Both namespece and id must be defined" + ) + require( + namespace.indexOf(':') == -1 && id.indexOf(':') == -1, + "Neither namespace nor id can contain ':'" + ) + s"$namespace:$id" + + extension (target: PermissionTarget) + def namespace: String = target.split(":", 2).head + def value: String = target.split(":", 2).last + trait PermissionService: - def isAllowed(subj: UserInfo, action: String, obj: String): UIO[Boolean] + def isAllowed( + subj: Option[UserInfo], + action: PermissionOp, + obj: PermissionTarget + ): UIO[Boolean] object PermissionService: def isAllowed( - subj: UserInfo, - action: String, - obj: String + subj: Option[UserInfo], + action: PermissionOp, + obj: PermissionTarget ): URIO[PermissionService, Boolean] = ZIO.serviceWithZIO(_.isAllowed(subj, action, obj)) diff --git a/core/shared/src/main/scala/works/iterative/core/service/Repository.scala b/core/shared/src/main/scala/works/iterative/core/service/Repository.scala new file mode 100644 index 0000000..dc7d292 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/service/Repository.scala @@ -0,0 +1,15 @@ +package works.iterative.core.service + +import zio.* + +trait ReadRepository[-Key, +Value]: + type Op[A] = UIO[A] + def find(id: Key): Op[Option[Value]] + +trait WriteRepository[-Key, -Value]: + type Op[A] = UIO[A] + def save(key: Key, value: Value): Op[Unit] + +trait Repository[-Key, Value] + extends ReadRepository[Key, Value] + with WriteRepository[Key, Value] diff --git a/core/shared/src/main/scala/works/iterative/core/service/impl/InMemoryRepository.scala b/core/shared/src/main/scala/works/iterative/core/service/impl/InMemoryRepository.scala new file mode 100644 index 0000000..3c83b59 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/service/impl/InMemoryRepository.scala @@ -0,0 +1,11 @@ +package works.iterative.core.service +package impl + +import zio.* + +trait InMemoryRepository[Key, Value](data: Ref[Map[Key, Value]]) + extends Repository[Key, Value]: + override def save(key: Key, value: Value): UIO[Unit] = + data.update(_ + (key -> value)) + override def find(key: Key): UIO[Option[Value]] = + data.get.map(_.get(key)) diff --git a/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala b/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala new file mode 100644 index 0000000..711ec85 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala @@ -0,0 +1,4 @@ +package works.iterative.core + +trait HasUserMessage: + def userMessage: UserMessage diff --git a/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala b/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala index 1a04dae..6a5c831 100644 --- a/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala +++ b/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala @@ -2,13 +2,40 @@ import zio.* +opaque type PermissionOp = String +object PermissionOp: + def apply(op: String): PermissionOp = op + + extension (op: PermissionOp) def value: String = op + +opaque type PermissionTarget = String +object PermissionTarget: + def apply(namespace: String, id: String): PermissionTarget = + require( + namespace.trim.nonEmpty && id.trim.nonEmpty, + "Both namespece and id must be defined" + ) + require( + namespace.indexOf(':') == -1 && id.indexOf(':') == -1, + "Neither namespace nor id can contain ':'" + ) + s"$namespace:$id" + + extension (target: PermissionTarget) + def namespace: String = target.split(":", 2).head + def value: String = target.split(":", 2).last + trait PermissionService: - def isAllowed(subj: UserInfo, action: String, obj: String): UIO[Boolean] + def isAllowed( + subj: Option[UserInfo], + action: PermissionOp, + obj: PermissionTarget + ): UIO[Boolean] object PermissionService: def isAllowed( - subj: UserInfo, - action: String, - obj: String + subj: Option[UserInfo], + action: PermissionOp, + obj: PermissionTarget ): URIO[PermissionService, Boolean] = ZIO.serviceWithZIO(_.isAllowed(subj, action, obj)) diff --git a/core/shared/src/main/scala/works/iterative/core/service/Repository.scala b/core/shared/src/main/scala/works/iterative/core/service/Repository.scala new file mode 100644 index 0000000..dc7d292 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/service/Repository.scala @@ -0,0 +1,15 @@ +package works.iterative.core.service + +import zio.* + +trait ReadRepository[-Key, +Value]: + type Op[A] = UIO[A] + def find(id: Key): Op[Option[Value]] + +trait WriteRepository[-Key, -Value]: + type Op[A] = UIO[A] + def save(key: Key, value: Value): Op[Unit] + +trait Repository[-Key, Value] + extends ReadRepository[Key, Value] + with WriteRepository[Key, Value] diff --git a/core/shared/src/main/scala/works/iterative/core/service/impl/InMemoryRepository.scala b/core/shared/src/main/scala/works/iterative/core/service/impl/InMemoryRepository.scala new file mode 100644 index 0000000..3c83b59 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/service/impl/InMemoryRepository.scala @@ -0,0 +1,11 @@ +package works.iterative.core.service +package impl + +import zio.* + +trait InMemoryRepository[Key, Value](data: Ref[Map[Key, Value]]) + extends Repository[Key, Value]: + override def save(key: Key, value: Value): UIO[Unit] = + data.update(_ + (key -> value)) + override def find(key: Key): UIO[Option[Value]] = + data.get.map(_.get(key)) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarExtensions.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarExtensions.scala index 6fd20f7..4982296 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarExtensions.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarExtensions.scala @@ -51,12 +51,14 @@ ): EventStream[O] = var fiberRuntime: Fiber.Runtime[E, O] = null EventStream.fromCustomSource( + shouldStart = _ == 1, start = (fireValue, fireError, getStartIndex, getIsStarted) => Unsafe.unsafe { implicit unsafe => fiberRuntime = runtime.unsafe.fork(effect) fiberRuntime.unsafe.addObserver(exit => exit.foldExit(cause => fireError(cause.squash), fireValue) ) + fiberRuntime = null }, stop = _ => if fiberRuntime != null then @@ -72,6 +74,7 @@ ): EventStream[O] = var fiberRuntime: Fiber.Runtime[E, O] = null EventStream.fromCustomSource( + shouldStart = _ == 1, start = (fireValue, fireError, getStartIndex, getIsStarted) => Unsafe.unsafe { implicit unsafe => fiberRuntime = runtime.unsafe.fork(effect) @@ -81,6 +84,7 @@ fireValue ) ) + fiberRuntime = null }, stop = _ => if fiberRuntime != null then diff --git a/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala b/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala new file mode 100644 index 0000000..711ec85 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala @@ -0,0 +1,4 @@ +package works.iterative.core + +trait HasUserMessage: + def userMessage: UserMessage diff --git a/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala b/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala index 1a04dae..6a5c831 100644 --- a/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala +++ b/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala @@ -2,13 +2,40 @@ import zio.* +opaque type PermissionOp = String +object PermissionOp: + def apply(op: String): PermissionOp = op + + extension (op: PermissionOp) def value: String = op + +opaque type PermissionTarget = String +object PermissionTarget: + def apply(namespace: String, id: String): PermissionTarget = + require( + namespace.trim.nonEmpty && id.trim.nonEmpty, + "Both namespece and id must be defined" + ) + require( + namespace.indexOf(':') == -1 && id.indexOf(':') == -1, + "Neither namespace nor id can contain ':'" + ) + s"$namespace:$id" + + extension (target: PermissionTarget) + def namespace: String = target.split(":", 2).head + def value: String = target.split(":", 2).last + trait PermissionService: - def isAllowed(subj: UserInfo, action: String, obj: String): UIO[Boolean] + def isAllowed( + subj: Option[UserInfo], + action: PermissionOp, + obj: PermissionTarget + ): UIO[Boolean] object PermissionService: def isAllowed( - subj: UserInfo, - action: String, - obj: String + subj: Option[UserInfo], + action: PermissionOp, + obj: PermissionTarget ): URIO[PermissionService, Boolean] = ZIO.serviceWithZIO(_.isAllowed(subj, action, obj)) diff --git a/core/shared/src/main/scala/works/iterative/core/service/Repository.scala b/core/shared/src/main/scala/works/iterative/core/service/Repository.scala new file mode 100644 index 0000000..dc7d292 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/service/Repository.scala @@ -0,0 +1,15 @@ +package works.iterative.core.service + +import zio.* + +trait ReadRepository[-Key, +Value]: + type Op[A] = UIO[A] + def find(id: Key): Op[Option[Value]] + +trait WriteRepository[-Key, -Value]: + type Op[A] = UIO[A] + def save(key: Key, value: Value): Op[Unit] + +trait Repository[-Key, Value] + extends ReadRepository[Key, Value] + with WriteRepository[Key, Value] diff --git a/core/shared/src/main/scala/works/iterative/core/service/impl/InMemoryRepository.scala b/core/shared/src/main/scala/works/iterative/core/service/impl/InMemoryRepository.scala new file mode 100644 index 0000000..3c83b59 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/service/impl/InMemoryRepository.scala @@ -0,0 +1,11 @@ +package works.iterative.core.service +package impl + +import zio.* + +trait InMemoryRepository[Key, Value](data: Ref[Map[Key, Value]]) + extends Repository[Key, Value]: + override def save(key: Key, value: Value): UIO[Unit] = + data.update(_ + (key -> value)) + override def find(key: Key): UIO[Option[Value]] = + data.get.map(_.get(key)) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarExtensions.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarExtensions.scala index 6fd20f7..4982296 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarExtensions.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarExtensions.scala @@ -51,12 +51,14 @@ ): EventStream[O] = var fiberRuntime: Fiber.Runtime[E, O] = null EventStream.fromCustomSource( + shouldStart = _ == 1, start = (fireValue, fireError, getStartIndex, getIsStarted) => Unsafe.unsafe { implicit unsafe => fiberRuntime = runtime.unsafe.fork(effect) fiberRuntime.unsafe.addObserver(exit => exit.foldExit(cause => fireError(cause.squash), fireValue) ) + fiberRuntime = null }, stop = _ => if fiberRuntime != null then @@ -72,6 +74,7 @@ ): EventStream[O] = var fiberRuntime: Fiber.Runtime[E, O] = null EventStream.fromCustomSource( + shouldStart = _ == 1, start = (fireValue, fireError, getStartIndex, getIsStarted) => Unsafe.unsafe { implicit unsafe => fiberRuntime = runtime.unsafe.fork(effect) @@ -81,6 +84,7 @@ fireValue ) ) + fiberRuntime = null }, stop = _ => if fiberRuntime != null then diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/forms/FieldBuilder.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/forms/FieldBuilder.scala index 8c2de27..d331978 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/forms/FieldBuilder.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/forms/FieldBuilder.scala @@ -237,8 +237,6 @@ override val validated: Signal[Validated[A]] = rawValue.signal - .debugWithName("raw choice value") - .debugLog() .map(_.flatMap(i => options.find(_.id == i).map(_.value))) .map(validation) diff --git a/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala b/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala new file mode 100644 index 0000000..711ec85 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/HasUserMessage.scala @@ -0,0 +1,4 @@ +package works.iterative.core + +trait HasUserMessage: + def userMessage: UserMessage diff --git a/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala b/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala index 1a04dae..6a5c831 100644 --- a/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala +++ b/core/shared/src/main/scala/works/iterative/core/auth/PermissionService.scala @@ -2,13 +2,40 @@ import zio.* +opaque type PermissionOp = String +object PermissionOp: + def apply(op: String): PermissionOp = op + + extension (op: PermissionOp) def value: String = op + +opaque type PermissionTarget = String +object PermissionTarget: + def apply(namespace: String, id: String): PermissionTarget = + require( + namespace.trim.nonEmpty && id.trim.nonEmpty, + "Both namespece and id must be defined" + ) + require( + namespace.indexOf(':') == -1 && id.indexOf(':') == -1, + "Neither namespace nor id can contain ':'" + ) + s"$namespace:$id" + + extension (target: PermissionTarget) + def namespace: String = target.split(":", 2).head + def value: String = target.split(":", 2).last + trait PermissionService: - def isAllowed(subj: UserInfo, action: String, obj: String): UIO[Boolean] + def isAllowed( + subj: Option[UserInfo], + action: PermissionOp, + obj: PermissionTarget + ): UIO[Boolean] object PermissionService: def isAllowed( - subj: UserInfo, - action: String, - obj: String + subj: Option[UserInfo], + action: PermissionOp, + obj: PermissionTarget ): URIO[PermissionService, Boolean] = ZIO.serviceWithZIO(_.isAllowed(subj, action, obj)) diff --git a/core/shared/src/main/scala/works/iterative/core/service/Repository.scala b/core/shared/src/main/scala/works/iterative/core/service/Repository.scala new file mode 100644 index 0000000..dc7d292 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/service/Repository.scala @@ -0,0 +1,15 @@ +package works.iterative.core.service + +import zio.* + +trait ReadRepository[-Key, +Value]: + type Op[A] = UIO[A] + def find(id: Key): Op[Option[Value]] + +trait WriteRepository[-Key, -Value]: + type Op[A] = UIO[A] + def save(key: Key, value: Value): Op[Unit] + +trait Repository[-Key, Value] + extends ReadRepository[Key, Value] + with WriteRepository[Key, Value] diff --git a/core/shared/src/main/scala/works/iterative/core/service/impl/InMemoryRepository.scala b/core/shared/src/main/scala/works/iterative/core/service/impl/InMemoryRepository.scala new file mode 100644 index 0000000..3c83b59 --- /dev/null +++ b/core/shared/src/main/scala/works/iterative/core/service/impl/InMemoryRepository.scala @@ -0,0 +1,11 @@ +package works.iterative.core.service +package impl + +import zio.* + +trait InMemoryRepository[Key, Value](data: Ref[Map[Key, Value]]) + extends Repository[Key, Value]: + override def save(key: Key, value: Value): UIO[Unit] = + data.update(_ + (key -> value)) + override def find(key: Key): UIO[Option[Value]] = + data.get.map(_.get(key)) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarExtensions.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarExtensions.scala index 6fd20f7..4982296 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarExtensions.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarExtensions.scala @@ -51,12 +51,14 @@ ): EventStream[O] = var fiberRuntime: Fiber.Runtime[E, O] = null EventStream.fromCustomSource( + shouldStart = _ == 1, start = (fireValue, fireError, getStartIndex, getIsStarted) => Unsafe.unsafe { implicit unsafe => fiberRuntime = runtime.unsafe.fork(effect) fiberRuntime.unsafe.addObserver(exit => exit.foldExit(cause => fireError(cause.squash), fireValue) ) + fiberRuntime = null }, stop = _ => if fiberRuntime != null then @@ -72,6 +74,7 @@ ): EventStream[O] = var fiberRuntime: Fiber.Runtime[E, O] = null EventStream.fromCustomSource( + shouldStart = _ == 1, start = (fireValue, fireError, getStartIndex, getIsStarted) => Unsafe.unsafe { implicit unsafe => fiberRuntime = runtime.unsafe.fork(effect) @@ -81,6 +84,7 @@ fireValue ) ) + fiberRuntime = null }, stop = _ => if fiberRuntime != null then diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/forms/FieldBuilder.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/forms/FieldBuilder.scala index 8c2de27..d331978 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/forms/FieldBuilder.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/forms/FieldBuilder.scala @@ -237,8 +237,6 @@ override val validated: Signal[Validated[A]] = rawValue.signal - .debugWithName("raw choice value") - .debugLog() .map(_.flatMap(i => options.find(_.id == i).map(_.value))) .map(validation) diff --git a/ui/shared/src/main/scala/works/iterative/ui/model/Computable.scala b/ui/shared/src/main/scala/works/iterative/ui/model/Computable.scala index 53d226b..f888701 100644 --- a/ui/shared/src/main/scala/works/iterative/ui/model/Computable.scala +++ b/ui/shared/src/main/scala/works/iterative/ui/model/Computable.scala @@ -3,6 +3,8 @@ import works.iterative.core.UserMessage import java.time.Instant import zio.prelude.Covariant +import zio.prelude.ForEach +import zio.prelude.IdentityBoth /** A class representing the states of a model that needs computation */