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 81a64d1..6fd20f7 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 @@ -16,24 +16,29 @@ trait I18NExtensions: extension (msg: UserMessage) - inline def asElement(using ctx: ComponentContext[_]): HtmlElement = + inline def asElement(using ctx: ComponentContext[?]): HtmlElement = span(msg.asMod) inline def asOptionalElement(using - ctx: ComponentContext[_] + ctx: ComponentContext[?] ): Option[HtmlElement] = ctx.messages.get(msg).map(t => span(msgAttrs(msg.id, t))) - inline def asString(using ctx: ComponentContext[_]): String = + inline def asString(using ctx: ComponentContext[?]): String = ctx.messages(msg) - inline def asMod(using ctx: ComponentContext[_]): Mod[HtmlElement] = + inline def asOptionalString(using + ctx: ComponentContext[?] + ): Option[String] = + ctx.messages.get(msg) + + inline def asMod(using ctx: ComponentContext[?]): Mod[HtmlElement] = msgAttrs(msg.id, ctx.messages(msg)) private inline def msgAttrs(id: MessageId, text: String): HtmlMod = nodeSeq(dataAttr("msgid")(id.toString()), text) - given (using ComponentContext[_]): HtmlRenderable[UserMessage] with + given (using ComponentContext[?]): HtmlRenderable[UserMessage] with def toHtml(msg: UserMessage): Modifier[HtmlElement] = msg.asElement 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 81a64d1..6fd20f7 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 @@ -16,24 +16,29 @@ trait I18NExtensions: extension (msg: UserMessage) - inline def asElement(using ctx: ComponentContext[_]): HtmlElement = + inline def asElement(using ctx: ComponentContext[?]): HtmlElement = span(msg.asMod) inline def asOptionalElement(using - ctx: ComponentContext[_] + ctx: ComponentContext[?] ): Option[HtmlElement] = ctx.messages.get(msg).map(t => span(msgAttrs(msg.id, t))) - inline def asString(using ctx: ComponentContext[_]): String = + inline def asString(using ctx: ComponentContext[?]): String = ctx.messages(msg) - inline def asMod(using ctx: ComponentContext[_]): Mod[HtmlElement] = + inline def asOptionalString(using + ctx: ComponentContext[?] + ): Option[String] = + ctx.messages.get(msg) + + inline def asMod(using ctx: ComponentContext[?]): Mod[HtmlElement] = msgAttrs(msg.id, ctx.messages(msg)) private inline def msgAttrs(id: MessageId, text: String): HtmlMod = nodeSeq(dataAttr("msgid")(id.toString()), text) - given (using ComponentContext[_]): HtmlRenderable[UserMessage] with + given (using ComponentContext[?]): HtmlRenderable[UserMessage] with def toHtml(msg: UserMessage): Modifier[HtmlElement] = msg.asElement diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tables/TableBuilderModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tables/TableBuilderModule.scala index b618096..8e97f7d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tables/TableBuilderModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tables/TableBuilderModule.scala @@ -30,14 +30,13 @@ def buildTable[A: HtmlTabular](data: List[A]): HtmlTableBuilder[A] = HtmlTableBuilder[A](data) - case class HtmlTableBuilder[A: HtmlTabular]( + case class HtmlTableBuilder[A]( data: List[A], headerRowMod: HtmlMod = emptyMod, dataRowMod: (A, Int) => HtmlMod = (_: A, _) => emptyMod, headerCellMod: String => HtmlMod = _ => emptyMod, dataCellMod: (String, A) => HtmlMod = (_, _: A) => emptyMod - ): - + )(using tab: HtmlTabular[A]): def headerRowMod(mod: HtmlMod): HtmlTableBuilder[A] = copy(headerRowMod = mod) @@ -53,26 +52,29 @@ def dataCellMod(mod: (String, A) => HtmlMod): HtmlTableBuilder[A] = copy(dataCellMod = mod) - def build: HtmlElement = - val tab = summon[HtmlTabular[A]] - tableUIFactory.container( - tableUIFactory.table( - tableUIFactory.headerRow(headerRowMod)( - tab.columns.map(_.name).map { n => - tableUIFactory.headerCell( - Seq[HtmlMod](headerCellMod(n), tableHeaderResolver(n)) - ) - }* + def buildTableHeader: ReactiveHtmlElement[html.TableRow] = + tableUIFactory.headerRow(headerRowMod)( + tab.columns.map(_.name).map { n => + tableUIFactory.headerCell( + Seq[HtmlMod](headerCellMod(n), tableHeaderResolver(n)) ) - )( - data.zipWithIndex.map((d, idx) => - tableUIFactory.dataRow(dataRowMod(d, idx))( - tab.columns - .map(c => c.name -> c.get(d)) - .map { (n, v) => - tableUIFactory.dataCell(Seq(v, dataCellMod(n, d))) - }* - ) - )* + }* + ) + + def buildTableData( + data: List[A] + ): List[ReactiveHtmlElement[html.TableRow]] = + data.zipWithIndex.map((d, idx) => + tableUIFactory.dataRow(dataRowMod(d, idx))( + tab.columns + .map(c => c.name -> c.get(d)) + .map { (n, v) => + tableUIFactory.dataCell(Seq(v, dataCellMod(n, d))) + }* ) ) + + def build: HtmlElement = + tableUIFactory.container( + tableUIFactory.table(buildTableHeader)(buildTableData(data)*) + )