diff --git a/client/src/main/scala/spatutorial/client/SPAMain.scala b/client/src/main/scala/spatutorial/client/SPAMain.scala index 10d0d14..2fa777e 100644 --- a/client/src/main/scala/spatutorial/client/SPAMain.scala +++ b/client/src/main/scala/spatutorial/client/SPAMain.scala @@ -24,13 +24,17 @@ object SPAMain extends js.JSApp { case object TodoLoc extends Loc + case object LocationsLoc extends Loc + // configure the router val routerConfig = RouterConfigDsl[Loc].buildConfig { dsl => import dsl._ // wrap/connect components to the circuit - (staticRoute(root, DashboardLoc) ~> renderR(ctl => SPACircuit.wrap(_.motd)(proxy => Dashboard(ctl, proxy))) + (emptyRule + | staticRoute(root, DashboardLoc) ~> renderR(ctl => SPACircuit.wrap(_.motd)(proxy => Dashboard(ctl, proxy))) | staticRoute("#todo", TodoLoc) ~> renderR(ctl => SPACircuit.connect(_.todos)(Todo(_))) + | staticRoute("#locations", LocationsLoc) ~> renderR(ctl => Locations()) ).notFound(redirectToPage(DashboardLoc)(Redirect.Replace)) }.renderWith(layout) @@ -48,7 +52,7 @@ object SPAMain extends js.JSApp { ) ), // currently active module is shown in this container - <.div(^.className := "container", r.render()) + <.div(^.className := "container-fluid", r.render()) ) } diff --git a/client/src/main/scala/spatutorial/client/components/Chart.scala b/client/src/main/scala/spatutorial/client/components/Chart.scala index e796383..4c5b9af 100644 --- a/client/src/main/scala/spatutorial/client/components/Chart.scala +++ b/client/src/main/scala/spatutorial/client/components/Chart.scala @@ -3,80 +3,7 @@ package spatutorial.client.components import japgolly.scalajs.react.vdom.prefix_<^._ import japgolly.scalajs.react.{Callback, ReactComponentB} import org.scalajs.dom.raw.HTMLCanvasElement - -import scala.scalajs.js -import scala.scalajs.js.JSConverters._ -import scala.scalajs.js.annotation.JSName - -@js.native -trait ChartDataset extends js.Object { - def label: String = js.native - def data: js.Array[Double] = js.native - def fillColor: String = js.native - def strokeColor: String = js.native -} - -object ChartDataset { - def apply(data: Seq[Double], - label: String, backgroundColor: String = "#8080FF", borderColor: String = "#404080"): ChartDataset = { - js.Dynamic.literal( - label = label, - data = data.toJSArray, - backgroundColor = backgroundColor, - borderColor = borderColor - ).asInstanceOf[ChartDataset] - } -} - -@js.native -trait ChartData extends js.Object { - def labels: js.Array[String] = js.native - def datasets: js.Array[ChartDataset] = js.native -} - -object ChartData { - def apply(labels: Seq[String], datasets: Seq[ChartDataset]): ChartData = { - js.Dynamic.literal( - labels = labels.toJSArray, - datasets = datasets.toJSArray - ).asInstanceOf[ChartData] - } -} - -@js.native -trait ChartOptions extends js.Object { - def responsive: Boolean = js.native -} - -object ChartOptions { - def apply(responsive: Boolean = true): ChartOptions = { - js.Dynamic.literal( - responsive = responsive - ).asInstanceOf[ChartOptions] - } -} - -@js.native -trait ChartConfiguration extends js.Object { - def `type`: String = js.native - def data: ChartData = js.native - def options: ChartOptions = js.native -} - -object ChartConfiguration { - def apply(`type`: String, data: ChartData, options: ChartOptions = ChartOptions(true)): ChartConfiguration = { - js.Dynamic.literal( - `type` = `type`, - data = data, - options = options - ).asInstanceOf[ChartConfiguration] - } -} - -// define a class to access the Chart.js component -@js.native -@JSName("Chart") -class JSChart(ctx: js.Dynamic, config: ChartConfiguration) extends js.Object +import spatutorial.client.components.chart.{Chart, ChartConfiguration, ChartData} object Chart { @@ -87,11 +14,17 @@ object Chart { case object BarChart extends ChartStyle - case class ChartProps(name: String, style: ChartStyle, data: ChartData, width: Int = 400, height: Int = 200) + case class ChartProps(name: String, + style: ChartStyle, + data: ChartData, + width: Int = 500, + height: Int = 300) val Chart = ReactComponentB[ChartProps]("Chart") .render_P(p => - <.canvas(^.width := s"${p.width}px", ^.height := s"${p.height}px") + <.canvas( + ^.width := s"${p.width}px", + ^.height := s"${p.height}px") ) .domType[HTMLCanvasElement] .componentDidMount(scope => Callback { @@ -99,8 +32,8 @@ object Chart { val ctx = scope.getDOMNode().getContext("2d") // create the actual chart using the 3rd party component scope.props.style match { - case LineChart => new JSChart(ctx, ChartConfiguration("line", scope.props.data)) - case BarChart => new JSChart(ctx, ChartConfiguration("bar", scope.props.data)) + case LineChart => new Chart(ctx, ChartConfiguration("line", scope.props.data)) + case BarChart => new Chart(ctx, ChartConfiguration("bar", scope.props.data)) case _ => throw new IllegalArgumentException } }).build diff --git a/client/src/main/scala/spatutorial/client/components/GlobalStyles.scala b/client/src/main/scala/spatutorial/client/components/GlobalStyles.scala index 6b0359d..7d8170f 100644 --- a/client/src/main/scala/spatutorial/client/components/GlobalStyles.scala +++ b/client/src/main/scala/spatutorial/client/components/GlobalStyles.scala @@ -1,13 +1,27 @@ package spatutorial.client.components import scalacss.Defaults._ +import scalacss.Dsl object GlobalStyles extends StyleSheet.Inline { - import dsl._ + + import Dsl._ + + val navbarHeight = 50 style(unsafeRoot("body")( paddingTop(70.px)) ) + // full-screen map + style(unsafeRoot("#map")( + marginTop(-20.px), + marginLeft(-15.px), + marginRight(-15.px) + )) + val bootstrapStyles = new BootstrapStyles + + val chart = style(width(500.px), height(300.px)) + } diff --git a/client/src/main/scala/spatutorial/client/components/LeafletMap.scala b/client/src/main/scala/spatutorial/client/components/LeafletMap.scala new file mode 100644 index 0000000..9688495 --- /dev/null +++ b/client/src/main/scala/spatutorial/client/components/LeafletMap.scala @@ -0,0 +1,42 @@ +package spatutorial.client.components + +import japgolly.scalajs.react.vdom.prefix_<^._ +import japgolly.scalajs.react.{Callback, ReactComponentB} +import org.scalajs.dom +import org.scalajs.dom.raw.HTMLDivElement +import spatutorial.client.components.map._ + +object LeafletMap { + + case class MapProps(name: String) + + private def demoTileLayer = Leaflet.tileLayer("https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpandmbXliNDBjZWd2M2x6bDk3c2ZtOTkifQ._QA7i5Mpkd_m30IGElHziw", TileLayerOptions( + maxZoom = 18, + attribution = + """Map data © OpenStreetMap contributors, + |CC-BY-SA, + |Imagery © Mapbox + """.stripMargin, + id = "mapbox.streets" + )) + + val LeafletMap = ReactComponentB[MapProps]("Map") + .render_P(p => + <.div(^.id := "map", ^.height := mapHeight) + ) + .domType[HTMLDivElement] + .componentDidMount(scope => Callback { + val id = scope.getDOMNode().getAttribute("id") + val map = Leaflet.map(id) + DefaultIcon.imagePath = "assets/lib/leaflet/images" + map.setView(new LatLng(51.505, -0.09), 13) + val marker = Leaflet.marker(new LatLng(51.505, -0.09), MarkerOptions(new DefaultIcon())).addTo(map) + marker.bindPopup("Hi, I am a Popup!").openPopup() + demoTileLayer.addTo(map) + }) + .build + + private def mapHeight: String = s"${dom.window.innerHeight - GlobalStyles.navbarHeight}px" + + def apply(props: MapProps) = LeafletMap(props) +} diff --git a/client/src/main/scala/spatutorial/client/components/chart/Chart.scala b/client/src/main/scala/spatutorial/client/components/chart/Chart.scala new file mode 100644 index 0000000..6299020 --- /dev/null +++ b/client/src/main/scala/spatutorial/client/components/chart/Chart.scala @@ -0,0 +1,8 @@ +package spatutorial.client.components.chart + +import scala.scalajs.js +import scala.scalajs.js.annotation.JSName + +@js.native +@JSName("Chart") +class Chart(ctx: js.Dynamic, config: ChartConfiguration) extends js.Object diff --git a/client/src/main/scala/spatutorial/client/components/chart/ChartConfiguration.scala b/client/src/main/scala/spatutorial/client/components/chart/ChartConfiguration.scala new file mode 100644 index 0000000..0414f96 --- /dev/null +++ b/client/src/main/scala/spatutorial/client/components/chart/ChartConfiguration.scala @@ -0,0 +1,27 @@ +package spatutorial.client.components.chart + +import scala.scalajs.js + +@js.native +trait ChartConfiguration extends js.Object { + def `type`: String = js.native + + def data: ChartData = js.native + + def options: ChartOptions = js.native +} + +object ChartConfiguration { + def apply(`type`: String, + data: ChartData, + options: ChartOptions = ChartOptions( + responsive = true, + maintainAspectRatio = false + )): ChartConfiguration = { + js.Dynamic.literal( + `type` = `type`, + data = data, + options = options + ).asInstanceOf[ChartConfiguration] + } +} diff --git a/client/src/main/scala/spatutorial/client/components/chart/ChartData.scala b/client/src/main/scala/spatutorial/client/components/chart/ChartData.scala new file mode 100644 index 0000000..7c746c1 --- /dev/null +++ b/client/src/main/scala/spatutorial/client/components/chart/ChartData.scala @@ -0,0 +1,21 @@ +package spatutorial.client.components.chart + +import scala.scalajs.js +import scala.scalajs.js.JSConverters._ + + +@js.native +trait ChartData extends js.Object { + def labels: js.Array[String] = js.native + + def datasets: js.Array[ChartDataset] = js.native +} + +object ChartData { + def apply(labels: Seq[String], datasets: Seq[ChartDataset]): ChartData = { + js.Dynamic.literal( + labels = labels.toJSArray, + datasets = datasets.toJSArray + ).asInstanceOf[ChartData] + } +} \ No newline at end of file diff --git a/client/src/main/scala/spatutorial/client/components/chart/ChartDataset.scala b/client/src/main/scala/spatutorial/client/components/chart/ChartDataset.scala new file mode 100644 index 0000000..5c98877 --- /dev/null +++ b/client/src/main/scala/spatutorial/client/components/chart/ChartDataset.scala @@ -0,0 +1,31 @@ +package spatutorial.client.components.chart + +import scala.scalajs.js +import scala.scalajs.js.JSConverters._ + +@js.native +trait ChartDataset extends js.Object { + def label: String = js.native + + def data: js.Array[Double] = js.native + + def fillColor: String = js.native + + def strokeColor: String = js.native +} + +object ChartDataset { + def apply(data: Seq[Double], + label: String, + backgroundColor: String = "#8080FF", + borderColor: String = "#404080", + hoverBackgroundColor: String = "#8080FF"): ChartDataset = { + js.Dynamic.literal( + label = label, + data = data.toJSArray, + backgroundColor = backgroundColor, + borderColor = borderColor, + hoverBackgroundColor = hoverBackgroundColor + ).asInstanceOf[ChartDataset] + } +} \ No newline at end of file diff --git a/client/src/main/scala/spatutorial/client/components/chart/ChartOptions.scala b/client/src/main/scala/spatutorial/client/components/chart/ChartOptions.scala new file mode 100644 index 0000000..80b81e7 --- /dev/null +++ b/client/src/main/scala/spatutorial/client/components/chart/ChartOptions.scala @@ -0,0 +1,17 @@ +package spatutorial.client.components.chart + +import scala.scalajs.js + +@js.native +trait ChartOptions extends js.Object { + def responsive: Boolean = js.native +} + +object ChartOptions { + def apply(responsive: Boolean = true, maintainAspectRatio: Boolean = false): ChartOptions = { + js.Dynamic.literal( + responsive = responsive, + maintainAspectRatio = maintainAspectRatio + ).asInstanceOf[ChartOptions] + } +} diff --git a/client/src/main/scala/spatutorial/client/components/map/Icon.scala b/client/src/main/scala/spatutorial/client/components/map/Icon.scala new file mode 100644 index 0000000..4e6afa2 --- /dev/null +++ b/client/src/main/scala/spatutorial/client/components/map/Icon.scala @@ -0,0 +1,51 @@ +package spatutorial.client.components.map + +import scala.scalajs.js +import scala.scalajs.js.annotation.JSName + +@js.native +trait IconOptions extends js.Object + +object IconOptions { + def apply(iconUrl: String, + iconRetinaUrl: String, + iconSize: Point, + iconAnchor: Point, + popupAnchor: Point, + shadowUrl: String, + shadowRetinaUrl: String, + shadowSize: Point, + shadowAnchor: Point, + className: String = ""): IconOptions = { + js.Dynamic.literal( + iconUrl = iconUrl, + iconRetinaUrl = iconRetinaUrl, + iconSize = iconSize, + iconAnchor = iconAnchor, + popupAnchor = popupAnchor, + shadowUrl = shadowUrl, + shadowRetinaUrl = shadowRetinaUrl, + shadowSize = shadowSize, + shadowAnchor = shadowAnchor, + className = className + ).asInstanceOf[IconOptions] + } +} + +@js.native +trait Icon extends js.Object { +} + +@js.native +@JSName("L.Icon") +object Icon extends js.Object + +@js.native +@JSName("L.Icon.Default") +class DefaultIcon extends Icon + +@js.native +@JSName("L.Icon.Default") +object DefaultIcon extends js.Object { + var imagePath: String = js.native +} diff --git a/client/src/main/scala/spatutorial/client/components/map/LatLng.scala b/client/src/main/scala/spatutorial/client/components/map/LatLng.scala new file mode 100644 index 0000000..0a7613f --- /dev/null +++ b/client/src/main/scala/spatutorial/client/components/map/LatLng.scala @@ -0,0 +1,9 @@ +package spatutorial.client.components.map + +import scala.scalajs.js +import scala.scalajs.js.annotation.JSName + + +@js.native +@JSName("L.LatLng") +class LatLng(lat: Double, lng: Double) extends js.Object \ No newline at end of file diff --git a/client/src/main/scala/spatutorial/client/components/map/Leaflet.scala b/client/src/main/scala/spatutorial/client/components/map/Leaflet.scala new file mode 100644 index 0000000..95e0e4a --- /dev/null +++ b/client/src/main/scala/spatutorial/client/components/map/Leaflet.scala @@ -0,0 +1,21 @@ +package spatutorial.client.components.map + +import scala.scalajs.js +import scala.scalajs.js.annotation.JSName + +@js.native +@JSName("L") +object Leaflet extends js.Object { + def map(elt: String): LeafletMap = js.native + + def tileLayer(url: String, opts: TileLayerOptions): TileLayer = js.native + + def marker(latlng: LatLng, options: MarkerOptions): Marker = js.native + + def icon(options: IconOptions): Icon = js.native + + def point(x: Double, y: Double, round: Boolean): Point = js.native + + def popup(): Popup = js.native +} + diff --git a/client/src/main/scala/spatutorial/client/components/map/LeafletMap.scala b/client/src/main/scala/spatutorial/client/components/map/LeafletMap.scala new file mode 100644 index 0000000..f7dca8c --- /dev/null +++ b/client/src/main/scala/spatutorial/client/components/map/LeafletMap.scala @@ -0,0 +1,11 @@ +package spatutorial.client.components.map + +import scala.scalajs.js +import scala.scalajs.js.annotation.JSName + + +@js.native +@JSName("L.Map") +trait LeafletMap extends js.Object { + def setView(center: LatLng, zoom: Int): Unit = js.native +} diff --git a/client/src/main/scala/spatutorial/client/components/map/Marker.scala b/client/src/main/scala/spatutorial/client/components/map/Marker.scala new file mode 100644 index 0000000..576933f --- /dev/null +++ b/client/src/main/scala/spatutorial/client/components/map/Marker.scala @@ -0,0 +1,33 @@ +package spatutorial.client.components.map + +import scala.scalajs.js + +@js.native +trait MarkerOptions extends js.Object + +object MarkerOptions { + def apply(icon: Icon, + clickable: Boolean = true, + draggable: Boolean = false, + keyboard: Boolean = true, + title: String = "", + alt: String = "", + zIndexOffset: Int = 0, + opacity: Double = 1.0, + riseOnHover: Boolean = false, + riseOffset: Int = 250): MarkerOptions = { + js.Dynamic.literal( + icon = icon, clickable = clickable, draggable = draggable, keyboard = keyboard, title = title, alt = alt, + zIndexOffset = zIndexOffset, opacity = opacity, riseOnHover = riseOnHover, riseOffset = riseOffset + ).asInstanceOf[MarkerOptions] + } +} + +@js.native +trait Marker extends js.Object { + + def addTo(map: LeafletMap): Marker = js.native + + def bindPopup(popupContent: String): Popup = js.native + +} diff --git a/client/src/main/scala/spatutorial/client/components/map/Point.scala b/client/src/main/scala/spatutorial/client/components/map/Point.scala new file mode 100644 index 0000000..3d4fb43 --- /dev/null +++ b/client/src/main/scala/spatutorial/client/components/map/Point.scala @@ -0,0 +1,16 @@ +package spatutorial.client.components.map + +import scala.scalajs.js +import scala.scalajs.js.annotation.JSName + +@js.native +@JSName("L.Point") +trait Point extends js.Object + +object Point { + def apply(x: Double, y: Double, round: Boolean = false): Point = { + js.Dynamic.literal( + x = x, y = y, round = round + ).asInstanceOf[Point] + } +} \ No newline at end of file diff --git a/client/src/main/scala/spatutorial/client/components/map/Popup.scala b/client/src/main/scala/spatutorial/client/components/map/Popup.scala new file mode 100644 index 0000000..0583686 --- /dev/null +++ b/client/src/main/scala/spatutorial/client/components/map/Popup.scala @@ -0,0 +1,29 @@ +package spatutorial.client.components.map + +import scala.scalajs.js + +@js.native +trait PopupOptions extends js.Object + +object PopupOptions { + def apply(autoPan: Boolean = true): PopupOptions = { + js.Dynamic.literal( + autoPan = autoPan + ).asInstanceOf[PopupOptions] + } +} + +@js.native +trait Popup extends js.Object { + + def setLatLng(latlng: LatLng): Popup = js.native + + def setContent(htmlContent: String): Popup = js.native + + def openOn(map: LeafletMap): Popup = js.native + + def isOpen(): Boolean = js.native + + def openPopup(): Popup = js.native + +} \ No newline at end of file diff --git a/client/src/main/scala/spatutorial/client/components/map/TileLayer.scala b/client/src/main/scala/spatutorial/client/components/map/TileLayer.scala new file mode 100644 index 0000000..54bd12a --- /dev/null +++ b/client/src/main/scala/spatutorial/client/components/map/TileLayer.scala @@ -0,0 +1,23 @@ +package spatutorial.client.components.map + +import scala.scalajs.js +import scala.scalajs.js.annotation.JSName + +@js.native +trait TileLayerOptions extends js.Object + +object TileLayerOptions { + def apply(maxZoom: Int, attribution: String, id: String): TileLayerOptions = { + js.Dynamic.literal( + maxZoome = maxZoom, + attribution = attribution, + id = id + ).asInstanceOf[TileLayerOptions] + } +} + +@js.native +@JSName("L.TileLayer") +trait TileLayer extends js.Object { + def addTo(map: LeafletMap): Unit = js.native +} diff --git a/client/src/main/scala/spatutorial/client/modules/Dashboard.scala b/client/src/main/scala/spatutorial/client/modules/Dashboard.scala index b129ebe..42c8777 100644 --- a/client/src/main/scala/spatutorial/client/modules/Dashboard.scala +++ b/client/src/main/scala/spatutorial/client/modules/Dashboard.scala @@ -7,20 +7,28 @@ import japgolly.scalajs.react.extra.router.RouterCtl import japgolly.scalajs.react.vdom.prefix_<^._ import spatutorial.client.SPAMain.{Loc, TodoLoc} import spatutorial.client.components._ +import spatutorial.client.components.chart.{ChartData, ChartDataset} -import scala.util.Random +import scalacss.ScalaCssReact._ object Dashboard { case class Props(router: RouterCtl[Loc], proxy: ModelProxy[Pot[String]]) + private val labels = ('A' to 'F').map(letter => (letter.toString, s"#$letter$letter$letter")) // create dummy data for the chart val cp = Chart.ChartProps( "Test chart", Chart.BarChart, ChartData( - Random.alphanumeric.map(_.toUpper.toString).distinct.take(10), - Seq(ChartDataset(Iterator.continually(Random.nextDouble() * 10).take(10).toSeq, "Data1")) + Seq("January", "February", "March", "April", "May", "June", "July"), + Seq(ChartDataset( + label = "My First dataset", + data = Seq(65.0, 59.0, 80.0, 81.0, 56.0, 55.0, 40.0), + backgroundColor = "rgba(255,99,132,0.2)", + borderColor = "rgba(255,99,132,1)", + hoverBackgroundColor = "rgba(255,99,132,0.4)" + )) ) ) @@ -32,7 +40,10 @@ object Dashboard { <.h2("Dashboard"), // use connect from ModelProxy to give Motd only partial view to the model proxy.connect(m => m)(Motd(_)), - Chart(cp), + <.div( + GlobalStyles.chart, + Chart(cp) + ), // create a link to the To Do view <.div(router.link(TodoLoc)("Check your todos!")) ) diff --git a/client/src/main/scala/spatutorial/client/modules/Locations.scala b/client/src/main/scala/spatutorial/client/modules/Locations.scala new file mode 100644 index 0000000..497350d --- /dev/null +++ b/client/src/main/scala/spatutorial/client/modules/Locations.scala @@ -0,0 +1,17 @@ +package spatutorial.client.modules + +import japgolly.scalajs.react.ReactComponentB +import japgolly.scalajs.react.vdom.prefix_<^._ +import spatutorial.client.components.LeafletMap +import spatutorial.client.components.LeafletMap.MapProps + +object Locations { + private val component = ReactComponentB[Unit]("Locations") + .render_P { case _ => + <.div( + LeafletMap(MapProps("test")) + ) + }.build + + def apply() = component() +} diff --git a/client/src/main/scala/spatutorial/client/modules/MainMenu.scala b/client/src/main/scala/spatutorial/client/modules/MainMenu.scala index 596aba6..dcb0839 100644 --- a/client/src/main/scala/spatutorial/client/modules/MainMenu.scala +++ b/client/src/main/scala/spatutorial/client/modules/MainMenu.scala @@ -4,7 +4,7 @@ import diode.react.ModelProxy import japgolly.scalajs.react._ import japgolly.scalajs.react.extra.router.RouterCtl import japgolly.scalajs.react.vdom.prefix_<^._ -import spatutorial.client.SPAMain.{DashboardLoc, Loc, TodoLoc} +import spatutorial.client.SPAMain.{DashboardLoc, Loc, LocationsLoc, TodoLoc} import spatutorial.client.components.Bootstrap.CommonStyle import spatutorial.client.components.Icon._ import spatutorial.client.components._ @@ -31,12 +31,13 @@ object MainMenu { private val menuItems = Seq( MenuItem(1, _ => "Dashboard", Icon.dashboard, DashboardLoc), - MenuItem(2, buildTodoMenu, Icon.check, TodoLoc) + MenuItem(2, buildTodoMenu, Icon.check, TodoLoc), + MenuItem(3, _ => "Locations", Icon.mapMarker, LocationsLoc) ) private class Backend($: BackendScope[Props, Unit]) { def mounted(props: Props) = - // dispatch a message to refresh the todos + // dispatch a message to refresh the todos Callback.when(props.proxy.value.isEmpty)(props.proxy.dispatch(RefreshTodos)) def render(props: Props) = { diff --git a/project/Settings.scala b/project/Settings.scala index 5d0b8da..adab9f2 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -36,6 +36,7 @@ object Settings { val jQuery = "1.11.1" val bootstrap = "3.3.6" val chartjs = "2.1.3" + val leaflet = "0.7.7" val playScripts = "0.5.0" } @@ -54,6 +55,7 @@ object Settings { "com.vmunier" %% "play-scalajs-scripts" % versions.playScripts, "org.webjars" % "font-awesome" % "4.3.0-1" % Provided, "org.webjars" % "bootstrap" % versions.bootstrap % Provided, + "org.webjars" % "leaflet" % versions.leaflet % Provided, "com.lihaoyi" %% "utest" % versions.uTest % Test )) @@ -68,6 +70,7 @@ object Settings { "com.lihaoyi" %%% "utest" % versions.uTest % Test )) + /** Dependencies for external JS libs that are bundled into a single .js file according to dependency order */ val jsDependencies = Def.setting(Seq( "org.webjars.bower" % "react" % versions.react / "react-with-addons.js" minified "react-with-addons.min.js" commonJSName "React", @@ -75,6 +78,7 @@ object Settings { "org.webjars" % "jquery" % versions.jQuery / "jquery.js" minified "jquery.min.js", "org.webjars" % "bootstrap" % versions.bootstrap / "bootstrap.js" minified "bootstrap.min.js" dependsOn "jquery.js", "org.webjars" % "chartjs" % versions.chartjs / "Chart.js" minified "Chart.min.js", - "org.webjars" % "log4javascript" % versions.log4js / "js/log4javascript_uncompressed.js" minified "js/log4javascript.js" + "org.webjars" % "log4javascript" % versions.log4js / "js/log4javascript_uncompressed.js" minified "js/log4javascript.js", + "org.webjars" % "leaflet" % versions.leaflet / "leaflet-src.js" minified "leaflet.js" )) } diff --git a/server/src/main/assets/stylesheets/main.less b/server/src/main/assets/stylesheets/main.less index 4927716..729ca86 100644 --- a/server/src/main/assets/stylesheets/main.less +++ b/server/src/main/assets/stylesheets/main.less @@ -1,2 +1,2 @@ @import "lib/bootstrap/less/bootstrap.less"; -@import "lib/font-awesome/less/font-awesome.less"; +@import "lib/font-awesome/less/font-awesome.less"; \ No newline at end of file diff --git a/server/src/main/twirl/views/index.scala.html b/server/src/main/twirl/views/index.scala.html index f55f88a..e5bbb90 100644 --- a/server/src/main/twirl/views/index.scala.html +++ b/server/src/main/twirl/views/index.scala.html @@ -9,6 +9,7 @@ @title +