UsdaImporter.scala 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package com.weEat.view
  2. import com.weEat.controllers.{FoodController,USDAController}
  3. import com.weEat.modules._
  4. import com.weEat.shared.models.UnitType._
  5. import com.weEat.shared.models.USDANodeNoId
  6. import com.weEat.util.MHtmlHelpers._
  7. import gov.usda.nal.fdc.models._
  8. import gov.usda.nal.fdc.models.DataType._
  9. import mhtml.Rx
  10. import mhtml.future.syntax._
  11. import org.scalajs.dom.raw.Event
  12. import scala.util.Success
  13. object UsdaImporter extends View {
  14. import com.weEat.Main.headers
  15. implicit val ctx = scala.concurrent.ExecutionContext.global
  16. val tag = "importer"
  17. val title = "USDA Import"
  18. override val permissions = Set("admin")
  19. def content = {
  20. val searchBar = SearchBar(term => USDAController.getFoodsSearch(term, Seq(
  21. Foundation, Survey, SRLegacy
  22. ).map(_.toString))().map({
  23. // TODO: Save on network calls by waiting until we're near the end of each
  24. // page before loading the next one.
  25. // Represent this as a Seq[Rx[(Boolean, Criteria)]] where each node depends
  26. // on the one before it in the sequence.
  27. case SearchResult(criteria, n, cur, tot, baseList) => (cur + 1 to tot).map({
  28. c => USDAController.postFoodsSearch()(criteria.copy(pageNumber = Some(c)))
  29. .map(_.foods).toRx.map({
  30. case Some(Success(l)) => l
  31. case _ => Nil
  32. })
  33. }).foldLeft(Rx(baseList))({ (soFar, cur) => soFar.zip(cur).map({
  34. case (soFarList, curList) => soFarList :++ curList
  35. }) })
  36. }))
  37. val searchResults = searchBar.result.flatMap({
  38. case Some(Success(inner)) => inner
  39. case _ => Rx(Nil)
  40. })
  41. val pageSizeSel = Select(Rx((10 to 40 by 10)))
  42. val numPages = pageSizeSel.value.zip(searchResults).map({
  43. case (size, results) => (results.length + size - 1) / size
  44. })
  45. val pageSel = PageSelect(numPages)
  46. <div>
  47. <h2>USDA Importer</h2>
  48. <div class="form-group">
  49. <label for="search">Search: </label>
  50. { searchBar.render }
  51. </div>
  52. {
  53. PaginatedTable[SearchResultFood](Seq(
  54. ("", 1, {x => Rx(<button class="btn btn-light" onclick={e: Event =>
  55. // defaultUnit = if (num().nonEmpty) NUMBER else MASS
  56. val editor = USDAEditor(USDANodeNoId.fromSearchResult(x), true)
  57. Overlay.confirm(Rx(editor.render)) { () =>
  58. import com.weEat.Main.headers
  59. FoodController.add()(editor.getUSDANode())
  60. }
  61. ()
  62. }>Add</button>)}),
  63. ("ID", 1, {x => Rx(<span>{x.fdcId.toString}</span>)}),
  64. ("Name", 3, {x => Rx(<span>{x.description}</span>)}),
  65. ("Desc", 4, {x => Rx(<span>
  66. {x.additionalDescriptions.getOrElse("")}
  67. </span>)}),
  68. ("Brand", 3, {x => Rx(<span>{x.brandOwner.getOrElse("")}</span>)})
  69. ),
  70. searchResults,
  71. pageSel.page,
  72. pageSizeSel.value).render
  73. }
  74. { (pageSel.render).addClass("col-3 float-left") }
  75. { (pageSizeSel.render).addClass("col-1 float-right") }
  76. </div>
  77. }
  78. }