diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index f020faa..4465cf6 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -11,6 +11,7 @@ import scala.scalajs.js.Date import com.raquo.waypoint.Router import com.raquo.waypoint.SplitRender +import cz.e_bs.cmi.mdr.pdb.app.services.DataFetcher @js.native @JSImport("stylesheets/main.css", JSImport.Namespace) @@ -41,7 +42,14 @@ def renderPage(using router: Router[Page]): HtmlElement = val pageSplitter = SplitRender[Page, HtmlElement](router.$currentPage) - .collectSignal[Page.Detail](pages.DetailPage) + .collectSignal[Page.Detail]( + pages.DetailPage( + new DataFetcher[String, Osoba] { + override def fetch(osobniCislo: String, o: Observer[Osoba]): Unit = + o.delay(1000).onNext(ExampleData.persons.jmeistrova) + } + ) + ) .collectStatic(Page.Dashboard)(pages.DashboardPage) .collectStatic(Page.Directory)(pages.DirectoryPage) components.MainSection(child <-- pageSplitter.$view) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index f020faa..4465cf6 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -11,6 +11,7 @@ import scala.scalajs.js.Date import com.raquo.waypoint.Router import com.raquo.waypoint.SplitRender +import cz.e_bs.cmi.mdr.pdb.app.services.DataFetcher @js.native @JSImport("stylesheets/main.css", JSImport.Namespace) @@ -41,7 +42,14 @@ def renderPage(using router: Router[Page]): HtmlElement = val pageSplitter = SplitRender[Page, HtmlElement](router.$currentPage) - .collectSignal[Page.Detail](pages.DetailPage) + .collectSignal[Page.Detail]( + pages.DetailPage( + new DataFetcher[String, Osoba] { + override def fetch(osobniCislo: String, o: Observer[Osoba]): Unit = + o.delay(1000).onNext(ExampleData.persons.jmeistrova) + } + ) + ) .collectStatic(Page.Dashboard)(pages.DashboardPage) .collectStatic(Page.Directory)(pages.DirectoryPage) components.MainSection(child <-- pageSplitter.$view) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/DetailPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/DetailPage.scala index 64a91a0..147e17b 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/DetailPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/DetailPage.scala @@ -6,10 +6,13 @@ import cz.e_bs.cmi.mdr.pdb.app.{Osoba, PracovniPomer, Funkce} import cz.e_bs.cmi.mdr.pdb.app.components.Avatar import cz.e_bs.cmi.mdr.pdb.app.Page +import cz.e_bs.cmi.mdr.pdb.app.services.DataFetcher val datetime = customHtmlAttr("datetime", StringAsIsCodec) -def DetailPage($page: Signal[Page.Detail]): HtmlElement = +def DetailPage(fetch: DataFetcher[String, Osoba])( + $page: Signal[Page.Detail] +): HtmlElement = // TODO: proper loader val loading = div( @@ -21,7 +24,12 @@ ) val data = Var[Option[Osoba]](None) val maybeOsobaSignal = data.signal.split(_ => ())((_, _, s) => OsobaView(s)) - div(child <-- maybeOsobaSignal.map(_.getOrElse(loading))) + div( + $page --> ((d: Page.Detail) => + fetch.fetch(d.osobniCislo, data.writer.contramapSome) + ), + child <-- maybeOsobaSignal.map(_.getOrElse(loading)) + ) def OsobaView($osoba: Signal[Osoba]): HtmlElement = def funkce($fce: Signal[Funkce]) = diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index f020faa..4465cf6 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -11,6 +11,7 @@ import scala.scalajs.js.Date import com.raquo.waypoint.Router import com.raquo.waypoint.SplitRender +import cz.e_bs.cmi.mdr.pdb.app.services.DataFetcher @js.native @JSImport("stylesheets/main.css", JSImport.Namespace) @@ -41,7 +42,14 @@ def renderPage(using router: Router[Page]): HtmlElement = val pageSplitter = SplitRender[Page, HtmlElement](router.$currentPage) - .collectSignal[Page.Detail](pages.DetailPage) + .collectSignal[Page.Detail]( + pages.DetailPage( + new DataFetcher[String, Osoba] { + override def fetch(osobniCislo: String, o: Observer[Osoba]): Unit = + o.delay(1000).onNext(ExampleData.persons.jmeistrova) + } + ) + ) .collectStatic(Page.Dashboard)(pages.DashboardPage) .collectStatic(Page.Directory)(pages.DirectoryPage) components.MainSection(child <-- pageSplitter.$view) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/DetailPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/DetailPage.scala index 64a91a0..147e17b 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/DetailPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/DetailPage.scala @@ -6,10 +6,13 @@ import cz.e_bs.cmi.mdr.pdb.app.{Osoba, PracovniPomer, Funkce} import cz.e_bs.cmi.mdr.pdb.app.components.Avatar import cz.e_bs.cmi.mdr.pdb.app.Page +import cz.e_bs.cmi.mdr.pdb.app.services.DataFetcher val datetime = customHtmlAttr("datetime", StringAsIsCodec) -def DetailPage($page: Signal[Page.Detail]): HtmlElement = +def DetailPage(fetch: DataFetcher[String, Osoba])( + $page: Signal[Page.Detail] +): HtmlElement = // TODO: proper loader val loading = div( @@ -21,7 +24,12 @@ ) val data = Var[Option[Osoba]](None) val maybeOsobaSignal = data.signal.split(_ => ())((_, _, s) => OsobaView(s)) - div(child <-- maybeOsobaSignal.map(_.getOrElse(loading))) + div( + $page --> ((d: Page.Detail) => + fetch.fetch(d.osobniCislo, data.writer.contramapSome) + ), + child <-- maybeOsobaSignal.map(_.getOrElse(loading)) + ) def OsobaView($osoba: Signal[Osoba]): HtmlElement = def funkce($fce: Signal[Funkce]) = diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/services/DataFetcher.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/services/DataFetcher.scala new file mode 100644 index 0000000..25f059f --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/services/DataFetcher.scala @@ -0,0 +1,6 @@ +package cz.e_bs.cmi.mdr.pdb.app.services + +import com.raquo.airstream.core.Observer + +trait DataFetcher[K, A]: + def fetch(id: K, sink: Observer[A]): Unit