diff --git a/core/shared/src/main/scala/works/iterative/core/UserMessage.scala b/core/shared/src/main/scala/works/iterative/core/UserMessage.scala index f402180..67bf96f 100644 --- a/core/shared/src/main/scala/works/iterative/core/UserMessage.scala +++ b/core/shared/src/main/scala/works/iterative/core/UserMessage.scala @@ -3,6 +3,7 @@ // Type-wise naive solution for specifying user messages. // A mechanism that will check the message for correct formatting and validate parameters is needed +// TODO: make UserMessage serializable case class UserMessage(id: MessageId, args: Any*) object UserMessage: diff --git a/core/shared/src/main/scala/works/iterative/core/UserMessage.scala b/core/shared/src/main/scala/works/iterative/core/UserMessage.scala index f402180..67bf96f 100644 --- a/core/shared/src/main/scala/works/iterative/core/UserMessage.scala +++ b/core/shared/src/main/scala/works/iterative/core/UserMessage.scala @@ -3,6 +3,7 @@ // Type-wise naive solution for specifying user messages. // A mechanism that will check the message for correct formatting and validate parameters is needed +// TODO: make UserMessage serializable case class UserMessage(id: MessageId, args: Any*) object UserMessage: diff --git a/ui/components/src/main/scala/works/iterative/ui/JsonMessageCatalogue.scala b/ui/components/src/main/scala/works/iterative/ui/JsonMessageCatalogue.scala index 32982f4..79aef16 100644 --- a/ui/components/src/main/scala/works/iterative/ui/JsonMessageCatalogue.scala +++ b/ui/components/src/main/scala/works/iterative/ui/JsonMessageCatalogue.scala @@ -11,7 +11,9 @@ def messages: js.Dictionary[String] override def get(id: MessageId): Option[String] = + assume(messages != null, "Message catalogue must not be null") messages.get(id.toString) override def get(msg: UserMessage): Option[String] = + assume(messages != null, "Message catalogue must not be null") get(msg.id).map(_.format(msg.args: _*)) diff --git a/core/shared/src/main/scala/works/iterative/core/UserMessage.scala b/core/shared/src/main/scala/works/iterative/core/UserMessage.scala index f402180..67bf96f 100644 --- a/core/shared/src/main/scala/works/iterative/core/UserMessage.scala +++ b/core/shared/src/main/scala/works/iterative/core/UserMessage.scala @@ -3,6 +3,7 @@ // Type-wise naive solution for specifying user messages. // A mechanism that will check the message for correct formatting and validate parameters is needed +// TODO: make UserMessage serializable case class UserMessage(id: MessageId, args: Any*) object UserMessage: diff --git a/ui/components/src/main/scala/works/iterative/ui/JsonMessageCatalogue.scala b/ui/components/src/main/scala/works/iterative/ui/JsonMessageCatalogue.scala index 32982f4..79aef16 100644 --- a/ui/components/src/main/scala/works/iterative/ui/JsonMessageCatalogue.scala +++ b/ui/components/src/main/scala/works/iterative/ui/JsonMessageCatalogue.scala @@ -11,7 +11,9 @@ def messages: js.Dictionary[String] override def get(id: MessageId): Option[String] = + assume(messages != null, "Message catalogue must not be null") messages.get(id.toString) override def get(msg: UserMessage): Option[String] = + assume(messages != null, "Message catalogue must not be null") get(msg.id).map(_.format(msg.args: _*)) diff --git a/ui/components/src/main/scala/works/iterative/ui/components/dashboard/tailwind/Dashboard.scala b/ui/components/src/main/scala/works/iterative/ui/components/dashboard/tailwind/Dashboard.scala new file mode 100644 index 0000000..046b651 --- /dev/null +++ b/ui/components/src/main/scala/works/iterative/ui/components/dashboard/tailwind/Dashboard.scala @@ -0,0 +1,7 @@ +package works.iterative.ui.components.dashboard.tailwind + +import com.raquo.laminar.api.L.{*, given} + +object Dashboard: + def number(n: Int, color: String, t: String) = + span(cls(color), title(t), s"$n") diff --git a/core/shared/src/main/scala/works/iterative/core/UserMessage.scala b/core/shared/src/main/scala/works/iterative/core/UserMessage.scala index f402180..67bf96f 100644 --- a/core/shared/src/main/scala/works/iterative/core/UserMessage.scala +++ b/core/shared/src/main/scala/works/iterative/core/UserMessage.scala @@ -3,6 +3,7 @@ // Type-wise naive solution for specifying user messages. // A mechanism that will check the message for correct formatting and validate parameters is needed +// TODO: make UserMessage serializable case class UserMessage(id: MessageId, args: Any*) object UserMessage: diff --git a/ui/components/src/main/scala/works/iterative/ui/JsonMessageCatalogue.scala b/ui/components/src/main/scala/works/iterative/ui/JsonMessageCatalogue.scala index 32982f4..79aef16 100644 --- a/ui/components/src/main/scala/works/iterative/ui/JsonMessageCatalogue.scala +++ b/ui/components/src/main/scala/works/iterative/ui/JsonMessageCatalogue.scala @@ -11,7 +11,9 @@ def messages: js.Dictionary[String] override def get(id: MessageId): Option[String] = + assume(messages != null, "Message catalogue must not be null") messages.get(id.toString) override def get(msg: UserMessage): Option[String] = + assume(messages != null, "Message catalogue must not be null") get(msg.id).map(_.format(msg.args: _*)) diff --git a/ui/components/src/main/scala/works/iterative/ui/components/dashboard/tailwind/Dashboard.scala b/ui/components/src/main/scala/works/iterative/ui/components/dashboard/tailwind/Dashboard.scala new file mode 100644 index 0000000..046b651 --- /dev/null +++ b/ui/components/src/main/scala/works/iterative/ui/components/dashboard/tailwind/Dashboard.scala @@ -0,0 +1,7 @@ +package works.iterative.ui.components.dashboard.tailwind + +import com.raquo.laminar.api.L.{*, given} + +object Dashboard: + def number(n: Int, color: String, t: String) = + span(cls(color), title(t), s"$n") diff --git a/ui/model/src/main/scala/works/iterative/ui/model/Computable.scala b/ui/model/src/main/scala/works/iterative/ui/model/Computable.scala new file mode 100644 index 0000000..29287ba --- /dev/null +++ b/ui/model/src/main/scala/works/iterative/ui/model/Computable.scala @@ -0,0 +1,12 @@ +package works.iterative.ui.model + +import works.iterative.core.UserMessage + +/** A class representing the states of a model that needs computation + */ +// TODO: move to core when stable +enum Computable[Model]: + case Uninitialized extends Computable[Nothing] + case Computing extends Computable[Nothing] + case Ready(model: Model) extends Computable[Model] + case Failed(error: UserMessage) extends Computable[Nothing] diff --git a/core/shared/src/main/scala/works/iterative/core/UserMessage.scala b/core/shared/src/main/scala/works/iterative/core/UserMessage.scala index f402180..67bf96f 100644 --- a/core/shared/src/main/scala/works/iterative/core/UserMessage.scala +++ b/core/shared/src/main/scala/works/iterative/core/UserMessage.scala @@ -3,6 +3,7 @@ // Type-wise naive solution for specifying user messages. // A mechanism that will check the message for correct formatting and validate parameters is needed +// TODO: make UserMessage serializable case class UserMessage(id: MessageId, args: Any*) object UserMessage: diff --git a/ui/components/src/main/scala/works/iterative/ui/JsonMessageCatalogue.scala b/ui/components/src/main/scala/works/iterative/ui/JsonMessageCatalogue.scala index 32982f4..79aef16 100644 --- a/ui/components/src/main/scala/works/iterative/ui/JsonMessageCatalogue.scala +++ b/ui/components/src/main/scala/works/iterative/ui/JsonMessageCatalogue.scala @@ -11,7 +11,9 @@ def messages: js.Dictionary[String] override def get(id: MessageId): Option[String] = + assume(messages != null, "Message catalogue must not be null") messages.get(id.toString) override def get(msg: UserMessage): Option[String] = + assume(messages != null, "Message catalogue must not be null") get(msg.id).map(_.format(msg.args: _*)) diff --git a/ui/components/src/main/scala/works/iterative/ui/components/dashboard/tailwind/Dashboard.scala b/ui/components/src/main/scala/works/iterative/ui/components/dashboard/tailwind/Dashboard.scala new file mode 100644 index 0000000..046b651 --- /dev/null +++ b/ui/components/src/main/scala/works/iterative/ui/components/dashboard/tailwind/Dashboard.scala @@ -0,0 +1,7 @@ +package works.iterative.ui.components.dashboard.tailwind + +import com.raquo.laminar.api.L.{*, given} + +object Dashboard: + def number(n: Int, color: String, t: String) = + span(cls(color), title(t), s"$n") diff --git a/ui/model/src/main/scala/works/iterative/ui/model/Computable.scala b/ui/model/src/main/scala/works/iterative/ui/model/Computable.scala new file mode 100644 index 0000000..29287ba --- /dev/null +++ b/ui/model/src/main/scala/works/iterative/ui/model/Computable.scala @@ -0,0 +1,12 @@ +package works.iterative.ui.model + +import works.iterative.core.UserMessage + +/** A class representing the states of a model that needs computation + */ +// TODO: move to core when stable +enum Computable[Model]: + case Uninitialized extends Computable[Nothing] + case Computing extends Computable[Nothing] + case Ready(model: Model) extends Computable[Model] + case Failed(error: UserMessage) extends Computable[Nothing] diff --git a/ui/model/src/main/scala/works/iterative/ui/model/Form.scala b/ui/model/src/main/scala/works/iterative/ui/model/Form.scala index 9ad7f99..1fa38d0 100644 --- a/ui/model/src/main/scala/works/iterative/ui/model/Form.scala +++ b/ui/model/src/main/scala/works/iterative/ui/model/Form.scala @@ -3,6 +3,16 @@ import core.* +// Generic events that can be generated by forms +// When editing a form, you can +// - submit the form with some data (might be multiple options) +// - cancel the form editation +// - reset the form to its initial state +enum FormEvent[T]: + case Submitted(data: T) + case Cancelled extends FormEvent[Nothing] + case Reset extends FormEvent[Nothing] + case class FormItem[Value]( id: String, label: PlainOneLine,