From 70e7a8b415e55dbf21dd4f819c24087d697ed02d Mon Sep 17 00:00:00 2001 From: Dan Elbert Date: Thu, 28 Jan 2016 14:19:51 -0600 Subject: [PATCH] Ingredient editor --- app/assets/javascripts/ingredients.js | 68 +++++++++-- app/assets/javascripts/typeahead_search.js | 107 ++++++++++++++++++ app/controllers/ingredients_controller.rb | 35 ++++-- app/models/concerns/tokenized_like.rb | 26 +++++ app/models/ingredient.rb | 13 +++ app/models/usda_food.rb | 11 ++ app/views/ingredients/_form.html.erb | 56 +++++---- app/views/ingredients/select_ndbn.js.erb | 2 + .../ingredients/usda_food_search.html.erb | 20 ++++ config/routes.rb | 7 +- db/migrate/20160124212254_create_usda_food.rb | 4 +- db/schema.rb | 1 + db/seeds.rb | 4 +- lib/tasks/usda.rake | 8 ++ spec/factories/usda_foods.rb | 25 ++++ spec/models/usda_food_spec.rb | 41 +++++++ 16 files changed, 382 insertions(+), 46 deletions(-) create mode 100644 app/assets/javascripts/typeahead_search.js create mode 100644 app/models/concerns/tokenized_like.rb create mode 100644 app/views/ingredients/select_ndbn.js.erb create mode 100644 app/views/ingredients/usda_food_search.html.erb create mode 100644 spec/factories/usda_foods.rb create mode 100644 spec/models/usda_food_spec.rb diff --git a/app/assets/javascripts/ingredients.js b/app/assets/javascripts/ingredients.js index aa49ca3..14afb46 100644 --- a/app/assets/javascripts/ingredients.js +++ b/app/assets/javascripts/ingredients.js @@ -1,9 +1,63 @@ (function($) { + function initializeEditor($ingredientForm) { + usdaFoodSearchEngine.initialize(false); + + var $typeahead = $ingredientForm.find(".ndbn_typeahead"); + var $usdaModal = $("#link_ndbn_modal"); + var $name = $ingredientForm.find(".name"); + var $ndbn = $ingredientForm.find("input.ndbn"); + var $ndbn_group = $ingredientForm.find(".ndbn_group"); + + if ($ndbn.val()) { + } + + $typeahead.typeahead_search({ + searchUrl: '/ingredients/usda_food_search.html', + resultsContainer: '#link_ndbn_modal .results' + },{ + name: 'usdaFoods', + source: usdaFoodSearchEngine, + display: function(datum) { + return datum.name; + } + }); + + $typeahead.on("typeahead_search:selected", function(evt, item) { + selectNdbn(item.ndbn); + }); + + $usdaModal.on("shown.bs.modal", function() { + var $this = $(this); + $typeahead.typeahead("val", $name.val()); + $typeahead.focus(); + $typeahead.select(); + }); + + $ingredientForm.on("click", "#link_ndbn_modal .results .food_result", function(evt) { + var $item = $(evt.target); + var ndbn = $item.data("ndbn"); + selectNdbn(ndbn); + }); + } + + function selectNdbn(ndbn) { + var $ingredientForm = $("#ingredient_form"); + var id = $ingredientForm.find("input.id").val(); + + $ingredientForm.find("input.ndbn").val(ndbn); + $ingredientForm.attr("action", "/ingredients/" + id + "/select_ndbn").attr("data-remote", "true"); + + $("#link_ndbn_modal").modal('hide').on('hidden.bs.modal', function() { + $ingredientForm.submit(); + }); + } + var usdaFoodSearchEngine = new Bloodhound({ initialize: false, datumTokenizer: function(datum) { - return Bloodhound.tokenizers.whitespace(datum.name); + var str = datum ? datum.name : null; + return str ? str.split(/[\s,]+/) : []; }, queryTokenizer: Bloodhound.tokenizers.whitespace, identify: function(datum) { return datum.ndbn; }, @@ -26,18 +80,8 @@ var $ingredientForm = $("#ingredient_form"); if ($ingredientForm.length) { - usdaFoodSearchEngine.initialize(false); + initializeEditor($ingredientForm); } - - $ingredientForm.find(".ndbn_typeahead").typeahead_selector({ - - },{ - name: 'usdaFoods', - source: usdaFoodSearchEngine, - display: function(datum) { - return datum.name; - } - }); }); })(jQuery); \ No newline at end of file diff --git a/app/assets/javascripts/typeahead_search.js b/app/assets/javascripts/typeahead_search.js new file mode 100644 index 0000000..c52b822 --- /dev/null +++ b/app/assets/javascripts/typeahead_search.js @@ -0,0 +1,107 @@ +(function($) { + + var pluginName = "typeahead_search"; + + var defaultOptions = { + }; + + var methods = { + initialize: function (opts, sources) { + + return this.each(function() { + var options = $.extend({}, defaultOptions, opts); + var $this = $(this); + $this.data(pluginName, {options: options}); + + var $inputGroup = $('
'); + var $btnSpan = $(""); + var $btn = $(" +
+

<%= @ingredient.ndbn ? UsdaFood.find_by_ndbn(@ingredient.ndbn).short_description : '' %>

+
- <%= f.label :ndbn, "Nutrient Databank Number", class: 'control-label' %> - + <%= f.label :density, class: 'control-label' %> + <%= f.text_field :density, class: 'form-control', disabled: has_ndbn %> +
+ +
+ <%= f.label :notes, class: 'control-label' %> + <%= f.text_area :notes, class: 'form-control' %>
@@ -21,45 +40,35 @@
<%= f.label :water, "Grams of Water", class: 'control-label' %> - <%= f.text_field :water, class: 'form-control' %> + <%= f.text_field :water, class: 'form-control', disabled: has_ndbn %>
<%= f.label :protein, "Grams of Protein", class: 'control-label' %> - <%= f.text_field :protein, class: 'form-control' %> + <%= f.text_field :protein, class: 'form-control', disabled: has_ndbn %>
<%= f.label :lipids, "Grams of Fat", class: 'control-label' %> - <%= f.text_field :lipids, class: 'form-control' %> + <%= f.text_field :lipids, class: 'form-control', disabled: has_ndbn %>
<%= f.label :kcal, "Calories", class: 'control-label' %> - <%= f.text_field :kcal, class: 'form-control' %> + <%= f.text_field :kcal, class: 'form-control', disabled: has_ndbn %>
<%= f.label :fiber, "Grams of Fiber", class: 'control-label' %> - <%= f.text_field :fiber, class: 'form-control' %> + <%= f.text_field :fiber, class: 'form-control', disabled: has_ndbn %>
<%= f.label :sugar, "Grams of Sugar", class: 'control-label' %> - <%= f.text_field :sugar, class: 'form-control' %> + <%= f.text_field :sugar, class: 'form-control', disabled: has_ndbn %>
-
- <%= f.label :density, class: 'control-label' %> - <%= f.text_field :density, class: 'form-control' %> -
- -
- <%= f.label :notes, class: 'control-label' %> - <%= f.text_area :notes, class: 'form-control' %> -
-
<%= f.submit class: 'btn btn-primary' %>
@@ -75,10 +84,13 @@
<%= f.label :ndbn, "", class: 'control-label' %> - <%= f.hidden_field :ndbn %>
+
+ +
+