diff --git a/ui/components/src/main/scala/works/iterative/ui/components/tailwind/form/FormCodec.scala b/ui/components/src/main/scala/works/iterative/ui/components/tailwind/form/FormCodec.scala index 405d371..2f56234 100644 --- a/ui/components/src/main/scala/works/iterative/ui/components/tailwind/form/FormCodec.scala +++ b/ui/components/src/main/scala/works/iterative/ui/components/tailwind/form/FormCodec.scala @@ -15,6 +15,18 @@ def toValue(r: A): Validated[V] object FormCodec: + given FormCodec[String, String] with + def toForm(v: String): String = v + def toValue(r: String): Validated[String] = Validation.fromPredicateWith( + InvalidValue("error.empty.string") + )(r)(t => Option(t).map(_.trim).exists(_.nonEmpty)) + + given FormCodec[Option[String], String] with + def toForm(v: Option[String]): String = v.getOrElse("") + def toValue(r: String): Validated[Option[String]] = Validation.succeed( + Option(r).map(_.trim).filter(_.nonEmpty) + ) + given FormCodec[PlainMultiLine, String] with override def toForm(v: PlainMultiLine): String = v.toString override def toValue(r: String): Validated[PlainMultiLine] = diff --git a/ui/components/src/main/scala/works/iterative/ui/components/tailwind/form/FormCodec.scala b/ui/components/src/main/scala/works/iterative/ui/components/tailwind/form/FormCodec.scala index 405d371..2f56234 100644 --- a/ui/components/src/main/scala/works/iterative/ui/components/tailwind/form/FormCodec.scala +++ b/ui/components/src/main/scala/works/iterative/ui/components/tailwind/form/FormCodec.scala @@ -15,6 +15,18 @@ def toValue(r: A): Validated[V] object FormCodec: + given FormCodec[String, String] with + def toForm(v: String): String = v + def toValue(r: String): Validated[String] = Validation.fromPredicateWith( + InvalidValue("error.empty.string") + )(r)(t => Option(t).map(_.trim).exists(_.nonEmpty)) + + given FormCodec[Option[String], String] with + def toForm(v: Option[String]): String = v.getOrElse("") + def toValue(r: String): Validated[Option[String]] = Validation.succeed( + Option(r).map(_.trim).filter(_.nonEmpty) + ) + given FormCodec[PlainMultiLine, String] with override def toForm(v: PlainMultiLine): String = v.toString override def toValue(r: String): Validated[PlainMultiLine] = diff --git a/ui/components/src/main/scala/works/iterative/ui/components/tailwind/form/FormInput.scala b/ui/components/src/main/scala/works/iterative/ui/components/tailwind/form/FormInput.scala index 73ed43b..7d21f70 100644 --- a/ui/components/src/main/scala/works/iterative/ui/components/tailwind/form/FormInput.scala +++ b/ui/components/src/main/scala/works/iterative/ui/components/tailwind/form/FormInput.scala @@ -18,6 +18,8 @@ this.render(property, updates.contramap(_.flatMap(v))) object FormInput: + given stringInput: FormInput[String] = Inputs.PlainInput() + given optionStringInput: FormInput[Option[String]] = Inputs.PlainInput() given plainMultiLineInput: FormInput[PlainMultiLine] = TextArea() given optionPlainMultiLineInput: FormInput[Option[PlainMultiLine]] = TextArea()