diff --git a/src/main/scala/fahrtenbuch/Database.scala b/src/main/scala/fahrtenbuch/Database.scala index 81961a0..494c24e 100644 --- a/src/main/scala/fahrtenbuch/Database.scala +++ b/src/main/scala/fahrtenbuch/Database.scala @@ -14,8 +14,6 @@ import scala.scalajs.js import model.Entry import model.EntryId import rdts.base.Lattice -import rdts.datatypes.LastWriterWins -import scala.scalajs.js.Date import scala.util.Failure import scala.util.Success @@ -43,56 +41,27 @@ object DexieDB { .toFuture .map(_.toOption.map(NativeConverter[Entry].fromNative(_))) - def insertEntry(entry: Entry): Unit = { - val e: Future[Option[Entry]] = getEntry(entry.id) - e.flatMap { - case Some(oldEntry) => - println(s"found old: $oldEntry") - println(s"found new: $entry") - println(oldEntry.id == entry.id) - val newEntry = Lattice[Entry].merge(entry, entry) - val newEntry2 = Lattice[Entry].merge(oldEntry, oldEntry) - println(oldEntry.id) - println(entry.id) - val test = - Lattice[Entry].merge( - Entry( - EntryId("1"), - LastWriterWins.now(0), - LastWriterWins.now(2), - LastWriterWins.now(""), - LastWriterWins.now(false), - LastWriterWins.now("Dirk"), - LastWriterWins.now(new Date()) - ), - Entry( - EntryId("1"), - LastWriterWins.now(0), - LastWriterWins.now(2), - LastWriterWins.now(""), - LastWriterWins.now(false), - LastWriterWins.now("Dirk"), - LastWriterWins.now(new Date()) - ) - ) - val newEntry3 = - Lattice[Entry].merge(oldEntry, entry.copy(id = oldEntry.id)) - println("yolo") - Future.unit - // entriesTable.put(newEntry.toNative).toFuture - case _ => - entriesTable.put(entry.toNative).toFuture - }.onComplete { - case Failure(exception) => println(s"failed with $exception") - case Success(value) => () + /** Inserts an entry into the database and merges it with an existing entry if + * it exists. + * + * @param entry + * The entry to be inserted or updated. + */ + def upsertEntry(entry: Entry): Unit = { + for { + oldEntry <- getEntry(entry.id) + newEntry = oldEntry match + case Some(old) => + Lattice[Entry].merge(entry, old) + case _ => entry + result <- entriesTable.put(newEntry.toNative).toFuture + } yield { + result } -// .toFuture -// .map(e => -// if e.isUndefined then entriesTable.put(entry.toNative).toFuture -// else -// val dbEntry = NativeConverter[Entry].fromNative(e) -// Lattice[Entry].merge(entry, dbEntry) -// ) + }.onComplete { + case Failure(exception) => + println(s"Failed to write entry to db: $exception") + case Success(value) => () } def getAllEntries(): Future[Seq[Entry]] = { diff --git a/src/main/scala/fahrtenbuch/Main.scala b/src/main/scala/fahrtenbuch/Main.scala index 8a16503..5c2aead 100644 --- a/src/main/scala/fahrtenbuch/Main.scala +++ b/src/main/scala/fahrtenbuch/Main.scala @@ -25,7 +25,7 @@ object Main { // track changes to entries val entryEditBus = new EventBus[Entry] val entryDbObserver = - Observer[Entry](onNext = DexieDB.insertEntry(_)) + Observer[Entry](onNext = DexieDB.upsertEntry(_)) entryEditBus.stream.tapEach(_ => println("lalilu")) println("test") diff --git a/src/main/scala/fahrtenbuch/components/AppComponent.scala b/src/main/scala/fahrtenbuch/components/AppComponent.scala index ad32a10..7785497 100644 --- a/src/main/scala/fahrtenbuch/components/AppComponent.scala +++ b/src/main/scala/fahrtenbuch/components/AppComponent.scala @@ -23,7 +23,7 @@ class AppComponent( .combineWith(editStateSignal) .map { case (entries, editState) => entries.toList - .sortBy(_.date.payload.getTime()) + .sortBy(_.date.payload) .map(entry => EntryComponent( entry, diff --git a/src/main/scala/fahrtenbuch/components/EntryComponent.scala b/src/main/scala/fahrtenbuch/components/EntryComponent.scala index 8cc5421..7eb8a2b 100644 --- a/src/main/scala/fahrtenbuch/components/EntryComponent.scala +++ b/src/main/scala/fahrtenbuch/components/EntryComponent.scala @@ -5,6 +5,7 @@ import org.scalajs.dom.HTMLTableRowElement import com.raquo.laminar.api.L.* import com.raquo.laminar.api.features.unitArrows import scala.util.Try +import scala.scalajs.js.Date class EntryComponent( entry: Entry, @@ -110,7 +111,7 @@ class EntryComponent( ) else tr( - td(entry.date.payload.toISOString()), + td(new Date(entry.date.payload).toISOString()), td(entry.driver.payload), td(entry.startKm.payload), td(entry.endKm.payload), diff --git a/src/main/scala/fahrtenbuch/components/NewEntryInput.scala b/src/main/scala/fahrtenbuch/components/NewEntryInput.scala index 352f8cd..6d24bb7 100644 --- a/src/main/scala/fahrtenbuch/components/NewEntryInput.scala +++ b/src/main/scala/fahrtenbuch/components/NewEntryInput.scala @@ -7,7 +7,6 @@ import com.raquo.laminar.api.features.unitArrows import fahrtenbuch.Main.entryEditBus import fahrtenbuch.model.{Entry, EntryId} import rdts.datatypes.LastWriterWins -import scala.scalajs.js.Date import scala.util.Try class NewEntryInput(showNewEntryField: Var[Boolean]): @@ -82,9 +81,8 @@ class NewEntryInput(showNewEntryField: Var[Boolean]): val endKm = LastWriterWins.now(newEntryEndKm.ref.value.toDouble) val animal = LastWriterWins.now(newEntryAnimal.ref.value) val paid = LastWriterWins.now(newEntryPaid.ref.checked) - val date = LastWriterWins.now(new Date(Date.now())) entryEditBus.emit( - Entry(id, startKm, endKm, animal, paid, driver, date) + Entry(id, startKm, endKm, animal, paid, driver) ) showNewEntryField.set(false) newEntryDriver.ref.value = "" diff --git a/src/main/scala/fahrtenbuch/model/Entry.scala b/src/main/scala/fahrtenbuch/model/Entry.scala index 4d620a1..bec562e 100644 --- a/src/main/scala/fahrtenbuch/model/Entry.scala +++ b/src/main/scala/fahrtenbuch/model/Entry.scala @@ -31,7 +31,7 @@ case class Entry( animal: LastWriterWins[String], paid: LastWriterWins[Boolean], driver: LastWriterWins[String], - date: LastWriterWins[Date] + date: LastWriterWins[Double] ) derives NativeConverter: val distance = endKm.payload - startKm.payload @@ -42,3 +42,21 @@ case class Entry( object Entry: given Lattice[Entry] = Lattice.derived + + def apply( + id: EntryId, + startKm: LastWriterWins[Double], + endKm: LastWriterWins[Double], + animal: LastWriterWins[String], + paid: LastWriterWins[Boolean], + driver: LastWriterWins[String] + ): Entry = + Entry( + id, + startKm, + endKm, + animal, + paid, + driver, + LastWriterWins.now(Date.now()) + )