aboutsummaryrefslogtreecommitdiff
path: root/mavigator-cockpit/src/main/scala/mavigator/util
diff options
context:
space:
mode:
Diffstat (limited to 'mavigator-cockpit/src/main/scala/mavigator/util')
-rw-r--r--mavigator-cockpit/src/main/scala/mavigator/util/Application.scala12
-rw-r--r--mavigator-cockpit/src/main/scala/mavigator/util/Environment.scala15
-rw-r--r--mavigator-cockpit/src/main/scala/mavigator/util/Page.scala38
-rw-r--r--mavigator-cockpit/src/main/scala/mavigator/util/environment.scala24
4 files changed, 62 insertions, 27 deletions
diff --git a/mavigator-cockpit/src/main/scala/mavigator/util/Application.scala b/mavigator-cockpit/src/main/scala/mavigator/util/Application.scala
index 7cb6f27..68a39b1 100644
--- a/mavigator-cockpit/src/main/scala/mavigator/util/Application.scala
+++ b/mavigator-cockpit/src/main/scala/mavigator/util/Application.scala
@@ -4,6 +4,7 @@ package util
import scala.scalajs.js.annotation.JSExport
import scala.scalajs.js
+import org.scalajs.dom.console
import org.scalajs.dom.html
trait Application {
@@ -13,13 +14,18 @@ trait Application {
@JSExport
final def start(settings: js.Dynamic): Unit = {
- val env = new StaticEnvironment(
+ console.info("Initializing environment,,,")
+ val env = new Environment(
root = settings.root.asInstanceOf[html.Element],
- assetsBase = settings.assetsBase.asInstanceOf[String]
+ styleRoot = settings.styleRoot.asInstanceOf[html.Element],
+ baseUrl = settings.baseUrl.asInstanceOf[String]
)
- val args = settings.args.asInstanceOf[js.Dictionary[Any]].mapValues(_.toString).toMap
+ console.info("Reading arguments...")
+ val args: Map[String, String] =
+ settings.args.asInstanceOf[js.Dictionary[Any]].mapValues(_.toString).toMap
+ console.info("Entering main...")
main(args)(env)
}
diff --git a/mavigator-cockpit/src/main/scala/mavigator/util/Environment.scala b/mavigator-cockpit/src/main/scala/mavigator/util/Environment.scala
new file mode 100644
index 0000000..b1076fc
--- /dev/null
+++ b/mavigator-cockpit/src/main/scala/mavigator/util/Environment.scala
@@ -0,0 +1,15 @@
+package mavigator
+package util
+
+import org.scalajs.dom
+import org.scalajs.dom.html
+
+/** Represents an application's environment
+ * @param root The application's root element.
+ * @param styleRoot An html 'style' tag to which app-specific styles are appended.
+ * @param baseUrl Base URL. */
+case class Environment(
+ root: html.Element,
+ styleRoot: html.Element,
+ baseUrl: String
+)
diff --git a/mavigator-cockpit/src/main/scala/mavigator/util/Page.scala b/mavigator-cockpit/src/main/scala/mavigator/util/Page.scala
new file mode 100644
index 0000000..f8f0dee
--- /dev/null
+++ b/mavigator-cockpit/src/main/scala/mavigator/util/Page.scala
@@ -0,0 +1,38 @@
+package mavigator
+package util
+
+import org.scalajs.dom
+import org.scalajs.dom.html
+
+/** Contents of a single-page app, consisting of styles and a main element. */
+trait Page {
+
+ private var isAttached = false
+ private def attached[A](action: => A) = if (!isAttached) {
+ sys.error("Page has not been attached to an environment yet.")
+ } else {
+ action
+ }
+
+ private var baseUrl: String = null
+
+ def asset(path: String): String = attached { baseUrl + "/" + path }
+
+ def styles: Seq[String]
+
+ def elements: Seq[html.Element]
+
+ /** Attach this page to a website. */
+ def attach(env: Environment): Unit = {
+ baseUrl = env.baseUrl
+ isAttached = true
+
+ val styleText = dom.document.createTextNode(styles.reduce(_ + _))
+ env.styleRoot.appendChild(styleText)
+
+ for (elem <- elements) {
+ env.root.appendChild(elem)
+ }
+ }
+
+}
diff --git a/mavigator-cockpit/src/main/scala/mavigator/util/environment.scala b/mavigator-cockpit/src/main/scala/mavigator/util/environment.scala
deleted file mode 100644
index 3d58c5a..0000000
--- a/mavigator-cockpit/src/main/scala/mavigator/util/environment.scala
+++ /dev/null
@@ -1,24 +0,0 @@
-package mavigator
-package util
-
-import org.scalajs.dom.html
-
-/** Represents an application's environment */
-trait Environment {
-
- /** The application's root element. */
- def root: html.Element
-
- /** Retrieve an asset's URL based on its file location. */
- def asset(file: String): String
-
-}
-
-class StaticEnvironment(
- override val root: html.Element,
- assetsBase: String
-) extends Environment {
-
- override def asset(file: String): String = assetsBase + "/" + file
-
-}