From 885748729c944496dd102c86a19b2b1a09ed717c Mon Sep 17 00:00:00 2001 From: Tobias Schlatter Date: Thu, 12 Jun 2014 15:40:22 +0200 Subject: [PATCH 1/7] Step 1: Setup --- build.sbt | 5 +++++ project/build.properties | 1 + project/plugins.sbt | 1 + src/main/scala/tutorial/webapp/TutorialApp.scala | 9 +++++++++ 4 files changed, 16 insertions(+) create mode 100644 build.sbt create mode 100644 project/build.properties create mode 100644 project/plugins.sbt create mode 100644 src/main/scala/tutorial/webapp/TutorialApp.scala diff --git a/build.sbt b/build.sbt new file mode 100644 index 0000000..49c02e1 --- /dev/null +++ b/build.sbt @@ -0,0 +1,5 @@ +scalaJSSettings + +name := "Scala.js Tutorial" + +scalaVersion := "2.11.2" diff --git a/project/build.properties b/project/build.properties new file mode 100644 index 0000000..64abd37 --- /dev/null +++ b/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.13.6 diff --git a/project/plugins.sbt b/project/plugins.sbt new file mode 100644 index 0000000..65da4c3 --- /dev/null +++ b/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("org.scala-lang.modules.scalajs" % "scalajs-sbt-plugin" % "0.5.6") diff --git a/src/main/scala/tutorial/webapp/TutorialApp.scala b/src/main/scala/tutorial/webapp/TutorialApp.scala new file mode 100644 index 0000000..c2e5ea5 --- /dev/null +++ b/src/main/scala/tutorial/webapp/TutorialApp.scala @@ -0,0 +1,9 @@ +package tutorial.webapp + +import scala.scalajs.js.JSApp + +object TutorialApp extends JSApp { + def main(): Unit = { + println("Hello world!") + } +} From 8710a2065665860a226e032facc9dcaeabc97c12 Mon Sep 17 00:00:00 2001 From: Tobias Schlatter Date: Fri, 13 Jun 2014 08:58:35 +0200 Subject: [PATCH 2/7] Step 2: Integrating with HTML --- scalajs-tutorial-fastopt.html | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 scalajs-tutorial-fastopt.html diff --git a/scalajs-tutorial-fastopt.html b/scalajs-tutorial-fastopt.html new file mode 100644 index 0000000..c03f3d0 --- /dev/null +++ b/scalajs-tutorial-fastopt.html @@ -0,0 +1,15 @@ + + + + + Codestin Search App + + + + + + + + From 7cdcd0aea09f9c2971f61f458bed7b36afe4de8a Mon Sep 17 00:00:00 2001 From: Tobias Schlatter Date: Fri, 13 Jun 2014 10:42:28 +0200 Subject: [PATCH 3/7] Step 3: Using the DOM --- build.sbt | 2 ++ src/main/scala/tutorial/webapp/TutorialApp.scala | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 49c02e1..1c623ef 100644 --- a/build.sbt +++ b/build.sbt @@ -3,3 +3,5 @@ scalaJSSettings name := "Scala.js Tutorial" scalaVersion := "2.11.2" + +libraryDependencies += "org.scala-lang.modules.scalajs" %%% "scalajs-dom" % "0.6" diff --git a/src/main/scala/tutorial/webapp/TutorialApp.scala b/src/main/scala/tutorial/webapp/TutorialApp.scala index c2e5ea5..a7b909f 100644 --- a/src/main/scala/tutorial/webapp/TutorialApp.scala +++ b/src/main/scala/tutorial/webapp/TutorialApp.scala @@ -2,8 +2,18 @@ package tutorial.webapp import scala.scalajs.js.JSApp +import org.scalajs.dom +import dom.document + object TutorialApp extends JSApp { def main(): Unit = { - println("Hello world!") + appendPar(document.body, "Hello World") + } + + def appendPar(targetNode: dom.Node, text: String): Unit = { + val parNode = document.createElement("p") + val textNode = document.createTextNode(text) + parNode.appendChild(textNode) + targetNode.appendChild(parNode) } } From ecb7f440ad9056f8c1b23a8f807248dff53b2891 Mon Sep 17 00:00:00 2001 From: Tobias Schlatter Date: Fri, 13 Jun 2014 10:57:20 +0200 Subject: [PATCH 4/7] Step 4: Reacting on User Input --- scalajs-tutorial-fastopt.html | 4 ++++ src/main/scala/tutorial/webapp/TutorialApp.scala | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/scalajs-tutorial-fastopt.html b/scalajs-tutorial-fastopt.html index c03f3d0..4a581ad 100644 --- a/scalajs-tutorial-fastopt.html +++ b/scalajs-tutorial-fastopt.html @@ -5,6 +5,10 @@ Codestin Search App + + diff --git a/src/main/scala/tutorial/webapp/TutorialApp.scala b/src/main/scala/tutorial/webapp/TutorialApp.scala index a7b909f..d881bcb 100644 --- a/src/main/scala/tutorial/webapp/TutorialApp.scala +++ b/src/main/scala/tutorial/webapp/TutorialApp.scala @@ -1,6 +1,7 @@ package tutorial.webapp import scala.scalajs.js.JSApp +import scala.scalajs.js.annotation.JSExport import org.scalajs.dom import dom.document @@ -16,4 +17,9 @@ object TutorialApp extends JSApp { parNode.appendChild(textNode) targetNode.appendChild(parNode) } + + @JSExport + def addClickedMessage(): Unit = { + appendPar(document.body, "You clicked the button!") + } } From 8a545f3fd477307c8c9c1d115bd7df13c825f815 Mon Sep 17 00:00:00 2001 From: Tobias Schlatter Date: Fri, 13 Jun 2014 12:42:53 +0200 Subject: [PATCH 5/7] Step 5: Using jQuery --- build.sbt | 4 +++- scalajs-tutorial-fastopt.html | 6 +++--- .../scala/tutorial/webapp/TutorialApp.scala | 17 ++++++----------- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/build.sbt b/build.sbt index 1c623ef..4c7d25b 100644 --- a/build.sbt +++ b/build.sbt @@ -4,4 +4,6 @@ name := "Scala.js Tutorial" scalaVersion := "2.11.2" -libraryDependencies += "org.scala-lang.modules.scalajs" %%% "scalajs-dom" % "0.6" +libraryDependencies += "org.scala-lang.modules.scalajs" %%% "scalajs-jquery" % "0.6" + +skip in ScalaJSKeys.packageJSDependencies := false diff --git a/scalajs-tutorial-fastopt.html b/scalajs-tutorial-fastopt.html index 4a581ad..b1a27de 100644 --- a/scalajs-tutorial-fastopt.html +++ b/scalajs-tutorial-fastopt.html @@ -5,10 +5,10 @@ Codestin Search App - + + + diff --git a/src/main/scala/tutorial/webapp/TutorialApp.scala b/src/main/scala/tutorial/webapp/TutorialApp.scala index d881bcb..15c89fc 100644 --- a/src/main/scala/tutorial/webapp/TutorialApp.scala +++ b/src/main/scala/tutorial/webapp/TutorialApp.scala @@ -1,25 +1,20 @@ package tutorial.webapp import scala.scalajs.js.JSApp -import scala.scalajs.js.annotation.JSExport -import org.scalajs.dom -import dom.document +import org.scalajs.jquery.jQuery object TutorialApp extends JSApp { def main(): Unit = { - appendPar(document.body, "Hello World") + jQuery(setupUI _) } - def appendPar(targetNode: dom.Node, text: String): Unit = { - val parNode = document.createElement("p") - val textNode = document.createTextNode(text) - parNode.appendChild(textNode) - targetNode.appendChild(parNode) + def setupUI(): Unit = { + jQuery("body").append("

Hello World

") + jQuery("#click-me-button").click(addClickedMessage _) } - @JSExport def addClickedMessage(): Unit = { - appendPar(document.body, "You clicked the button!") + jQuery("body").append("

You clicked the button!

") } } From e12351a61b44fb606a36c1c40df24659b1109ff6 Mon Sep 17 00:00:00 2001 From: Tobias Schlatter Date: Sat, 14 Jun 2014 16:18:27 +0200 Subject: [PATCH 6/7] Step 6: Testing --- build.sbt | 9 ++++++ project/plugins.sbt | 2 ++ scalajs-tutorial-fastopt.html | 2 -- .../scala/tutorial/webapp/TutorialApp.scala | 4 ++- .../scala/tutorial/webapp/TutorialTest.scala | 31 +++++++++++++++++++ 5 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 src/test/scala/tutorial/webapp/TutorialTest.scala diff --git a/build.sbt b/build.sbt index 4c7d25b..f6d614c 100644 --- a/build.sbt +++ b/build.sbt @@ -6,4 +6,13 @@ scalaVersion := "2.11.2" libraryDependencies += "org.scala-lang.modules.scalajs" %%% "scalajs-jquery" % "0.6" +ScalaJSKeys.jsDependencies += scala.scalajs.sbtplugin.RuntimeDOM + skip in ScalaJSKeys.packageJSDependencies := false + +// uTest settings +utest.jsrunner.Plugin.utestJsSettings + +ScalaJSKeys.persistLauncher in Compile := true + +ScalaJSKeys.persistLauncher in Test := false diff --git a/project/plugins.sbt b/project/plugins.sbt index 65da4c3..0e893f0 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1 +1,3 @@ addSbtPlugin("org.scala-lang.modules.scalajs" % "scalajs-sbt-plugin" % "0.5.6") + +addSbtPlugin("com.lihaoyi" % "utest-js-plugin" % "0.2.3") diff --git a/scalajs-tutorial-fastopt.html b/scalajs-tutorial-fastopt.html index b1a27de..5bd2a87 100644 --- a/scalajs-tutorial-fastopt.html +++ b/scalajs-tutorial-fastopt.html @@ -5,8 +5,6 @@ Codestin Search App - - diff --git a/src/main/scala/tutorial/webapp/TutorialApp.scala b/src/main/scala/tutorial/webapp/TutorialApp.scala index 15c89fc..ace4e3b 100644 --- a/src/main/scala/tutorial/webapp/TutorialApp.scala +++ b/src/main/scala/tutorial/webapp/TutorialApp.scala @@ -10,8 +10,10 @@ object TutorialApp extends JSApp { } def setupUI(): Unit = { + jQuery("""""") + .click(addClickedMessage _) + .appendTo(jQuery("body")) jQuery("body").append("

Hello World

") - jQuery("#click-me-button").click(addClickedMessage _) } def addClickedMessage(): Unit = { diff --git a/src/test/scala/tutorial/webapp/TutorialTest.scala b/src/test/scala/tutorial/webapp/TutorialTest.scala new file mode 100644 index 0000000..475b0f1 --- /dev/null +++ b/src/test/scala/tutorial/webapp/TutorialTest.scala @@ -0,0 +1,31 @@ +package tutorial.webapp + +import utest._ + +import org.scalajs.jquery.jQuery + +object TutorialTest extends TestSuite { + + // Initialize App + TutorialApp.setupUI() + + def tests = TestSuite { + 'HelloWorld { + assert(jQuery("p:contains('Hello World')").length == 1) + } + + 'ButtonClick { + def messageCount = + jQuery("p:contains('You clicked the button!')").length + + val button = jQuery("button:contains('Click me!')") + assert(button.length == 1) + assert(messageCount == 0) + + for (c <- 1 to 5) { + button.click() + assert(messageCount == c) + } + } + } +} From 1bf954fa23f87b5cfff6bf51e86b6b72be49c5a0 Mon Sep 17 00:00:00 2001 From: Tobias Schlatter Date: Fri, 13 Jun 2014 17:00:28 +0200 Subject: [PATCH 7/7] Step 7: Optimizing for Production --- scalajs-tutorial-fastopt.html | 6 ++---- scalajs-tutorial.html | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 scalajs-tutorial.html diff --git a/scalajs-tutorial-fastopt.html b/scalajs-tutorial-fastopt.html index 5bd2a87..0cef602 100644 --- a/scalajs-tutorial-fastopt.html +++ b/scalajs-tutorial-fastopt.html @@ -9,9 +9,7 @@ - - + + diff --git a/scalajs-tutorial.html b/scalajs-tutorial.html new file mode 100644 index 0000000..b6bafe4 --- /dev/null +++ b/scalajs-tutorial.html @@ -0,0 +1,15 @@ + + + + + Codestin Search App + + + + + + + + + +