Browse Source

Refactored code to be more organized.

Objects which represent a view are now seperated from modules.

Utility code moved into util packages.
Thomas Flucke 5 years ago
parent
commit
02d675604b

+ 1 - 1
.gitignore

@@ -1 +1 @@
-target
+target

+ 9 - 1
README.md

@@ -1,4 +1,10 @@
-# TODO List:
+# Open Sauce Recipe Book
+
+## Setup and Usage
+
+
+
+## TODO List:
 
 January: (done)
  * Basic infrastructure
@@ -32,6 +38,8 @@ June:
 
 July:
  * Calories Adjustments from cooking
+ * DB Caching
+ * REST Caching
 
 August:
 

+ 1 - 0
client/src/main/scala/com/weEat/Main.scala

@@ -14,6 +14,7 @@ import com.weEat.controllers.UserController
 import org.querki.jquery.{JQueryEventObject,JQuery,JQueryXHR,JQueryStatic => $}
 import com.tflucke.webroutes.{HTTPException,TimeoutException}
 import play.api.libs.json.Json
+import com.weEat.util.SessionStorage
 
 object Main {
   /* Get the CSRF token embedded in the HTML page.  This token will implicitly

+ 2 - 2
client/src/main/scala/com/weEat/modules/SearchBar.scala

@@ -12,7 +12,7 @@ import mhtml.implicits.cats._
 import cats.Traverse._
 import scala.xml.{Node,Elem,UnprefixedAttribute}
 import com.weEat.modules._
-import MHtmlHelpers._
+import com.weEat.util.MHtmlHelpers._
 
 case class SearchBar[T](
   searchFn: (String) => Future[T],
@@ -34,7 +34,7 @@ case class SearchBar[T](
 
 
   private val (_render, _inputTerm) =
-    new ElemHelpers(<input type="text" class="form-control input-sm" />).value()
+    (<input type="text" class="form-control input-sm" />).value()
   val render = _render
 
   val searchTerm = _inputTerm.map[Option[String]](Some(_))

+ 2 - 2
client/src/main/scala/com/weEat/modules/Select.scala

@@ -2,11 +2,11 @@ package com.weEat.modules
 
 import org.scalajs.dom.raw.Event
 import mhtml.Rx
-import MHtmlHelpers._
+import com.weEat.util.MHtmlHelpers._
 
 case class Select[T](values: Rx[Seq[T]], defaul: Option[T] = None) {
   private val (_select, _value) =
-    new ElemHelpers(<select class="form-control input-sm">
+    (<select class="form-control input-sm">
       {
         values.map(_.zipWithIndex).map({ _.map({ case (value, idx) =>
           <option selected={Some(value) == defaul} value={idx.toString}>

+ 1 - 1
client/src/main/scala/com/weEat/modules/USDAEditor.scala

@@ -11,7 +11,7 @@ import gov.usda.nal.fdc.models.{SearchResultFood,FullFoodItem,FoodPortion}
 import com.weEat.shared.models.{Count,MeasureUnit,USDANode}
 import mhtml.Rx
 import mhtml.future.syntax._
-import MHtmlHelpers._
+import com.weEat.util.MHtmlHelpers._
 
 case class USDAEditor(usda: USDANode, defaultOverNone: Boolean) {
   implicit val ctx = scala.concurrent.ExecutionContext.global

+ 12 - 5
client/src/main/scala/com/weEat/Cookie.scala → client/src/main/scala/com/weEat/util/Cookie.scala

@@ -1,10 +1,14 @@
-package com.weEat
+package com.weEat.util
 
 import org.scalajs.dom.document
 import scala.concurrent.duration.Duration
 
 trait Cookies {
-  def set(key: String, value: String, options: CookieOptions = CookieOptions()): Cookies
+  def set(
+    key: String,
+    value: String,
+    options: CookieOptions = CookieOptions()
+  ): Cookies
   def get(key: String): Option[String]
   def apply(name: String) = get(name)
 }
@@ -15,12 +19,15 @@ case class CookieOptions(
   expires: Option[Duration] = None,
   secure: Option[Boolean] = None
 ) {
-  def opStr(name: String, op: Option[Any]) = op.map(x => s"$name=$x;").getOrElse("")
+  def opStr(name: String, op: Option[Any]) =
+    op.map(x => s"$name=$x;").getOrElse("")
 
   expires.get
 
-  override def toString = opStr("path", path) + opStr("domain", domain) +
-    expires.map(x => s"expires=${x.toMillis};").getOrElse("") + opStr("secure", secure)
+  override def toString = opStr("path", path) +
+    opStr("domain", domain) +
+    expires.map(x => s"expires=${x.toMillis};").getOrElse("") +
+    opStr("secure", secure)
 }
 
 object Cookies extends Cookies {

+ 1 - 1
client/src/main/scala/com/weEat/modules/MHtmlHelpers.scala → client/src/main/scala/com/weEat/util/MHtmlHelpers.scala

@@ -1,4 +1,4 @@
-package com.weEat.modules
+package com.weEat.util
 
 import scala.xml._
 import mhtml.{Var,Rx}

+ 2 - 5
client/src/main/scala/com/weEat/Storage.scala → client/src/main/scala/com/weEat/util/Storage.scala

@@ -1,9 +1,7 @@
-package com.weEat
+package com.weEat.util
 
-import org.scalajs.dom.document
 import scala.scalajs.js
-import scala.scalajs.js.annotation.{JSName,JSGlobal}
-import scala.concurrent.duration.Duration
+import scala.scalajs.js.annotation.JSGlobal
 
 @js.native
 protected trait JsStorage extends js.Object {
@@ -37,7 +35,6 @@ object SessionStorage extends Storage {
   protected object native extends JsStorage {}
 }
 
-
 object LocalStorage extends Storage {
   @js.native
   @JSGlobal("window.localStorage")

+ 10 - 7
client/src/main/scala/com/weEat/modules/UsdaImporter.scala → client/src/main/scala/com/weEat/views/UsdaImporter.scala

@@ -1,4 +1,4 @@
-package com.weEat.modules
+package com.weEat.view
 
 import scala.scalajs.js.annotation._
 import gov.usda.nal.fdc.models._
@@ -11,15 +11,18 @@ import com.weEat.shared.models.{Count,MeasureUnit,USDANode}
 import scala.util.Success
 import mhtml.{mount,Rx}
 import mhtml.future.syntax._
-import MHtmlHelpers._
+import com.weEat.util.MHtmlHelpers._
+import com.weEat.modules._
 
 @JSExportTopLevel("UsdaImporter")
-object UsdaImporter {
+object UsdaImporter extends View {
   import com.weEat.Main.headers
 
   implicit val ctx = scala.concurrent.ExecutionContext.global
 
-  def usdaImporterPane() = {
+  val title = "USDA Import"
+
+  def content = {
     val searchBar = SearchBar(term => USDAController.getFoodsSearch(term, Seq(
       Foundation, Survey, SRLegacy
     ).map(_.toString))().map({
@@ -76,11 +79,11 @@ object UsdaImporter {
         pageSel.page,
         pageSizeSel.value)
     }
-    { new ElemHelpers(pageSel.render).addClass("col-3 float-left") }
-    { new ElemHelpers(pageSizeSel.render).addClass("col-1 float-right") }
+    { (pageSel.render).addClass("col-3 float-left") }
+    { (pageSizeSel.render).addClass("col-1 float-right") }
     </div>
   }
 
   @JSExport
-  def render(parent: Element) = mount(parent, usdaImporterPane())
+  def render(parent: Element) = mhtml.mount(parent, content)
 }

+ 6 - 0
client/src/main/scala/com/weEat/views/View.scala

@@ -0,0 +1,6 @@
+package com.weEat.view
+
+trait View {
+  def title: String
+  def content: scala.xml.Node
+}

+ 1 - 1
server/app/com/weEat/controllers/USDAController.scala

@@ -12,7 +12,7 @@ import gov.usda.nal.fdc.models.SortCriteria.SortCriteria
 import gov.usda.nal.fdc.models.SortOrder.SortOrder
 import scala.util.{Try,Success,Failure}
 import com.tflucke.webroutes.HTTPException
-import com.weEat.util.TryWith
+import com.weEat.shared.util.TryWith
 import scala.concurrent.{ExecutionContext,Future,blocking}
 import gov.usda.nal.fdc.{controllers => fdcControllers}
 import org.mongodb.scala.model.Filters._

+ 0 - 1
server/app/views/usdaImport.scala.html

@@ -1,7 +1,6 @@
 @()(implicit webJarsUtil: org.webjars.play.WebJarsUtil, request: RequestHeader)
 
 @main("USDA Import") {
-  <h2>USDA Importer</h2>
   <div id="importPane"></div>
 }
 

+ 64 - 0
server/app/views/viewLoader.scala.html

@@ -0,0 +1,64 @@
+@(implicit webJarsUtil: org.webjars.play.WebJarsUtil, request: RequestHeader)
+<!DOCTYPE html>
+<html>
+<head>
+  <title>Open Sauce</title>
+  <link rel="shortcut icon" type="image/png"
+	    href="@routes.Assets.versioned("images/favicon.png")">
+  @webJarsUtil.locate("jquery.min.js").script()
+  @webJarsUtil.locate("bootstrap.min.css").css()
+  @webJarsUtil.locate("bootstrap.min.js").script()
+</head>
+<body>
+  <header class="page-header">
+    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
+      <a class="navbar-brand" href="#">Sample Web Page</a>
+      <button class="navbar-toggler" type="button" data-toggle="collapse"
+              data-target="#navbarNav" aria-controls="navbarNav"
+              aria-expanded="false" aria-label="Toggle navigation">
+        <span class="navbar-toggler-icon"></span>
+      </button>
+      <div class="collapse navbar-collapse" id="navbarNav">
+        <a href="#" class="navbar-brand"></a>
+        <ul class="navbar-nav mr-auto mt-2 mt-lg-0">
+          <li class="nav-item active">
+            <a class="nav-link" href="#">Home</a>
+          </li>
+          <li class="nav-item">
+            <a class="nav-link" href="#">Basic Foods</a>
+          </li>
+          <li class="nav-item">
+            <a class="nav-link" href="#">Recipes</a>
+          </li>
+        </ul>
+        <ul id="login-btns" class="navbar-nav">
+          <li class="nav-item">
+            <a class="nav-link" href="#" id="btn-login">Login</a>
+          </li>
+          <li class="nav-item">
+            <a class="nav-link" href="#" id="btn-signup">Signup</a>
+          </li>
+        </ul>
+        <ul id="logout-btns" class="navbar-nav" style="display: none;">
+          <li class="nav-item">
+            <a class="nav-link" href="#" id="btn-logout">Logout</a>
+          </li>
+        </ul>
+      </div>
+    </nav>
+  </header>
+  <div id="content" class="section container">
+  </div>
+  <!-- Creates a CSRF token, required by Play for non-GET requests.  Token is
+       embedded in a hidden input tag. -->
+  @helper.CSRF.formField
+  <!-- Load the script.  Must come after CSRF token is defined because the script
+       will read it upon startup. -->
+  @scalajs.html.scripts(
+    "client",
+    routes.Assets.versioned(_).toString,
+    name => getClass.getResource(s"/public/$name") != null
+  )
+  <script></script>
+</body>
+</html>

+ 0 - 0
server/logs/application.log


+ 2 - 2
server/app/com/weEat/util/TryWith.scala → shared/shared/src/main/scala/com/weEat/shared/util/TryWith.scala

@@ -1,11 +1,11 @@
-package com.weEat.util
+package com.weEat.shared.util
 
 import scala.util.control.NonFatal
 import scala.util.{Failure, Try}
 
 /* Adopted with minor changes from:
  * https://codereview.stackexchange.com/questions/79267/scala-trywith-that-closes-resources-automatically
- * Written by Stack Overflow User Morgan
+ * Written by Stack Overflow user Morgan
  */
 object TryWith {
   def apply[C <: AutoCloseable, R](resource: => C)(f: C => R): Try[R] =