Ver código fonte

Added the ability to edit USDA foods retroactively and improved unit conversion logging.

Thomas Flucke 2 anos atrás
pai
commit
f8c6316a20

+ 4 - 2
shared/shared/src/main/scala/com/weEat/shared/exceptions/IncompleteDataException.scala

@@ -1,5 +1,7 @@
 package com.weEat.shared.exceptions
 
-class IncompleteDataException(val field: String) extends RuntimeException {
-  override def getMessage = s"Could not preform action do to missing $field information."
+import com.weEat.shared.models.FoodNode
+
+class IncompleteDataException(val foodNode: FoodNode, val field: String) extends RuntimeException {
+  override def getMessage = s"Could not preform action on ${foodNode.name} do to missing $field information."
 }

+ 18 - 0
shared/shared/src/main/scala/com/weEat/shared/models/FoodNode.scala

@@ -374,6 +374,24 @@ object USDANodeNoId {
 
 object USDANodeId {
 
+  def withId(id: Identifier, uid: Identifier)(
+    name: String,
+    fdcId: Long,
+    density: Option[Float],
+    massPerUnit: Option[Float],
+    calories: Float,
+    nutrients: Map[String, Float]
+  ) = USDANodeId(
+    id,
+    uid,
+    name,
+    fdcId,
+    density,
+    massPerUnit,
+    calories,
+    nutrients
+  )
+
   implicit val config = JsonConfiguration(JsonNaming.SnakeCase)
   implicit val idFmt = com.weEat.shared.models.IdentifierHelper.fmt
   implicit val fmt = Json.using[Json.WithDefaultValues].format[USDANodeId]

+ 19 - 23
webClient/src/main/scala/com/weEat/modules/USDAEditor.scala

@@ -52,12 +52,13 @@ case class USDAEditor(
   private val _calorieIn = floatInput("calories", Some(usda.calories))
   private val _calorie = _calorieIn.value
 
-  val noneValue = "none"
+  val noneValue = ""
   val customValue = "custom"
 
   val defaultVolPort = _measures.map(getDefaultPortion(_, VOLUME, usda.density))
 
-  private val _volume = Var[String](noneValue)
+  private val _volume = Var[String](usda.density.fold(noneValue)(_.toString))
+  private val _volumeIsCustom = Var(usda.density.isDefined)
   private val _volumeIn = select(cls := "custom-select",
     option(selected <-- defaultVolPort.map(_ == None && usda.density == None),
       value := noneValue,
@@ -80,12 +81,16 @@ case class USDAEditor(
           )
         })
     ),
-    onChange.mapToValue --> _volume
+    onChange.mapToValue --> _volume.updater({ (prev: String, value: String) =>
+      if (value == customValue) prev else value
+    }),
+    onChange.mapToValue.map(_ == customValue) --> _volumeIsCustom
   )
 
   val defaultNumPort = _measures.map(getDefaultPortion(_, NUMBER, usda.massPerUnit))
 
-  private val _count = Var[String](noneValue)
+  private val _count = Var[String](usda.massPerUnit.fold(noneValue)(_.toString))
+  private val _countIsCustom = Var(usda.density.isDefined)
   private val _countIn = select(cls := "custom-select",
     option(selected <-- defaultNumPort.map(_ == None && usda.massPerUnit == None),
       value := noneValue,
@@ -108,14 +113,17 @@ case class USDAEditor(
           )
         })
     ),
-    onChange.mapToValue --> _count
+    onChange.mapToValue --> _count.updater({ (prev: String, value: String) =>
+      if (value == customValue) prev else value
+    }),
+    onChange.mapToValue.map(_ == customValue) --> _countIsCustom
   )
 
   private val _densityIn = input(cls := "form-control",
     typ := "number",
     stepAttr := "any",
     minAttr := "0",
-    disabled <-- !_volume.signal.valueIs(customValue),
+    disabled <-- !_volumeIsCustom.signal,
     value <-- _volume.signal.composeChanges(
       _.map(_.toFloatOption).filter(_.nonEmpty).map(_.get.toString)
     )
@@ -126,7 +134,7 @@ case class USDAEditor(
     typ := "number",
     stepAttr := "any",
     minAttr := "0",
-    disabled <-- !_count.signal.valueIs(customValue),
+    disabled <-- !_countIsCustom.signal,
     value <-- _count.signal.composeChanges(
       _.map(_.toFloatOption).filter(_.nonEmpty).map(_.get.toString)
     )
@@ -159,30 +167,18 @@ case class USDAEditor(
     implicit val owner = new ManualOwner()
 
     (usda match {
-      case node: USDANodeId =>
-        Function.uncurried((USDANodeId.apply _).curried(node._id))
-          .asInstanceOf[(
-            String,
-            Long,
-            Option[Float],
-            Option[Float],
-            Float,
-            Map[String, Float]
-          ) => USDANodeId]
-      case _ =>
-        USDANodeNoId.apply _
+      case node: USDANodeId => USDANodeId.withId(node._id, node.uid) _
+      case _ => USDANodeNoId.apply _
     })(
       _name.observe.now(),
       _fdcId,
       _volume.signal.flatMap({
         case `noneValue` => Val(None)
-        case `customValue` => _density.map(str => Some(str.toFloat))
-        case value => Val(Some(value.toFloat))
+        case _ => _density.map((str) => Some(str.toFloat))
       }).observe.now(),
       _count.signal.flatMap({
         case `noneValue` => Val(None)
-        case `customValue` => _mass.map(str => Some(str.toFloat))
-        case value => Val(Some(value.toFloat))
+        case _ => _mass.map({(str) => println(str);Some(str.toFloat)})
       }).observe.now(),
       //_typ,
       _calorie.observe.now().toFloat,

+ 11 - 2
webClient/src/main/scala/com/weEat/views/FoodSearch.scala

@@ -67,8 +67,17 @@ object FoodSearch extends View[Option[String]] {
             }
           }).shiftOption.optionMap({
             case true => button(cls := "btn btn-light",
-              onClick --> { (_) =>
-                View.router.pushState(RecipeEdit.ViewPage(Some(x._id)))
+              x.nodeType match {
+                case FoodNodeId.NodeType.RECIPE => onClick --> { (_) =>
+                  View.router.pushState(RecipeEdit.ViewPage(Some(x._id)))
+                }
+                case FoodNodeId.NodeType.USDA => onClick --> {(_) =>
+                  val editor = USDAEditor(x.asInstanceOf[USDANode], false)
+                  Overlay.confirm(editor.render) { () =>
+                    import com.weEat.Main.headers
+                    FoodController.update(x._id)(editor.getUSDANode())
+                  }
+                }
               },
               "Edit"
             )