Added MealsController#new and form autocomplete for Food
Renamed QuantityColumn -> Exposure
This commit is contained in:
4
app/views/meals/_contextual.html.erb
Normal file
4
app/views/meals/_contextual.html.erb
Normal file
@@ -0,0 +1,4 @@
|
||||
<% if User.current.allowed_to?(:manage_common, @project) %>
|
||||
<%= link_to t(".link_new_meal"), new_project_meal_path(@project),
|
||||
{remote: true, class: 'icon icon-add'} %>
|
||||
<% end %>
|
||||
79
app/views/meals/_form.html.erb
Normal file
79
app/views/meals/_form.html.erb
Normal file
@@ -0,0 +1,79 @@
|
||||
<%= error_messages_for @meal %>
|
||||
|
||||
<div class="box">
|
||||
<div class="tabular">
|
||||
<% @meal.ingredients.each_with_index do |i, index| %>
|
||||
<table style="width:95%;">
|
||||
<%= f.fields_for 'ingredients_attributes', i, index: '' do |ff| %>
|
||||
<tr class="ingredient">
|
||||
<td style="width:90%;">
|
||||
<p>
|
||||
<%= ff.hidden_field :id %>
|
||||
<%= ff.text_field :food_id, {class: "autocomplete food-autocomplete",
|
||||
style: "width: 80%;",
|
||||
required: true,
|
||||
label: (index > 0 ? '' : :field_ingredients)} %>
|
||||
<%= ff.number_field :amount, {style: "width: 8%", step: :any, label: ''} %>
|
||||
<%= i.food.ref_unit.shortname if i.food %>
|
||||
<%= ff.hidden_field :_destroy %>
|
||||
</p>
|
||||
</td>
|
||||
<td style="width:10%;">
|
||||
<%= link_to t(".button_delete_ingredient"), '#',
|
||||
class: 'icon icon-del',
|
||||
style: (@meal.ingredients.length > 1 ? "" : "display:none"),
|
||||
onclick: "deleteIngredient(); return false;" %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</table>
|
||||
<% end %>
|
||||
<p>
|
||||
<%= link_to t(".button_new_ingredient"), '#', class: 'icon icon-add',
|
||||
onclick: 'newIngredient(); return false;' %>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%= javascript_tag do %>
|
||||
function autocompleteFood($row) {
|
||||
$row.find('.food-autocomplete').autocomplete({
|
||||
source: '<%= j autocomplete_project_foods_path(@project) %>',
|
||||
minLength: 2,
|
||||
position: {collision: 'flipfit'},
|
||||
search: function(event){
|
||||
$(event.target).closest('.food-autocomplete').addClass('ajax-loading');
|
||||
},
|
||||
response: function(event){
|
||||
$(event.target).closest('.food-autocomplete').removeClass('ajax-loading');
|
||||
}
|
||||
});
|
||||
}
|
||||
autocompleteFood($('tr.ingredient:visible'));
|
||||
|
||||
function newIngredient() {
|
||||
var form = $(event.target).closest('form');
|
||||
var row = form.find('tr.ingredient:visible:last');
|
||||
var new_row = row.clone().insertAfter(row);
|
||||
new_row.find('input[id$=__id], input[id$=__amount], input[id$=__food_id]').val('');
|
||||
new_row.find('input[id$=__destroy]').val('');
|
||||
new_row.find('label:first').hide();
|
||||
form.find('tr.ingredient:visible a.icon-del').show();
|
||||
autocompleteFood(new_row);
|
||||
}
|
||||
|
||||
function deleteIngredient() {
|
||||
var form = $(event.target).closest('form');
|
||||
var row = $(event.target).closest('tr.ingredient');
|
||||
if (row.find('input[id$=__id]').val()) {
|
||||
row.hide();
|
||||
row.find('input[id$=__destroy]').val('1');
|
||||
} else {
|
||||
row.remove();
|
||||
}
|
||||
form.find('tr.ingredient:visible:first label:first').show();
|
||||
if (form.find('tr.ingredient:visible').length <= 1) {
|
||||
form.find('tr.ingredient:visible a.icon-del').hide();
|
||||
}
|
||||
}
|
||||
<% end %>
|
||||
21
app/views/meals/_index.html.erb
Normal file
21
app/views/meals/_index.html.erb
Normal file
@@ -0,0 +1,21 @@
|
||||
<% if @meals.any? { |m| m.persisted? } %>
|
||||
<table id="meals" class="odd-even">
|
||||
<tbody>
|
||||
<% @meals.group_by { |m| m.eaten_at.date if m.eaten_at }.each do |d, meals| %>
|
||||
<% meals.each_with_index do |m, index| %>
|
||||
<tr id="meal-<%= m.new_record? ? 'new' : m.id %>" class="primary meal">
|
||||
<td class="name">
|
||||
<h4>
|
||||
<%= "#{t '.label_meal'}" %><%= index ? " ##{index+1}" : " (new)" %>
|
||||
<%= ", #{m.eaten_at.time}" if m.eaten_at %>
|
||||
</h4>
|
||||
</td>
|
||||
<td class="action unwrappable" style="width:5%"><%= action_links(m) %></td>
|
||||
</tr>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
<% else %>
|
||||
<p class="nodata"><%= l(:label_no_data) %></p>
|
||||
<% end %>
|
||||
18
app/views/meals/_new_form.html.erb
Normal file
18
app/views/meals/_new_form.html.erb
Normal file
@@ -0,0 +1,18 @@
|
||||
<h2><%= t ".heading_new_meal" %></h2>
|
||||
|
||||
<%= labelled_form_for @meal,
|
||||
url: project_meals_path(@project),
|
||||
remote: true,
|
||||
html: {id: 'new-meal-form', name: 'new-meal-form'} do |f| %>
|
||||
|
||||
<%= render partial: 'meals/form', locals: {f: f} %>
|
||||
|
||||
<div class="tabular">
|
||||
<p>
|
||||
<%= submit_tag l(:button_create) %>
|
||||
<%= link_to l(:button_cancel), "#",
|
||||
onclick: '$("#new-meal").empty(); return false;' %>
|
||||
</p>
|
||||
</div>
|
||||
<% end %>
|
||||
<hr>
|
||||
0
app/views/meals/_show.html.erb
Normal file
0
app/views/meals/_show.html.erb
Normal file
11
app/views/meals/index.html.erb
Normal file
11
app/views/meals/index.html.erb
Normal file
@@ -0,0 +1,11 @@
|
||||
<div class="contextual">
|
||||
<%= render partial: 'meals/contextual' %>
|
||||
</div>
|
||||
|
||||
<div id="new-meal">
|
||||
</div>
|
||||
|
||||
<h2><%= t ".heading" %></h2>
|
||||
<div id='meals'>
|
||||
<%= render partial: 'meals/index' %>
|
||||
</div>
|
||||
2
app/views/meals/new.js.erb
Normal file
2
app/views/meals/new.js.erb
Normal file
@@ -0,0 +1,2 @@
|
||||
$('#new-meal')
|
||||
.html('<%= j render partial: 'meals/new_form' %>');
|
||||
Reference in New Issue
Block a user