Skip to content

Commit

Permalink
Issue 22 fix frontend (#23)
Browse files Browse the repository at this point in the history
* make feed.name optional
  • Loading branch information
d10xa authored Jan 7, 2025
1 parent 4ae0f1a commit 5e043b1
Show file tree
Hide file tree
Showing 35 changed files with 333 additions and 180 deletions.
26 changes: 19 additions & 7 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import xerial.sbt.Sonatype.sonatypeCentralHost

ThisBuild / scalaVersion := "3.5.0"
ThisBuild / scalaVersion := "3.6.2"
ThisBuild / licenses := List(("MIT", url("https://opensource.org/licenses/MIT")))
ThisBuild / homepage := Some(url("https://github.com/d10xa/json-log-viewer"))
ThisBuild / organization := "ru.d10xa"
Expand All @@ -17,6 +17,14 @@ ThisBuild / sonatypeCredentialHost := sonatypeCentralHost
val circeVersion = "0.14.10"
val declineVersion = "2.4.1"
val fs2Version = "3.11.0"
val munitVersion = "1.0.3"

lazy val root = project.in(file(".")).
aggregate(`json-log-viewer`.js, `json-log-viewer`.jvm, `frontend-laminar`).
settings(
publish := {},
publishLocal := {},
)

lazy val `json-log-viewer` = crossProject(JSPlatform, JVMPlatform)
.in(file("json-log-viewer"))
Expand All @@ -28,6 +36,7 @@ lazy val `json-log-viewer` = crossProject(JSPlatform, JVMPlatform)
pomIncludeRepository := { _ => false },
libraryDependencies ++= Seq(
"org.typelevel" %%% "cats-effect" % "3.5.4",
"org.typelevel" %%% "munit-cats-effect" % "2.0.0" % Test,
"co.fs2" %%% "fs2-core" % fs2Version,
"co.fs2" %%% "fs2-io" % fs2Version,
"com.monovore" %%% "decline" % declineVersion,
Expand All @@ -36,20 +45,22 @@ lazy val `json-log-viewer` = crossProject(JSPlatform, JVMPlatform)
"io.circe" %%% "circe-literal" % circeVersion % Test,
"io.circe" %%% "circe-parser" % circeVersion,
"io.circe" %%% "circe-generic" % circeVersion,
"io.circe" %%% "circe-yaml-scalayaml" % "0.16.0",
"com.lihaoyi" %%% "fansi" % "0.5.0",
"org.scala-lang.modules" %%% "scala-parser-combinators" % "2.4.0",
"org.scalameta" %% "munit" % "0.7.29" % Test
"org.scalameta" %%% "munit" % munitVersion % Test
),
fork := true,
run / connectInput := true,
)
.jvmSettings(
libraryDependencies ++= Seq(
"io.circe" %%% "circe-yaml-scalayaml" % "0.16.0"
),
publish / skip := false
)
.jsSettings(
publish / skip := true,
fork := false,
fork := false
)

lazy val `make-logs` = project
Expand Down Expand Up @@ -77,12 +88,13 @@ lazy val `frontend-laminar` = project
"com.raquo" %%% "airstream" % "16.0.0",
"com.raquo" %%% "waypoint" % "7.0.0",
"com.github.plokhotnyuk.jsoniter-scala" %%% "jsoniter-scala-core" % "2.28.4",
"com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.28.4" % "provided"
"com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.28.4" % "provided",
"org.scalameta" %% "munit" % munitVersion % Test
),
Compile / fastLinkJS / scalaJSLinkerConfig ~= { _.withSourceMap(true) },
Compile / fullLinkJS / scalaJSLinkerConfig ~= { _.withSourceMap(true) },
scalaJSLinkerConfig ~= { _.withModuleKind(ModuleKind.CommonJSModule) },

scalaJSUseMainModuleInitializer := true,
(Test / requireJsDomEnv) := true,
useYarn := true
(Test / requireJsDomEnv) := true
)
2 changes: 1 addition & 1 deletion frontend-laminar/src/main/resources/index-fastopt.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<link rel="stylesheet" href="./app.css">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>
<script type="text/javascript" src="../../../target/scala-3.5.0/frontend-laminar-fastopt/main.js"></script>
<script type="text/javascript" src="../../../target/scala-3.6.2/frontend-laminar-fastopt/main.js"></script>
</head>
<body>
<div id="app-container"></div>
Expand Down
2 changes: 1 addition & 1 deletion frontend-laminar/src/main/resources/index-fullopt.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<title>[FULL] json-log-viewer</title>
<link rel="stylesheet" href="./app.css">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
<script type="text/javascript" src="../../../target/scala-3.5.0/frontend-laminar-opt/main.js"></script>
<script type="text/javascript" src="../../../target/scala-3.6.2/frontend-laminar-opt/main.js"></script>
</head>
<body>
<div id="app-container"></div>
Expand Down
62 changes: 0 additions & 62 deletions frontend-laminar/src/main/scala/ViewElement.scala

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
package ru.d10xa.jsonlogviewer

import fansi.ErrorMode
import fansi.Str

Expand All @@ -6,7 +8,7 @@ import scala.scalajs.js.annotation.JSExport
/** https://github.com/com-lihaoyi/fansi/issues/62
*/
object Ansi2HtmlWithClasses extends Function1[String, String]:
private def transition(from: fansi.Attr, to: fansi.Attr) =
def transition(from: fansi.Attr, to: fansi.Attr): String =
import fansi.*
(from, to) match
case (Underlined.Off, Underlined.On) => "<u>"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,25 @@
import Router0.*
package ru.d10xa.jsonlogviewer

import com.monovore.decline.Help
import com.raquo.laminar.DomApi
import com.raquo.laminar.api.L
import com.raquo.laminar.api.L.*
import com.raquo.laminar.nodes.ReactiveHtmlElement
import com.raquo.waypoint.*
import fansi.ErrorMode
import org.scalajs.dom
import org.scalajs.dom.HTMLButtonElement
import org.scalajs.dom.HTMLDivElement
import ru.d10xa.jsonlogviewer.Router0.*
import ru.d10xa.jsonlogviewer.Router0.EditPage
import ru.d10xa.jsonlogviewer.Router0.HelpPage
import ru.d10xa.jsonlogviewer.Router0.LivePage
import ru.d10xa.jsonlogviewer.Router0.Page
import ru.d10xa.jsonlogviewer.Router0.ViewPage
import ru.d10xa.jsonlogviewer.Router0.navigateTo
import ru.d10xa.jsonlogviewer.decline.Config
import ru.d10xa.jsonlogviewer.decline.Config.FormatIn
import ru.d10xa.jsonlogviewer.decline.Config.FormatOut
import ru.d10xa.jsonlogviewer.decline.Config.FormatIn.Json
import ru.d10xa.jsonlogviewer.decline.Config.FormatIn.Logfmt
import ru.d10xa.jsonlogviewer.decline.Config
import ru.d10xa.jsonlogviewer.decline.Config
import ru.d10xa.jsonlogviewer.decline.Config.FormatOut
import ru.d10xa.jsonlogviewer.decline.DeclineOpts
import ru.d10xa.jsonlogviewer.query.QueryCompiler

Expand Down Expand Up @@ -50,7 +55,7 @@ object App {
val formatInVar: Var[FormatIn] = Var(
FormatIn.Json
)
val formatOutVar: Var[FormatOut] = Var(
val formatOutVar: Var[FormatOut] = Var(
FormatOut.Pretty
)

Expand All @@ -71,7 +76,13 @@ object App {
case Right(value) => Some(value)
} yield DeclineOpts.command
.parse(splitArgs(cli))
.map(cfg => cfg.copy(filter = filter, formatIn = Some(formatIn), formatOut = Some(formatOut)))
.map(cfg =>
cfg.copy(
filter = filter,
formatIn = Some(formatIn),
formatOut = Some(formatOut)
)
)

def main(args: Array[String]): Unit = {
lazy val container = dom.document.getElementById("app-container")
Expand Down Expand Up @@ -135,11 +146,11 @@ object App {
select(
cls := "col-1",
value <-- formatOutVar.signal.map {
case FormatOut.Raw => "raw"
case FormatOut.Raw => "raw"
case FormatOut.Pretty => "pretty"
},
onChange.mapToValue.map {
case "raw" => FormatOut.Raw
case "raw" => FormatOut.Raw
case "pretty" => FormatOut.Pretty
} --> formatOutVar,
option(value := "pretty", "pretty"),
Expand All @@ -158,7 +169,7 @@ object App {
onInput.mapToValue --> filterVar
)
)
)
)

def additionalArgsDiv: ReactiveHtmlElement[HTMLDivElement] = div(
cls := "row-fluid",
Expand Down Expand Up @@ -193,6 +204,7 @@ object App {
}
)
private def renderLivePage(): HtmlElement = {
implicit val owner: Owner = new Owner {}
div(
formatInDiv,
formatOutDiv,
Expand All @@ -205,6 +217,7 @@ object App {
}

private def renderViewPage(): HtmlElement = {
implicit val owner: Owner = new Owner {}
div(
ViewElement.render(textVar.signal, configSignal)
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import com.raquo.laminar.api.L.{*, given}
package ru.d10xa.jsonlogviewer

import com.raquo.laminar.api.L
import com.raquo.laminar.api.L.*
object EditElement {

def render(mods: Modifier[TextArea]*): HtmlElement =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import com.raquo.laminar.api.L.{*, given}
import com.raquo.waypoint.*
import org.scalajs.dom
package ru.d10xa.jsonlogviewer

import com.github.plokhotnyuk.jsoniter_scala.core.*
import com.github.plokhotnyuk.jsoniter_scala.macros.*
import com.raquo.laminar.api.L.*
import com.raquo.waypoint.*
import org.scalajs.dom

object Router0 {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package ru.d10xa.jsonlogviewer

import cats.effect.IO
import cats.effect.unsafe.implicits.global
import com.monovore.decline.Help
import com.raquo.airstream.core.Signal
import com.raquo.airstream.eventbus.EventBus
import com.raquo.airstream.ownership.Owner
import com.raquo.laminar.DomApi
import com.raquo.laminar.api.L.*
import ru.d10xa.jsonlogviewer.decline.Config
import ru.d10xa.jsonlogviewer.decline.yaml.ConfigYaml
import ru.d10xa.jsonlogviewer.decline.yaml.Feed

import scala.util.chaining.*

object ViewElement {

def stringsToHtmlElement(strings: List[String]): HtmlElement =
strings
.map(Ansi2HtmlWithClasses.apply)
.mkString("<div>", "", "</div>")
.pipe(DomApi.unsafeParseHtmlString)
.pipe(foreignHtmlElement)

def modifyConfigForInlineInput(string: String, config: Config): Config =
config.copy(configYaml =
Some(
ConfigYaml(
filter = None,
formatIn = None,
commands = None,
feeds = Some(
List(
Feed(
name = None,
commands = List.empty,
inlineInput = Some(string),
filter = config.filter,
formatIn = config.formatIn
)
)
)
)
)
)

def render(
logLinesSignal: Signal[String],
configSignal: Signal[Either[Help, Config]]
)(implicit owner: Owner): HtmlElement = {
val eventBus = new EventBus[HtmlElement]
logLinesSignal
.combineWith(configSignal)
.foreach {
case (string, Right(c)) =>
LogViewerStream
.stream(modifyConfigForInlineInput(string, c))
.compile
.toList
.map(stringsToHtmlElement)
.flatMap(e => IO(eventBus.writer.onNext(e)))
.unsafeRunAndForget()

case (_, Left(help)) =>
eventBus.writer.onNext(pre(cls := "text-light", help.toString))
}(owner)

pre(
cls := "bg-dark font-monospace text-white",
child <-- eventBus.events
)
}
}
Loading

0 comments on commit 5e043b1

Please sign in to comment.