basic idb storage working
This commit is contained in:
parent
b32a3f7862
commit
f74a0aa4c1
7 changed files with 4470 additions and 133 deletions
19
build.sbt
19
build.sbt
|
|
@ -2,13 +2,27 @@ import org.scalajs.linker.interface.ModuleSplitStyle
|
||||||
|
|
||||||
lazy val fahrtenbuch = project
|
lazy val fahrtenbuch = project
|
||||||
.in(file("."))
|
.in(file("."))
|
||||||
.enablePlugins(ScalaJSPlugin) // Enable the Scala.js plugin in this project
|
.enablePlugins(
|
||||||
|
ScalaJSPlugin,
|
||||||
|
ScalablyTypedConverterExternalNpmPlugin
|
||||||
|
)
|
||||||
.settings(
|
.settings(
|
||||||
scalaVersion := "3.7.1",
|
scalaVersion := "3.7.1",
|
||||||
|
|
||||||
// Tell Scala.js that this is an application with a main method
|
// Tell Scala.js that this is an application with a main method
|
||||||
scalaJSUseMainModuleInitializer := true,
|
scalaJSUseMainModuleInitializer := true,
|
||||||
|
|
||||||
|
// scalably typed config
|
||||||
|
// Ignore several Trystero dependencies in ScalablyTyped to avoid `stImport` errors
|
||||||
|
stIgnore := List(
|
||||||
|
"libp2p",
|
||||||
|
"firebase",
|
||||||
|
"@supabase/supabase-js",
|
||||||
|
"@mdi/font",
|
||||||
|
"bulma"
|
||||||
|
),
|
||||||
|
externalNpm := baseDirectory.value,
|
||||||
|
|
||||||
/* Configure Scala.js to emit modules in the optimal way to
|
/* Configure Scala.js to emit modules in the optimal way to
|
||||||
* connect to Vite's incremental reload.
|
* connect to Vite's incremental reload.
|
||||||
* - emit ECMAScript modules
|
* - emit ECMAScript modules
|
||||||
|
|
@ -28,5 +42,6 @@ lazy val fahrtenbuch = project
|
||||||
*/
|
*/
|
||||||
libraryDependencies += "org.scala-js" %%% "scalajs-dom" % "2.8.0",
|
libraryDependencies += "org.scala-js" %%% "scalajs-dom" % "2.8.0",
|
||||||
libraryDependencies += "com.raquo" %%% "laminar" % "17.2.1",
|
libraryDependencies += "com.raquo" %%% "laminar" % "17.2.1",
|
||||||
libraryDependencies += "de.tu-darmstadt.stg" %%% "rdts" % "0.37.0"
|
libraryDependencies += "de.tu-darmstadt.stg" %%% "rdts" % "0.37.0",
|
||||||
|
libraryDependencies += "org.getshaka" %%% "native-converter" % "0.9.0"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
4506
package-lock.json
generated
4506
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -10,10 +10,13 @@
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@scala-js/vite-plugin-scalajs": "^1.0.0",
|
"@scala-js/vite-plugin-scalajs": "^1.0.0",
|
||||||
"vite": "^4.1.0"
|
"typescript": "^4.9.5",
|
||||||
|
"vite": "^6.2.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mdi/font": "^7.4.47",
|
"@mdi/font": "^7.4.47",
|
||||||
"bulma": "^1.0.4"
|
"bulma": "^1.0.4",
|
||||||
|
"dexie": "^4.0.10",
|
||||||
|
"trystero": "^0.21.0-beta.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1 +1,2 @@
|
||||||
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.19.0")
|
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.19.0")
|
||||||
|
addSbtPlugin("org.scalablytyped.converter" % "sbt-converter" % "1.0.0-beta44")
|
||||||
|
|
|
||||||
44
src/main/scala/fahrtenbuch/Database.scala
Normal file
44
src/main/scala/fahrtenbuch/Database.scala
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
package fahrtenbuch
|
||||||
|
|
||||||
|
import org.scalablytyped.runtime.StringDictionary
|
||||||
|
import typings.dexie.mod.Dexie
|
||||||
|
import scala.concurrent.Future
|
||||||
|
import typings.dexie.mod.{Table, liveQuery}
|
||||||
|
import scala.scalajs.js
|
||||||
|
import org.getshaka.nativeconverter.NativeConverter
|
||||||
|
import scala.concurrent.ExecutionContext.Implicits.global
|
||||||
|
import typings.dexie.mod.Observable
|
||||||
|
|
||||||
|
object DexieDB {
|
||||||
|
|
||||||
|
private val schemaVersion = 1.0
|
||||||
|
|
||||||
|
private val dexieDB: Dexie = new Dexie.^("fahrtenbuch")
|
||||||
|
dexieDB
|
||||||
|
.version(schemaVersion)
|
||||||
|
.stores(
|
||||||
|
StringDictionary(
|
||||||
|
("entries", "id")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
private val entriesTable: Table[js.Any, String, js.Any] =
|
||||||
|
dexieDB.table("entries")
|
||||||
|
val entriesObservable: Observable[Future[Seq[Entry]]] =
|
||||||
|
liveQuery(() => getAllEntries())
|
||||||
|
|
||||||
|
def insertEntry(entry: Entry): Future[Any] = {
|
||||||
|
println(s"inserting Entry $entry")
|
||||||
|
entriesTable.put(entry.toNative).toFuture
|
||||||
|
}
|
||||||
|
|
||||||
|
def getAllEntries(): Future[Seq[Entry]] = {
|
||||||
|
entriesTable.toArray().toFuture.map { entriesJsArray =>
|
||||||
|
entriesJsArray
|
||||||
|
.map(
|
||||||
|
NativeConverter[Entry].fromNative(_)
|
||||||
|
)
|
||||||
|
.toSeq
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -9,6 +9,10 @@ import com.raquo.laminar.nodes.ReactiveHtmlElement
|
||||||
import fahrtenbuch.Main.editClickBus
|
import fahrtenbuch.Main.editClickBus
|
||||||
import scala.annotation.threadUnsafe
|
import scala.annotation.threadUnsafe
|
||||||
import fahrtenbuch.Main.entryEditBus
|
import fahrtenbuch.Main.entryEditBus
|
||||||
|
import org.getshaka.nativeconverter.NativeConverter
|
||||||
|
import fahrtenbuch.Main.entryPrinter
|
||||||
|
import org.getshaka.nativeconverter.ParseState
|
||||||
|
import scala.scalajs.js
|
||||||
|
|
||||||
case class EntryComponent(
|
case class EntryComponent(
|
||||||
entry: Entry,
|
entry: Entry,
|
||||||
|
|
@ -49,6 +53,7 @@ case class EntryComponent(
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
entryEditBus.stream --> entryPrinter,
|
||||||
span(
|
span(
|
||||||
cls := "icon edit",
|
cls := "icon edit",
|
||||||
i(cls := "mdi mdi-18px mdi-check-bold")
|
i(cls := "mdi mdi-18px mdi-check-bold")
|
||||||
|
|
@ -84,10 +89,19 @@ case class Entry(
|
||||||
paid: Boolean,
|
paid: Boolean,
|
||||||
driver: String,
|
driver: String,
|
||||||
date: Option[Date] = None
|
date: Option[Date] = None
|
||||||
):
|
) derives NativeConverter:
|
||||||
val distance = endKm - startKm
|
val distance = endKm - startKm
|
||||||
|
|
||||||
// 13 cent pro km, 5 cent Abnutzung
|
// 13 cent pro km, 5 cent Abnutzung
|
||||||
def costGas: Double = distance * 0.13
|
def costGas: Double = distance * 0.13
|
||||||
def costWear: Double = distance * 0.05
|
def costWear: Double = distance * 0.05
|
||||||
def costTotal: Double = costGas + costWear
|
def costTotal: Double = costGas + costWear
|
||||||
|
|
||||||
|
object Entry:
|
||||||
|
given NativeConverter[Uid] with {
|
||||||
|
extension (a: Uid)
|
||||||
|
override def toNative: js.Any =
|
||||||
|
a.delegate
|
||||||
|
override def fromNative(ps: ParseState): Uid =
|
||||||
|
Uid.predefined(ps.json.asInstanceOf[String])
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,10 +32,20 @@ object Main {
|
||||||
|
|
||||||
// track changes to entries
|
// track changes to entries
|
||||||
val entryEditBus = new EventBus[Entry]
|
val entryEditBus = new EventBus[Entry]
|
||||||
|
val entryObserver =
|
||||||
|
Observer[Entry](onNext = DexieDB.insertEntry(_))
|
||||||
|
val entryPrinter =
|
||||||
|
Observer[Entry](onNext = entry => println(entry))
|
||||||
|
// entryEditBus --> entryObserver
|
||||||
|
// entryEditBus --> entryPrinter
|
||||||
|
entryEditBus.stream.tapEach(_ => println("lalilu"))
|
||||||
|
println("test")
|
||||||
|
|
||||||
val allEntries = entryEditBus.stream.foldLeft(Map.empty[Uid, Entry]) {
|
val allEntries = entryEditBus.stream.foldLeft(Map.empty[Uid, Entry]) {
|
||||||
case (acc, entry) =>
|
case (acc, entry) =>
|
||||||
acc + (entry.id -> entry)
|
acc + (entry.id -> entry)
|
||||||
}
|
}
|
||||||
|
entryEditBus.stream.addObserver(entryObserver)(using unsafeWindowOwner)
|
||||||
|
|
||||||
val entryComponents: Signal[List[EntryComponent]] =
|
val entryComponents: Signal[List[EntryComponent]] =
|
||||||
allEntries
|
allEntries
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue