diff --git a/.scalafmt.conf b/.scalafmt.conf index 6712df2..faed3ac 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -3,7 +3,7 @@ project.git = true project.excludeFilters = [ ] -runner.dialect=scala213 +runner.dialect=scala3 maxColumn = 120 assumeStandardLibraryStripMargin = false diff --git a/build.sbt b/build.sbt index 2350366..1fb3e06 100644 --- a/build.sbt +++ b/build.sbt @@ -4,11 +4,13 @@ import java.nio.file.StandardCopyOption.REPLACE_EXISTING ThisBuild / versionScheme := Some("early-semver") // For all Sonatype accounts created on or after February 2021 ThisBuild / sonatypeCredentialHost := "s01.oss.sonatype.org" +ThisBuild / scalaVersion := "3.3.0" inThisBuild( List( organization := "net.wiringbits", name := "scala-postgres-react-admin", + scalaVersion := "3.3.0", homepage := Some(url("https://github.com/wiringbits/scala-postgres-react-admin")), licenses := List("MIT" -> url("https://www.opensource.org/licenses/mit-license.html")), developers := List( @@ -24,8 +26,12 @@ inThisBuild( resolvers += Resolver.sonatypeRepo("releases") -val playJson = "2.10.0-RC5" +val play = "2.9.0-M6" +val playJson = "2.10.0-RC9" val sttp = "3.5.0" +val anorm = "2.7.0" +val scalaTestPlusPlay = "6.0.0-M6" +val scalaTestPlusMockito = "3.2.15.0" val consoleDisabledOptions = Seq("-Xfatal-warnings", "-Ywarn-unused", "-Ywarn-unused-import") @@ -35,8 +41,7 @@ lazy val build = TaskKey[File]("build") lazy val baseServerSettings: Project => Project = { _.settings( scalacOptions ++= Seq( - "-unchecked", - "-deprecation", + "-Werror", "-feature" ), Compile / doc / scalacOptions ++= Seq("-no-link-warnings"), @@ -55,18 +60,15 @@ lazy val playSettings: Project => Project = { Compile / doc / scalacOptions ++= Seq( "-no-link-warnings" ), - // remove play noisy warnings - play.sbt.routes.RoutesKeys.routesImport := Seq.empty, libraryDependencies ++= Seq( evolutions, - "com.typesafe.play" %% "play-jdbc" % "2.8.13", + "com.typesafe.play" %% "play-jdbc" % "2.9.0-M6", "com.google.inject" % "guice" % "5.1.0" ), // test libraryDependencies ++= Seq( - "org.scalatestplus.play" %% "scalatestplus-play" % "5.1.0" % Test, - "org.mockito" %% "mockito-scala" % "1.17.5" % Test, - "org.mockito" %% "mockito-scala-scalatest" % "1.17.5" % Test + "org.scalatestplus.play" %% "scalatestplus-play" % "6.0.0-M6" % Test, + "org.scalatestplus" %% "mockito-4-6" % scalaTestPlusMockito % Test ) ) } @@ -105,11 +107,6 @@ lazy val baseLibSettings: Project => Project = _.settings( // The common stuff for the server/client modules lazy val spraCommon = (crossProject(JSPlatform, JVMPlatform) in file("spra-common")) .configure(baseLibSettings) - .settings( - scalaVersion := "2.13.8", - crossScalaVersions := Seq("2.13.8", "3.1.2"), - name := "spra-common" - ) .jsConfigure(_.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin)) .jvmSettings( libraryDependencies ++= Seq( @@ -131,11 +128,6 @@ lazy val spraCommon = (crossProject(JSPlatform, JVMPlatform) in file("spra-commo lazy val spraApi = (crossProject(JSPlatform, JVMPlatform) in file("spra-api")) .configure(baseLibSettings) .dependsOn(spraCommon) - .settings( - scalaVersion := "2.13.8", - crossScalaVersions := Seq("2.13.8", "3.1.2"), - name := "spra-api" - ) .jsConfigure(_.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin)) .jvmSettings( libraryDependencies ++= Seq( @@ -156,19 +148,16 @@ lazy val spraApi = (crossProject(JSPlatform, JVMPlatform) in file("spra-api")) /** Includes the specific stuff to run the SPRA server side (play-specific) */ lazy val spraPlayServer = (project in file("spra-play-server")) + .enablePlugins(PlayScala) .dependsOn(spraApi.jvm, spraCommon.jvm) .configure(baseServerSettings, playSettings) .settings( - scalaVersion := "2.13.8", - crossScalaVersions := Seq("2.13.8"), - name := "spra-play-server", fork := true, Test / fork := true, // allows for graceful shutdown of containers once the tests have finished running libraryDependencies ++= Seq( guice, - "org.playframework.anorm" %% "anorm" % "2.6.10", - "com.typesafe.play" %% "play" % "2.8.13", - "com.typesafe.play" %% "play-json" % "2.9.2", + "org.playframework.anorm" %% "anorm" % anorm, + "com.typesafe.play" %% "play-json" % playJson, "org.postgresql" % "postgresql" % "42.3.6", "com.github.jwt-scala" %% "jwt-core" % "9.0.5", "de.svenkubiak" % "jBCrypt" % "0.4.3", @@ -254,13 +243,10 @@ lazy val browserProject: Project => Project = ) lazy val spraWeb = (project in file("spra-web")) - .dependsOn(spraApi.js, spraPlayServer) + .dependsOn(spraApi.js) .configure(bundlerSettings, baseLibSettings, browserProject, spraWebBuildInfoSettings) .configure(_.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin)) .settings( - scalaVersion := "2.13.8", - crossScalaVersions := Seq("2.13.8", "3.1.2"), - name := "spra-web", Test / fork := false, // sjs needs this to run tests scalaJSUseMainModuleInitializer := true, scalaJSLinkerConfig := scalaJSLinkerConfig.value.withSourceMap(false), @@ -268,8 +254,8 @@ lazy val spraWeb = (project in file("spra-web")) webpackBundlingMode := BundlingMode.LibraryOnly(), libraryDependencies ++= Seq( "org.scala-js" %%% "scala-js-macrotask-executor" % "1.0.0", - "me.shadaj" %%% "slinky-core" % "0.7.3", - "me.shadaj" %%% "slinky-web" % "0.7.3" + "me.shadaj" %%% "slinky-core" % "0.7.4", + "me.shadaj" %%% "slinky-web" % "0.7.4" ), Compile / npmDependencies ++= Seq( "react" -> "17.0.0", diff --git a/project/plugins.sbt b/project/plugins.sbt index 02301c9..217461d 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,8 +1,11 @@ -addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.1.0") +// while there are some eviction errors, plugins seem to be compatible so far +evictionErrorLevel := sbt.util.Level.Warn -addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.8.13") +addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.3.1") -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.8.0") +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.9.0-M6") + +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.13.1") addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.20.0") diff --git a/spra-api/shared/src/main/scala/net/wiringbits/spra/api/AdminDataExplorerApiClient.scala b/spra-api/shared/src/main/scala/net/wiringbits/spra/api/AdminDataExplorerApiClient.scala index 50639ae..07bc3e9 100644 --- a/spra-api/shared/src/main/scala/net/wiringbits/spra/api/AdminDataExplorerApiClient.scala +++ b/spra-api/shared/src/main/scala/net/wiringbits/spra/api/AdminDataExplorerApiClient.scala @@ -1,16 +1,9 @@ package net.wiringbits.spra.api -import net.wiringbits.spra.api.models.{ - AdminCreateTable, - AdminDeleteTable, - AdminGetTables, - AdminUpdateTable, - PlayErrorResponse -} -import net.wiringbits.spra.api.models._ -import play.api.libs.json._ -import sttp.client3._ -import sttp.model._ +import net.wiringbits.spra.api.models.* +import play.api.libs.json.* +import sttp.client3.* +import sttp.model.* import scala.concurrent.{ExecutionContext, Future} import scala.util.{Failure, Success, Try} diff --git a/spra-api/shared/src/main/scala/net/wiringbits/spra/api/models/package.scala b/spra-api/shared/src/main/scala/net/wiringbits/spra/api/models/package.scala index 6745f8b..08eca61 100644 --- a/spra-api/shared/src/main/scala/net/wiringbits/spra/api/models/package.scala +++ b/spra-api/shared/src/main/scala/net/wiringbits/spra/api/models/package.scala @@ -1,6 +1,6 @@ package net.wiringbits.spra.api -import play.api.libs.json._ +import play.api.libs.json.* import java.time.Instant diff --git a/spra-play-server/src/main/resources/routes b/spra-play-server/src/main/resources/routes index 1531894..399e3c0 100644 --- a/spra-play-server/src/main/resources/routes +++ b/spra-play-server/src/main/resources/routes @@ -3,4 +3,4 @@ # https://www.playframework.com/documentation/latest/ScalaRouting # ~~~~ --> / net.wiringbits.spra.admin.AppRouter +-> / net.wiringbits.spra.admin.AppRouter diff --git a/spra-play-server/src/main/scala/net/wiringbits/spra/admin/AppRouter.scala b/spra-play-server/src/main/scala/net/wiringbits/spra/admin/AppRouter.scala index e7f5dad..5c61967 100644 --- a/spra-play-server/src/main/scala/net/wiringbits/spra/admin/AppRouter.scala +++ b/spra-play-server/src/main/scala/net/wiringbits/spra/admin/AppRouter.scala @@ -5,7 +5,7 @@ import net.wiringbits.spra.admin.utils.StringToDataTypesExt import net.wiringbits.spra.admin.utils.models.{FilterParameter, PaginationParameter, QueryParameters, SortParameter} import play.api.routing.Router.Routes import play.api.routing.SimpleRouter -import play.api.routing.sird._ +import play.api.routing.sird.* import javax.inject.Inject diff --git a/spra-play-server/src/main/scala/net/wiringbits/spra/admin/config/TableSettings.scala b/spra-play-server/src/main/scala/net/wiringbits/spra/admin/config/TableSettings.scala index b7596f7..ac9fa9f 100644 --- a/spra-play-server/src/main/scala/net/wiringbits/spra/admin/config/TableSettings.scala +++ b/spra-play-server/src/main/scala/net/wiringbits/spra/admin/config/TableSettings.scala @@ -45,7 +45,7 @@ case class TableSettings( object TableSettings { implicit val configLoader: ConfigLoader[TableSettings] = (config: Config, path: String) => { - import scala.jdk.CollectionConverters._ + import scala.jdk.CollectionConverters.* val newConfig = config.getConfig(path) def get[A](path: String): A = { @@ -97,16 +97,11 @@ object TableSettings { } } -sealed trait PrimaryKeyDataType extends Product with Serializable -object PrimaryKeyDataType { - final case object UUID extends PrimaryKeyDataType - final case object Serial extends PrimaryKeyDataType - final case object BigSerial extends PrimaryKeyDataType +enum PrimaryKeyDataType { + case UUID, Serial, BigSerial } -sealed trait CustomDataType extends Product with Serializable -object CustomDataType { - final case object BinaryImage extends CustomDataType +enum CustomDataType { // TODO: add support to binary files - final case object Binary extends CustomDataType + case BinaryImage, Binary } diff --git a/spra-play-server/src/main/scala/net/wiringbits/spra/admin/controllers/AdminController.scala b/spra-play-server/src/main/scala/net/wiringbits/spra/admin/controllers/AdminController.scala index 7df7c98..b2ebbbe 100644 --- a/spra-play-server/src/main/scala/net/wiringbits/spra/admin/controllers/AdminController.scala +++ b/spra-play-server/src/main/scala/net/wiringbits/spra/admin/controllers/AdminController.scala @@ -3,7 +3,7 @@ package net.wiringbits.spra.admin.controllers import net.wiringbits.spra.admin.config.DataExplorerConfig import net.wiringbits.spra.admin.services.AdminService import net.wiringbits.spra.admin.utils.models.QueryParameters -import net.wiringbits.spra.api.models._ +import net.wiringbits.spra.api.models.* import org.slf4j.LoggerFactory import play.api.libs.json.Json import play.api.mvc.{AbstractController, ControllerComponents} @@ -32,7 +32,8 @@ class AdminController @Inject() ( _ <- adminUser(request) _ = logger.info(s"Get metadata for $tableName, parameters: $queryParams") (response, contentRange) <- adminService.tableMetadata(tableName, queryParams) - } yield Ok(Json.toJson(response)) + // Json.toJson doesn't support a List[Map[_, _]] so we need to map to convert it to List[JsonValue] + } yield Ok(Json.toJson(response.map(Json.toJson(_)))) .withHeaders(("Access-Control-Expose-Headers", "Content-Range"), ("Content-Range", contentRange)) } @@ -49,7 +50,7 @@ class AdminController @Inject() ( _ <- adminUser(request) _ = logger.info(s"Get data from $tableName where primaryKeys = ${primaryKeyValues.mkString(",")}") response <- adminService.find(tableName, primaryKeyValues) - } yield Ok(Json.toJson(response)) + } yield Ok(Json.toJson(response.map(Json.toJson(_)))) } def create(tableName: String) = handleJsonBody[AdminCreateTable.Request] { request => diff --git a/spra-play-server/src/main/scala/net/wiringbits/spra/admin/controllers/package.scala b/spra-play-server/src/main/scala/net/wiringbits/spra/admin/controllers/package.scala index 65fb34d..a67865b 100644 --- a/spra-play-server/src/main/scala/net/wiringbits/spra/admin/controllers/package.scala +++ b/spra-play-server/src/main/scala/net/wiringbits/spra/admin/controllers/package.scala @@ -1,10 +1,10 @@ package net.wiringbits.spra.admin -import net.wiringbits.spra.api.models.ErrorResponse +import net.wiringbits.spra.api.models.{ErrorResponse, errorResponseFormat} import org.slf4j.LoggerFactory import play.api.libs.json.{JsValue, Json, Reads} +import play.api.mvc.* import play.api.mvc.Results.InternalServerError -import play.api.mvc._ import scala.concurrent.{ExecutionContext, Future} import scala.util.control.NonFatal diff --git a/spra-play-server/src/main/scala/net/wiringbits/spra/admin/repositories/daos/DatabaseTablesDAO.scala b/spra-play-server/src/main/scala/net/wiringbits/spra/admin/repositories/daos/DatabaseTablesDAO.scala index 175da01..94ad1d2 100644 --- a/spra-play-server/src/main/scala/net/wiringbits/spra/admin/repositories/daos/DatabaseTablesDAO.scala +++ b/spra-play-server/src/main/scala/net/wiringbits/spra/admin/repositories/daos/DatabaseTablesDAO.scala @@ -2,7 +2,7 @@ package net.wiringbits.spra.admin.repositories.daos import anorm.{SqlParser, SqlStringInterpolation} import net.wiringbits.spra.admin.config.{CustomDataType, PrimaryKeyDataType, TableSettings} -import net.wiringbits.spra.admin.repositories.models._ +import net.wiringbits.spra.admin.repositories.models.* import net.wiringbits.spra.admin.utils.models.{FilterParameter, QueryParameters} import net.wiringbits.spra.admin.utils.{QueryBuilder, StringRegex} diff --git a/spra-play-server/src/main/scala/net/wiringbits/spra/admin/repositories/daos/package.scala b/spra-play-server/src/main/scala/net/wiringbits/spra/admin/repositories/daos/package.scala index 6a1c6d7..691e958 100644 --- a/spra-play-server/src/main/scala/net/wiringbits/spra/admin/repositories/daos/package.scala +++ b/spra-play-server/src/main/scala/net/wiringbits/spra/admin/repositories/daos/package.scala @@ -1,6 +1,6 @@ package net.wiringbits.spra.admin.repositories -import anorm._ +import anorm.* import net.wiringbits.spra.admin.repositories.models.{DatabaseTable, ForeignKey, TableColumn} package object daos { diff --git a/spra-play-server/src/main/scala/net/wiringbits/spra/admin/services/AdminService.scala b/spra-play-server/src/main/scala/net/wiringbits/spra/admin/services/AdminService.scala index e953a58..c3cfdab 100644 --- a/spra-play-server/src/main/scala/net/wiringbits/spra/admin/services/AdminService.scala +++ b/spra-play-server/src/main/scala/net/wiringbits/spra/admin/services/AdminService.scala @@ -5,7 +5,7 @@ import net.wiringbits.spra.admin.repositories.DatabaseTablesRepository import net.wiringbits.spra.admin.repositories.models.{ForeignKey, TableData} import net.wiringbits.spra.admin.utils.models.QueryParameters import net.wiringbits.spra.admin.utils.{MapStringHideExt, contentRangeHeader} -import net.wiringbits.spra.api.models._ +import net.wiringbits.spra.api.models.* import java.awt.image.BufferedImage import java.io.{ByteArrayInputStream, File} diff --git a/spra-play-server/src/test/scala/controllers/AdminControllerSpec.scala b/spra-play-server/src/test/scala/controllers/AdminControllerSpec.scala index 6f01ddb..2a67426 100644 --- a/spra-play-server/src/test/scala/controllers/AdminControllerSpec.scala +++ b/spra-play-server/src/test/scala/controllers/AdminControllerSpec.scala @@ -311,7 +311,7 @@ class AdminControllerSpec extends PlayPostgresSpec { val nameLength = 7 Range.apply(0, createdUsers).foreach { i => val letter = Character.valueOf(('A' + i).toChar) - val name = StringUtils.repeat(letter, nameLength); + val name = StringUtils.repeat(letter, nameLength) val data = Map("name" -> name, "email" -> s"test@wiringbits$i.net", "password" -> "wiringbits") val request = AdminCreateTable.Request(data) client.createItem(usersSettings.tableName, request).futureValue diff --git a/spra-play-server/src/test/scala/controllers/common/PlayAPISpec.scala b/spra-play-server/src/test/scala/controllers/common/PlayAPISpec.scala index 441d2e5..9a10a89 100644 --- a/spra-play-server/src/test/scala/controllers/common/PlayAPISpec.scala +++ b/spra-play-server/src/test/scala/controllers/common/PlayAPISpec.scala @@ -6,7 +6,7 @@ import org.slf4j.LoggerFactory import play.api.inject.guice.GuiceApplicationBuilder import play.api.mvc.Result import play.api.test.FakeRequest -import play.api.test.Helpers._ +import play.api.test.Helpers.* import play.api.{Application, Mode} import java.net.URLEncoder diff --git a/spra-play-server/src/test/scala/controllers/common/PlayPostgresSpec.scala b/spra-play-server/src/test/scala/controllers/common/PlayPostgresSpec.scala index 3e7a97f..16083dd 100644 --- a/spra-play-server/src/test/scala/controllers/common/PlayPostgresSpec.scala +++ b/spra-play-server/src/test/scala/controllers/common/PlayPostgresSpec.scala @@ -9,6 +9,7 @@ import org.scalatestplus.play.guice.GuiceOneServerPerTest import org.testcontainers.utility.DockerImageName import play.api.inject.guice.GuiceApplicationBuilder import play.api.{Application, Configuration, Environment, Mode} +import sttp.client3.SttpBackend import scala.concurrent.{ExecutionContext, Future} import scala.util.control.NonFatal @@ -47,7 +48,7 @@ trait PlayPostgresSpec extends PlayAPISpec with TestContainerForEach with GuiceO def withApiClient[A](runTest: AdminDataExplorerApiClient => A): A = { import sttp.client3.asynchttpclient.future.AsyncHttpClientFutureBackend - implicit val sttpBackend = AsyncHttpClientFutureBackend() + implicit val sttpBackend: SttpBackend[Future, Any] = AsyncHttpClientFutureBackend() val config = AdminDataExplorerApiClient.Config(s"http://localhost:$port") val client = new AdminDataExplorerApiClient.DefaultImpl(config) diff --git a/spra-play-server/src/test/scala/net/wiringbits/spra/admin/QueryBuilderSpec.scala b/spra-play-server/src/test/scala/net/wiringbits/spra/admin/QueryBuilderSpec.scala index 64c0be0..718540b 100644 --- a/spra-play-server/src/test/scala/net/wiringbits/spra/admin/QueryBuilderSpec.scala +++ b/spra-play-server/src/test/scala/net/wiringbits/spra/admin/QueryBuilderSpec.scala @@ -2,7 +2,7 @@ package net.wiringbits.spra.admin import net.wiringbits.spra.admin.repositories.models.TableColumn import net.wiringbits.spra.admin.utils.QueryBuilder -import org.scalatest.matchers.must.Matchers.{be, convertToAnyMustWrapper} +import org.scalatest.matchers.must.Matchers.{be, must} import org.scalatest.wordspec.AnyWordSpec class QueryBuilderSpec extends AnyWordSpec { diff --git a/spra-play-server/src/test/scala/net/wiringbits/spra/admin/StringRegexSpec.scala b/spra-play-server/src/test/scala/net/wiringbits/spra/admin/StringRegexSpec.scala index a8334de..8078c67 100644 --- a/spra-play-server/src/test/scala/net/wiringbits/spra/admin/StringRegexSpec.scala +++ b/spra-play-server/src/test/scala/net/wiringbits/spra/admin/StringRegexSpec.scala @@ -1,7 +1,7 @@ package net.wiringbits.spra.admin import net.wiringbits.spra.admin.utils.StringRegex -import org.scalatest.matchers.must.Matchers.{be, convertToAnyMustWrapper} +import org.scalatest.matchers.must.Matchers.{be, must} import org.scalatest.wordspec.AnyWordSpec class StringRegexSpec extends AnyWordSpec { diff --git a/spra-play-server/src/test/scala/net/wiringbits/spra/admin/UtilsSpec.scala b/spra-play-server/src/test/scala/net/wiringbits/spra/admin/UtilsSpec.scala index d0fad12..4d7ec36 100644 --- a/spra-play-server/src/test/scala/net/wiringbits/spra/admin/UtilsSpec.scala +++ b/spra-play-server/src/test/scala/net/wiringbits/spra/admin/UtilsSpec.scala @@ -2,7 +2,7 @@ package net.wiringbits.spra.admin import net.wiringbits.spra.admin.utils.StringToDataTypesExt import org.scalatest.OptionValues.convertOptionToValuable -import org.scalatest.matchers.must.Matchers.{be, convertToAnyMustWrapper} +import org.scalatest.matchers.must.Matchers.{be, must} import org.scalatest.wordspec.AnyWordSpec class UtilsSpec extends AnyWordSpec { diff --git a/spra-play-server/src/test/scala/net/wiringbits/spra/admin/models/FilterParameterSpec.scala b/spra-play-server/src/test/scala/net/wiringbits/spra/admin/models/FilterParameterSpec.scala index b0eaf72..19b2183 100644 --- a/spra-play-server/src/test/scala/net/wiringbits/spra/admin/models/FilterParameterSpec.scala +++ b/spra-play-server/src/test/scala/net/wiringbits/spra/admin/models/FilterParameterSpec.scala @@ -1,7 +1,7 @@ package net.wiringbits.spra.admin.models import net.wiringbits.spra.admin.utils.models.FilterParameter -import org.scalatest.matchers.must.Matchers.{be, convertToAnyMustWrapper} +import org.scalatest.matchers.must.Matchers.{be, must} import org.scalatest.wordspec.AnyWordSpec class FilterParameterSpec extends AnyWordSpec { diff --git a/spra-play-server/src/test/scala/net/wiringbits/spra/admin/models/PaginationParameterSpec.scala b/spra-play-server/src/test/scala/net/wiringbits/spra/admin/models/PaginationParameterSpec.scala index c633ee1..28d505e 100644 --- a/spra-play-server/src/test/scala/net/wiringbits/spra/admin/models/PaginationParameterSpec.scala +++ b/spra-play-server/src/test/scala/net/wiringbits/spra/admin/models/PaginationParameterSpec.scala @@ -1,7 +1,7 @@ package net.wiringbits.spra.admin.models import net.wiringbits.spra.admin.utils.models.PaginationParameter -import org.scalatest.matchers.must.Matchers.{be, convertToAnyMustWrapper} +import org.scalatest.matchers.must.Matchers.{be, must} import org.scalatest.wordspec.AnyWordSpec import scala.util.Try diff --git a/spra-play-server/src/test/scala/net/wiringbits/spra/admin/models/SortParameterSpec.scala b/spra-play-server/src/test/scala/net/wiringbits/spra/admin/models/SortParameterSpec.scala index 6d4b932..ce16ba8 100644 --- a/spra-play-server/src/test/scala/net/wiringbits/spra/admin/models/SortParameterSpec.scala +++ b/spra-play-server/src/test/scala/net/wiringbits/spra/admin/models/SortParameterSpec.scala @@ -1,7 +1,7 @@ package net.wiringbits.spra.admin.models import net.wiringbits.spra.admin.utils.models.SortParameter -import org.scalatest.matchers.must.Matchers.{be, convertToAnyMustWrapper} +import org.scalatest.matchers.must.Matchers.{be, must} import org.scalatest.wordspec.AnyWordSpec class SortParameterSpec extends AnyWordSpec { diff --git a/spra-web/src/main/js/index.html b/spra-web/src/main/js/index.html index 57e40ca..b614b8c 100644 --- a/spra-web/src/main/js/index.html +++ b/spra-web/src/main/js/index.html @@ -20,9 +20,9 @@ You need to enable JavaScript to run this app.
- - - + + + diff --git a/spra-web/src/main/scala/net/wiringbits/spra/ui/web/API.scala b/spra-web/src/main/scala/net/wiringbits/spra/ui/web/API.scala index 958441e..2a3b1f1 100644 --- a/spra-web/src/main/scala/net/wiringbits/spra/ui/web/API.scala +++ b/spra-web/src/main/scala/net/wiringbits/spra/ui/web/API.scala @@ -2,6 +2,10 @@ package net.wiringbits.spra.ui.web import net.wiringbits.spra.api.AdminDataExplorerApiClient import org.scalajs.macrotaskexecutor.MacrotaskExecutor.Implicits.global +import sttp.capabilities +import sttp.client3.SttpBackend + +import scala.concurrent.Future case class API(client: AdminDataExplorerApiClient, url: String) @@ -13,7 +17,7 @@ object API { } def apply(): API = { - implicit val sttpBackend = sttp.client3.FetchBackend() + implicit val sttpBackend: SttpBackend[Future, capabilities.WebSockets] = sttp.client3.FetchBackend() val admin = new AdminDataExplorerApiClient.DefaultImpl(AdminDataExplorerApiClient.Config(apiUrl)) API(admin, apiUrl) } diff --git a/spra-web/src/main/scala/net/wiringbits/spra/ui/web/components/EditGuesser.scala b/spra-web/src/main/scala/net/wiringbits/spra/ui/web/components/EditGuesser.scala index dd10477..fa5c767 100644 --- a/spra-web/src/main/scala/net/wiringbits/spra/ui/web/components/EditGuesser.scala +++ b/spra-web/src/main/scala/net/wiringbits/spra/ui/web/components/EditGuesser.scala @@ -1,8 +1,8 @@ package net.wiringbits.spra.ui.web.components import net.wiringbits.spra.api.models.AdminGetTables +import net.wiringbits.spra.ui.web.facades.reactadmin.* import net.wiringbits.spra.ui.web.facades.reactadmin.ReactAdmin.useEditContext -import net.wiringbits.spra.ui.web.facades.reactadmin._ import net.wiringbits.spra.ui.web.models.{ButtonAction, ColumnType, DataExplorerSettings} import net.wiringbits.spra.ui.web.utils.ResponseGuesser import org.scalajs.dom diff --git a/spra-web/src/main/scala/net/wiringbits/spra/ui/web/components/ListGuesser.scala b/spra-web/src/main/scala/net/wiringbits/spra/ui/web/components/ListGuesser.scala index 7a2043e..b90ee11 100644 --- a/spra-web/src/main/scala/net/wiringbits/spra/ui/web/components/ListGuesser.scala +++ b/spra-web/src/main/scala/net/wiringbits/spra/ui/web/components/ListGuesser.scala @@ -1,7 +1,7 @@ package net.wiringbits.spra.ui.web.components import net.wiringbits.spra.api.models.AdminGetTables -import net.wiringbits.spra.ui.web.facades.reactadmin._ +import net.wiringbits.spra.ui.web.facades.reactadmin.* import net.wiringbits.spra.ui.web.models.ColumnType import net.wiringbits.spra.ui.web.models.ColumnType.{Date, Email, Image, Number, Text} import net.wiringbits.spra.ui.web.utils.ResponseGuesser