Procházet zdrojové kódy

Added food manager.

Haven't inserted it into the menu yet.
Thomas Flucke před 7 roky
rodič
revize
372859704c

+ 1 - 1
src/name/tflucke/ieat2/configs/WebConfig.java

@@ -29,7 +29,7 @@ public class WebConfig implements WebMvcConfigurer {
         registry.addResourceHandler("/static/**")
             .addResourceLocations("classpath:/META-INF/resources/webjars/")
             .addResourceLocations("/js/")
-            //.setCacheControl(CacheControl.maxAge(0L, TimeUnit.DAYS).cachePublic())
+            .setCacheControl(CacheControl.maxAge(0L, TimeUnit.DAYS).cachePublic())
             .resourceChain(true)
             .addResolver(new WebJarsResourceResolver());
 

+ 6 - 1
src/name/tflucke/ieat2/controllers/BasicFoodController.java

@@ -26,7 +26,12 @@ public class BasicFoodController extends AbstractController<BasicFood> {
         return super.get(id);
     }
     
-    @GetMapping("/food/{query}/query")
+    @GetMapping("/food/query")
+    public List<BasicFood> query() {
+        return db.find(BasicFood.class).asList();
+    }
+    
+    @GetMapping("/food/query/{query}")
     public List<BasicFood> query(@PathVariable("query") String query) {
         return db.find(BasicFood.class).field("name").containsIgnoreCase(query).asList();
     }

+ 23 - 2
web/js/basicFoodEditor.js

@@ -1,8 +1,12 @@
 angular.module('basicFoodEditor', ['ngResource'])
     .factory('BasicFood', ['$resource', '$q', function($resource, $q) {
-        return $resource('food/:id', {}, {
+        return $resource('food/:id', {id: "@id"}, {
             'get':    {method: 'GET'},
-            'query':  {method: 'GET', isArray: true},
+            'query':  {
+                url: "food/query/:query/",
+                method: 'GET',
+                isArray: true
+            },
             'save':   {method: 'PUT'},
             'update': {method: 'POST'},
             'delete': {method: 'DELETE'}
@@ -27,9 +31,26 @@ angular.module('basicFoodEditor', ['ngResource'])
                          });
                      };
 
+                     $scope.delete = function(food) {
+                         food.$delete($scope.close, function (err) {
+                             // TODO: Proper error handling
+                             console.error(err);
+                         });
+                     };
+
+                     var submitFnName = foodData.id == null? "$save":"$update";
+                     $scope.submit = function(food) {
+                         food[submitFnName]($scope.close, function (err) {
+                             // TODO: Proper error handling
+                             console.error(err);
+                         });
+                     };
+
                      // TODO:
                      // Will this controller ever be used non-modally?
                      // Will it even work as a non-modal?
                      $scope.close = $uibModalInstance != null?
                          $uibModalInstance.close : null;
+                     $scope.dismiss = $uibModalInstance != null?
+                         $uibModalInstance.dismiss : null;
                  }]);

+ 8 - 2
web/js/templates/editBasicFood.html

@@ -13,7 +13,7 @@
         </td>
         <td>
           <label for="calories">Calories/100:</label>
-          <input id="calories" class="form-control" type="number" data-ng-model="food.calories_p_hundred" />
+          <input id="calories" class="form-control" type="number" data-ng-model="food.calories_p_100" />
         </td>
       </tr>
       <tr>
@@ -35,8 +35,14 @@
       </tr>
       <tr>
         <td colspan="2" style="text-align: right;">
-          <button type="button" class="btn btn-danger" data-ng-click="close();">Cancel</button>
           <button type="button" class="btn btn-success" data-ng-click="submit(food);">Submit</button>
+          <button type="button" class="btn" data-ng-click="dismiss();">Cancel</button>
+          <button type="button"
+                  class="btn btn-danger"
+                  data-ng-show="food.id != null"
+                  data-ng-click="delete(food);">
+            Delete
+          </button>
         </td>
       </tr>
     </table>

+ 1 - 1
web/views/addFood.jsp

@@ -42,7 +42,7 @@
                       name: foodData.name,
                       food_group: foodData.fg,
                       default_unit: foodData.ru,
-                      calories_p_hundred: foodData.nutrients.find(function (nutrient) {
+                      calories_p_100: foodData.nutrients.find(function (nutrient) {
                           // TODO: Replace 208 with soft-loaded value from database
                           // 208 is the id for kCalories
                           return nutrient.nutrient_id == 208;

+ 103 - 0
web/views/browseFood.jsp

@@ -0,0 +1,103 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
+<t:template>
+  <jsp:attribute name="title">Add Food</jsp:attribute>
+  <jsp:attribute name="head">
+    <script type="text/javascript" src="static/ndbDatabase.js"></script>
+    <script type="text/javascript" src="static/basicFoodEditor.js"></script>
+    <script type="text/javascript">
+      var app = angular.module('ingredients', ['basicFoodEditor', 'ui.bootstrap']);
+      app.controller('SearchController', ['$scope', '$timeout', '$uibModal', 'BasicFood',
+          function($scope, $timeout, $uibModal, BasicFood) {
+              $scope.searchTerm = "";
+              $scope.searchOffset = 1;
+              $scope.searchSize = "10";
+              $scope.searchResults = BasicFood.query();
+              
+              var searchTimeout = false;
+              var searchFn = function() {
+                  BasicFood.query({
+                      "query": $scope.searchTerm
+                  }, function(data) {
+                      console.debug(data);
+                      $scope.searchResults = data;
+                  }, function (err) {
+                      console.error(err);
+                  });
+              };
+              $scope.$watchGroup(['searchTerm', 'searchOffset'], function(newValues, oldValues, scope) {
+                  if (searchTimeout)
+                  {
+                      $timeout.cancel(searchTimeout);
+                  }
+                  if ($scope.searchTerm.length >= 3)
+                  {
+                      searchTimeout = $timeout(searchFn, 100);
+                  }
+              });
+
+              $scope.promptWindow = function(id) {
+                  var item = $scope.searchResults.find(function (canidate) {
+                      return canidate.id == id;
+                  });
+                  $uibModal.open({
+                      // TODO: Figure out what these are and how they work
+                      //ariaLabelledBy: 'modal-title',
+                      //ariaDescribedBy: 'modal-body',
+                      templateUrl: 'static/templates/editBasicFood.html',
+                      controller: 'BasicFoodEditorController',
+                      size: "md",
+                      resolve: {
+                          foodData: function() {return item;}
+                      }
+                  }).result.then(searchFn);
+              };
+          }]);
+    </script>
+  </jsp:attribute>
+  <jsp:body>
+    <div class="section container" data-ng-app="ingredients" data-ng-controller="SearchController">
+      <h2>Ingredients</h2>
+      <div class="form-group">
+        <label for="search">Search: </label>
+        <input type="text" class="form-control input-sm" id="search" data-ng-model="searchTerm" />
+      </div>
+      <table class="table table-striped table-hover table-responsive">
+        <tr>
+          <th class="col-md-1"> </th>
+          <th class="col-md-6">Name</th>
+          <th class="col-md-3">Group</th>
+          <th class="col-md-3">Calories</th>
+        </tr>
+        <tr data-ng-repeat="item in searchResults | limitTo:searchSize:searchSize*(searchOffset-1)"
+            data-ng-click="item.checked = !item.checked">
+          <th><input type="button"
+                     value="Edit"
+                     class="checkbox-inline"
+                     data-ng-click="promptWindow(item.id)"></th>
+          <td>{{ ::item.name }}</td>
+          <td>{{ ::item.food_group }}</td>
+          <td>{{ ::item.calories_p_100 }}</td>
+        </tr>
+      </table>
+      <div class="form-group col-xs-5">
+        <ul class="pagination-sm"
+            style="margin: 0;"
+            data-uib-pagination=""
+            data-boundary-links="true"
+            force-ellipses="true"
+            data-total-items="searchResults.length"
+            data-ng-model="searchOffset"
+            data-items-per-page="searchSize"></ul>
+      </div>
+      <div class="form-group form-group-sm col-xs-2 pull-right">
+        <select id="sizeSelector" class="form-control input-sm" data-ng-model="searchSize">
+          <option>10</option>
+          <option>20</option>
+          <option>30</option>
+          <option>40</option>
+        </select>
+      </div>
+    </div>
+  </jsp:body>
+</t:template>