summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorlihaoyi <haoyi.sg@gmail.com>2014-11-23 05:37:28 -0800
committerlihaoyi <haoyi.sg@gmail.com>2014-11-23 05:37:28 -0800
commit1c4cb72b209ab11c9e52c3bb490adf759f17fd0c (patch)
treefddc2a4f7b4848902b31aa4fa5c77023045f0166 /examples
parentbc640b3b440735a9343185856fdbec2ab064a369 (diff)
downloadhands-on-scala-js-1c4cb72b209ab11c9e52c3bb490adf759f17fd0c.tar.gz
hands-on-scala-js-1c4cb72b209ab11c9e52c3bb490adf759f17fd0c.tar.bz2
hands-on-scala-js-1c4cb72b209ab11c9e52c3bb490adf759f17fd0c.zip
Added autowire section in client-server
Diffstat (limited to 'examples')
-rw-r--r--examples/crossBuilds/clientserver/client/src/main/scala/simple/Client.scala2
-rw-r--r--examples/crossBuilds/clientserver/server/src/main/scala/simple/Server.scala23
-rw-r--r--examples/crossBuilds/clientserver2/build.sbt37
-rw-r--r--examples/crossBuilds/clientserver2/client/src/main/scala/simple/Client.scala47
-rw-r--r--examples/crossBuilds/clientserver2/project/build.sbt5
l---------examples/crossBuilds/clientserver2/server/shared1
-rw-r--r--examples/crossBuilds/clientserver2/server/src/main/scala/simple/Page.scala21
-rw-r--r--examples/crossBuilds/clientserver2/server/src/main/scala/simple/Server.scala51
-rw-r--r--examples/demos/src/main/scala/advanced/Futures.scala2
-rw-r--r--examples/demos/src/main/scala/scrollmenu/Controller.scala110
10 files changed, 231 insertions, 68 deletions
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)
}
-
}