From 1c4cb72b209ab11c9e52c3bb490adf759f17fd0c Mon Sep 17 00:00:00 2001 From: lihaoyi Date: Sun, 23 Nov 2014 05:37:28 -0800 Subject: Added autowire section in client-server --- .../client/src/main/scala/simple/Client.scala | 2 +- .../server/src/main/scala/simple/Server.scala | 23 ++--- examples/crossBuilds/clientserver2/build.sbt | 37 +++++++ .../client/src/main/scala/simple/Client.scala | 47 +++++++++ .../crossBuilds/clientserver2/project/build.sbt | 5 + examples/crossBuilds/clientserver2/server/shared | 1 + .../server/src/main/scala/simple/Page.scala | 21 ++++ .../server/src/main/scala/simple/Server.scala | 51 ++++++++++ .../demos/src/main/scala/advanced/Futures.scala | 2 - .../src/main/scala/scrollmenu/Controller.scala | 110 +++++++++++---------- 10 files changed, 231 insertions(+), 68 deletions(-) create mode 100644 examples/crossBuilds/clientserver2/build.sbt create mode 100644 examples/crossBuilds/clientserver2/client/src/main/scala/simple/Client.scala create mode 100644 examples/crossBuilds/clientserver2/project/build.sbt create mode 120000 examples/crossBuilds/clientserver2/server/shared create mode 100644 examples/crossBuilds/clientserver2/server/src/main/scala/simple/Page.scala create mode 100644 examples/crossBuilds/clientserver2/server/src/main/scala/simple/Server.scala (limited to 'examples') diff --git a/examples/crossBuilds/clientserver/client/src/main/scala/simple/Client.scala b/examples/crossBuilds/clientserver/client/src/main/scala/simple/Client.scala index f066923..c008a87 100644 --- a/examples/crossBuilds/clientserver/client/src/main/scala/simple/Client.scala +++ b/examples/crossBuilds/clientserver/client/src/main/scala/simple/Client.scala @@ -13,7 +13,7 @@ object Client extends{ def main(container: dom.HTMLDivElement) = { val inputBox = input.render val outputBox = ul.render - def update() = Ajax.post("/ajax", inputBox.value).foreach{ xhr => + def update() = Ajax.post("/ajax/list", inputBox.value).foreach{ xhr => val data = upickle.read[Seq[FileData]](xhr.responseText) outputBox.innerHTML = "" for(FileData(name, size) <- data){ diff --git a/examples/crossBuilds/clientserver/server/src/main/scala/simple/Server.scala b/examples/crossBuilds/clientserver/server/src/main/scala/simple/Server.scala index c9cc526..4d1ece2 100644 --- a/examples/crossBuilds/clientserver/server/src/main/scala/simple/Server.scala +++ b/examples/crossBuilds/clientserver/server/src/main/scala/simple/Server.scala @@ -20,23 +20,24 @@ object Server extends SimpleRoutingApp{ getFromResourceDirectory("") } ~ post{ - path("ajax"){ + path("ajax" / "list"){ extract(_.request.entity.asString) { e => complete { - val (dir, last) = e.splitAt(e.lastIndexOf("/") + 1) - val files = - Option(new java.io.File("./" + dir).listFiles()) - .toSeq.flatten - upickle.write( - for{ - f <- files - if f.getName.startsWith(last) - } yield FileData(f.getName, f.length()) - ) + upickle.write(list(e)) } } } } } } + def list(path: String) = { + val (dir, last) = path.splitAt(path.lastIndexOf("/") + 1) + val files = + Option(new java.io.File("./" + dir).listFiles()) + .toSeq.flatten + for{ + f <- files + if f.getName.startsWith(last) + } yield FileData(f.getName, f.length()) + } } \ No newline at end of file diff --git a/examples/crossBuilds/clientserver2/build.sbt b/examples/crossBuilds/clientserver2/build.sbt new file mode 100644 index 0000000..c64a6fd --- /dev/null +++ b/examples/crossBuilds/clientserver2/build.sbt @@ -0,0 +1,37 @@ +import utest.jsrunner.JsCrossBuild +import scala.scalajs.sbtplugin.ScalaJSPlugin._ +import ScalaJSKeys._ +val sharedSettings = Seq( + unmanagedSourceDirectories in Compile += + baseDirectory.value / "shared" / "main" / "scala", + libraryDependencies ++= Seq( + "com.scalatags" %%% "scalatags" % "0.4.2", + "com.lihaoyi" %%% "upickle" % "0.2.5", + "com.lihaoyi" %%% "autowire" % "0.2.3" + ), + scalaVersion := "2.11.4" +) + +lazy val client = project.in(file("client")) + .settings(scalaJSSettings:_*) + .settings(sharedSettings:_*) + .settings( + libraryDependencies ++= Seq( + "org.scala-lang.modules.scalajs" %%% "scalajs-dom" % "0.6" + ) +) + +lazy val server = project.in(file("server")) + .settings(sharedSettings:_*) + .settings( + libraryDependencies ++= Seq( + "io.spray" %% "spray-can" % "1.3.2", + "io.spray" %% "spray-routing" % "1.3.2", + "com.typesafe.akka" %% "akka-actor" % "2.3.6" + ), + (resources in Compile) += { + (fastOptJS in (client, Compile)).value + (artifactPath in (client, Compile, fastOptJS)).value + } +) + diff --git a/examples/crossBuilds/clientserver2/client/src/main/scala/simple/Client.scala b/examples/crossBuilds/clientserver2/client/src/main/scala/simple/Client.scala new file mode 100644 index 0000000..f10eede --- /dev/null +++ b/examples/crossBuilds/clientserver2/client/src/main/scala/simple/Client.scala @@ -0,0 +1,47 @@ +//js/src/main/scala/simple/Platform.scala +package simple +import scalatags.JsDom.all._ +import org.scalajs.dom +import scala.scalajs.js.annotation.JSExport +import scalajs.concurrent.JSExecutionContext.Implicits.runNow +import autowire._ + +object Ajaxer extends autowire.Client[String, upickle.Reader, upickle.Writer]{ + override def doCall(req: Request) = { + dom.extensions.Ajax.post( + url = "/ajax/" + req.path.mkString("/"), + data = upickle.write(req.args) + ).map(_.responseText) + } + + def read[Result: upickle.Reader](p: String) = upickle.read[Result](p) + def write[Result: upickle.Writer](r: Result) = upickle.write(r) +} + +@JSExport +object Client extends{ + @JSExport + def main(container: dom.HTMLDivElement) = { + val inputBox = input.render + val outputBox = ul.render + def update() = Ajaxer[Api].list(inputBox.value).call().foreach{ data => + outputBox.innerHTML = "" + for(FileData(name, size) <- data){ + outputBox.appendChild( + li( + b(name), " - ", size, " bytes" + ).render + ) + } + } + inputBox.onkeyup = (e: dom.Event) => update() + update() + container.appendChild( + div( + h1("File Search"), + inputBox, + outputBox + ).render + ) + } +} \ No newline at end of file diff --git a/examples/crossBuilds/clientserver2/project/build.sbt b/examples/crossBuilds/clientserver2/project/build.sbt new file mode 100644 index 0000000..7c60a91 --- /dev/null +++ b/examples/crossBuilds/clientserver2/project/build.sbt @@ -0,0 +1,5 @@ +/*project/build.sbt*/ +addSbtPlugin("org.scala-lang.modules.scalajs" % "scalajs-sbt-plugin" % "0.5.5") + +addSbtPlugin("com.lihaoyi" % "utest-js-plugin" % "0.2.4") + diff --git a/examples/crossBuilds/clientserver2/server/shared b/examples/crossBuilds/clientserver2/server/shared new file mode 120000 index 0000000..f32be42 --- /dev/null +++ b/examples/crossBuilds/clientserver2/server/shared @@ -0,0 +1 @@ +../client/shared \ No newline at end of file diff --git a/examples/crossBuilds/clientserver2/server/src/main/scala/simple/Page.scala b/examples/crossBuilds/clientserver2/server/src/main/scala/simple/Page.scala new file mode 100644 index 0000000..ce6617c --- /dev/null +++ b/examples/crossBuilds/clientserver2/server/src/main/scala/simple/Page.scala @@ -0,0 +1,21 @@ +package simple +import scalatags.Text.all._ + +object Page{ + val boot = + "Client().main(document.getElementById('contents'))" + val skeleton = + html( + head( + script(src:="/client-fastopt.js"), + link( + rel:="stylesheet", + href:="http://yui.yahooapis.com/pure/0.5.0/pure-min.css" + ) + ), + body( + onload:=boot, + div(id:="contents") + ) + ) +} diff --git a/examples/crossBuilds/clientserver2/server/src/main/scala/simple/Server.scala b/examples/crossBuilds/clientserver2/server/src/main/scala/simple/Server.scala new file mode 100644 index 0000000..df5f877 --- /dev/null +++ b/examples/crossBuilds/clientserver2/server/src/main/scala/simple/Server.scala @@ -0,0 +1,51 @@ +package simple + +import akka.actor.ActorSystem +import spray.http.{HttpEntity, MediaTypes} +import spray.routing.SimpleRoutingApp +import scala.concurrent.ExecutionContext.Implicits.global + +object Router extends autowire.Server[String, upickle.Reader, upickle.Writer]{ + def read[Result: upickle.Reader](p: String) = upickle.read[Result](p) + def write[Result: upickle.Writer](r: Result) = upickle.write(r) +} + +object Server extends SimpleRoutingApp with Api{ + def main(args: Array[String]): Unit = { + implicit val system = ActorSystem() + startServer("localhost", port = 8080){ + get{ + pathSingleSlash{ + complete{ + HttpEntity( + MediaTypes.`text/html`, + Page.skeleton.render + ) + } + } ~ + getFromResourceDirectory("") + } ~ + post{ + path("ajax" / Segments){ s => + extract(_.request.entity.asString) { e => + complete { + Router.route[Api](Server)( + autowire.Core.Request(s, upickle.read[Map[String, String]](e)) + ) + } + } + } + } + } + } + def list(path: String) = { + val (dir, last) = path.splitAt(path.lastIndexOf("/") + 1) + val files = + Option(new java.io.File("./" + dir).listFiles()) + .toSeq.flatten + for{ + f <- files + if f.getName.startsWith(last) + } yield FileData(f.getName, f.length()) + } +} \ No newline at end of file diff --git a/examples/demos/src/main/scala/advanced/Futures.scala b/examples/demos/src/main/scala/advanced/Futures.scala index 6602c61..0d7107d 100644 --- a/examples/demos/src/main/scala/advanced/Futures.scala +++ b/examples/demos/src/main/scala/advanced/Futures.scala @@ -22,8 +22,6 @@ object Futures { } container.appendChild( div( - height:="200px", - overflow:="scroll", i("Press Enter in the box to fetch temperatures "), myInput, output diff --git a/examples/demos/src/main/scala/scrollmenu/Controller.scala b/examples/demos/src/main/scala/scrollmenu/Controller.scala index 119b8d4..cb0fc63 100644 --- a/examples/demos/src/main/scala/scrollmenu/Controller.scala +++ b/examples/demos/src/main/scala/scrollmenu/Controller.scala @@ -28,63 +28,65 @@ object Controller{ val snippets = dom.document.getElementsByClassName("highlight-me") snippets.foreach(js.Dynamic.global.hljs.highlightBlock(_)) - val scrollSpy = new ScrollSpy(structure, main) - val list = ul(cls:="menu-item-list collapsed")( - scrollSpy.domTrees.map(_.value.frag) - ).render - - def updateScroll() = scrollSpy(main.scrollTop + main.clientHeight) - val expandIcon = i(cls:="fa fa-caret-down").render - val expandLink = - a( - expandIcon, - href:="javascript:", - marginLeft:="0px", - paddingLeft:="15px", - paddingRight:="15px", - cls:="pure-menu-selected", - onclick := { (e: dom.Event) => - expandIcon.classList.toggle("fa-caret-down") - expandIcon.classList.toggle("fa-caret-up") - list.classList.toggle("collapsed") - scrollSpy.clean = !scrollSpy.clean - updateScroll() - } + def rest() = { + val scrollSpy = new ScrollSpy(structure, main) + val list = ul(cls := "menu-item-list collapsed")( + scrollSpy.domTrees.map(_.value.frag) ).render - - menu.appendChild( - div( - zIndex:=10, - position:="absolute", - cls:="pure-menu pure-menu-open", - ul(cls:="menu-item-list")( - li( - width:="43px", - float:="right", - expandLink + def updateScroll() = scrollSpy(main.scrollTop + main.clientHeight) + val expandIcon = i(cls := "fa fa-caret-down").render + val expandLink = + a( + expandIcon, + href := "javascript:", + marginLeft := "0px", + paddingLeft := "15px", + paddingRight := "15px", + cls := "pure-menu-selected", + onclick := { (e: dom.Event) => + expandIcon.classList.toggle("fa-caret-down") + expandIcon.classList.toggle("fa-caret-up") + list.classList.toggle("collapsed") + scrollSpy.clean = !scrollSpy.clean + updateScroll() + } + ).render + + + menu.appendChild( + div( + zIndex := 10, + position := "absolute", + cls := "pure-menu pure-menu-open", + ul(cls := "menu-item-list")( + li( + width := "43px", + float := "right", + expandLink + ) ) - ) - ).render - ) - - menu.appendChild( - div(cls:="pure-menu pure-menu-open")( - a(cls:="pure-menu-heading")( - "Contents" - ), - list - ).render - ) - - menuLink.onclick = (e: dom.MouseEvent) => { - layout.classList.toggle("active") - menu.classList.toggle("active") - menuLink.classList.toggle("active") + ).render + ) + + menu.appendChild( + div(cls := "pure-menu pure-menu-open")( + a(cls := "pure-menu-heading")( + "Contents" + ), + list + ).render + ) + + menuLink.onclick = (e: dom.MouseEvent) => { + layout.classList.toggle("active") + menu.classList.toggle("active") + menuLink.classList.toggle("active") + } + + main.onscroll = (e: dom.UIEvent) => updateScroll() + updateScroll() } - - main.onscroll = (e: dom.UIEvent) => updateScroll() - updateScroll() + dom.setTimeout(rest _, 10) } - } -- cgit v1.2.3