Added nutrient view on ingredients index
Created custom plugin's stylesheet
This commit is contained in:
parent
9664df4888
commit
0001b56ca6
@ -1,7 +1,7 @@
|
|||||||
class IngredientsController < ApplicationController
|
class IngredientsController < ApplicationController
|
||||||
require 'csv'
|
require 'csv'
|
||||||
|
|
||||||
before_action :find_project_by_project_id, only: [:index, :create, :import]
|
before_action :find_project_by_project_id, only: [:index, :create, :import, :nutrients]
|
||||||
before_action :find_ingredient, only: [:destroy]
|
before_action :find_ingredient, only: [:destroy]
|
||||||
before_action :authorize
|
before_action :authorize
|
||||||
|
|
||||||
@ -133,6 +133,23 @@ class IngredientsController < ApplicationController
|
|||||||
redirect_to project_ingredients_url(@project)
|
redirect_to project_ingredients_url(@project)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def nutrients
|
||||||
|
ingredients = @project.ingredients.includes(:ref_unit, nutrients: [:quantity, :unit])
|
||||||
|
@header = @project.quantities.where(displayed: true)
|
||||||
|
@nutrients = Hash.new { |h,k| h[k] = {} }
|
||||||
|
@descriptions = Hash.new { |h,k| h[k] = [] }
|
||||||
|
ingredients.each do |i|
|
||||||
|
i.nutrients.sort_by { |n| n.quantity.lft }.each do |n|
|
||||||
|
if @header.include?(n.quantity)
|
||||||
|
@nutrients[i.name][n.quantity_id] = "#{n.amount} [#{n.unit.shortname}]"
|
||||||
|
else
|
||||||
|
@descriptions[i.name] << "#{n.quantity.name}: #{n.amount} [#{n.unit.shortname}]"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@descriptions.each { |k, v| @descriptions[k] = v.join(", ") }
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def ingredient_params
|
def ingredient_params
|
||||||
|
@ -3,8 +3,10 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<div class="contextual">
|
<div class="contextual">
|
||||||
|
<%= link_to t(".heading_nutrient_view"), nutrients_project_ingredients_path(@project),
|
||||||
|
:class => 'icon icon-stats' %>
|
||||||
<% if User.current.allowed_to?(:manage_common, @project) %>
|
<% if User.current.allowed_to?(:manage_common, @project) %>
|
||||||
<%= link_to t(".heading_import_ingredients"), '#', :class => 'icon icon-file',
|
<%= link_to t(".heading_import_ingredients"), '#', :class => 'icon icon-multiple',
|
||||||
:onclick => 'showAndScrollTo("import-ingredients", "filename"); return false;' %>
|
:onclick => 'showAndScrollTo("import-ingredients", "filename"); return false;' %>
|
||||||
<%= link_to t(".heading_new_ingredient"), '#', :class => 'icon icon-add',
|
<%= link_to t(".heading_new_ingredient"), '#', :class => 'icon icon-add',
|
||||||
:onclick => 'showAndScrollTo("add-ingredient", "ingredient_name"); return false;' %>
|
:onclick => 'showAndScrollTo("add-ingredient", "ingredient_name"); return false;' %>
|
||||||
|
34
app/views/ingredients/nutrients.html.erb
Normal file
34
app/views/ingredients/nutrients.html.erb
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<% content_for :sidebar do %>
|
||||||
|
<%= render :partial => 'body_trackers/sidebar' %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<div class="contextual">
|
||||||
|
<%= link_to t(".heading_ingredient_list"), project_ingredients_path(@project),
|
||||||
|
:class => 'icon icon-list' %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2><%= t ".heading" %></h2>
|
||||||
|
<% if @nutrients.any? %>
|
||||||
|
<table class="nutrients list">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th><%= l(:field_name) %></th>
|
||||||
|
<% @header.each do |q| %>
|
||||||
|
<th><%= q.name %></th>
|
||||||
|
<% end %>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<% @nutrients.each do |name, values| %>
|
||||||
|
<tr class="ingredient">
|
||||||
|
<td class="name"><%= name %></td>
|
||||||
|
<% @header.each do |q| %>
|
||||||
|
<td class="value"><%= values[q.id] || '-' %></td>
|
||||||
|
<% end %>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<% else %>
|
||||||
|
<p class="nodata"><%= l(:label_no_data) %></p>
|
||||||
|
<% end %>
|
3
app/views/layouts/_body_tracking.html.erb
Normal file
3
app/views/layouts/_body_tracking.html.erb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<% content_for :header_tags do %>
|
||||||
|
<%= stylesheet_link_tag 'body_tracking', :plugin => 'body_tracking' %>
|
||||||
|
<% end %>
|
1
assets/stylesheets/body_tracking.css
Normal file
1
assets/stylesheets/body_tracking.css
Normal file
@ -0,0 +1 @@
|
|||||||
|
table.nutrients td.value {text-align:right;}
|
@ -38,6 +38,7 @@ en:
|
|||||||
ingredients:
|
ingredients:
|
||||||
index:
|
index:
|
||||||
heading: 'Ingredients'
|
heading: 'Ingredients'
|
||||||
|
heading_nutrient_view: 'Nutrient view'
|
||||||
heading_import_ingredients: 'Import'
|
heading_import_ingredients: 'Import'
|
||||||
heading_new_ingredient: 'New ingredient'
|
heading_new_ingredient: 'New ingredient'
|
||||||
label_import_select_csv_file: 'Select CSV file'
|
label_import_select_csv_file: 'Select CSV file'
|
||||||
@ -50,6 +51,9 @@ en:
|
|||||||
Sample header: "Name,Reference,Group,Proteins[g],Fats[g],Carbohydrates[g]".
|
Sample header: "Name,Reference,Group,Proteins[g],Fats[g],Carbohydrates[g]".
|
||||||
Sample data row: "Brussels,100[g],other,3.4,300[mg],9".
|
Sample data row: "Brussels,100[g],other,3.4,300[mg],9".
|
||||||
Unit given in data row has precedence over that specified in header.'
|
Unit given in data row has precedence over that specified in header.'
|
||||||
|
nutrients:
|
||||||
|
heading: 'Nutrients'
|
||||||
|
heading_ingredient_list: 'Ingredient list'
|
||||||
form:
|
form:
|
||||||
button_add_nutrient: 'Add nutrient'
|
button_add_nutrient: 'Add nutrient'
|
||||||
button_delete_nutrient: 'Delete'
|
button_delete_nutrient: 'Delete'
|
||||||
|
@ -8,6 +8,7 @@ resources :projects do
|
|||||||
end
|
end
|
||||||
resources :ingredients, :only => [:index, :create, :destroy] do
|
resources :ingredients, :only => [:index, :create, :destroy] do
|
||||||
post 'import', on: :collection
|
post 'import', on: :collection
|
||||||
|
get 'nutrients', on: :collection
|
||||||
end
|
end
|
||||||
resources :sources, :only => [:index, :create, :destroy]
|
resources :sources, :only => [:index, :create, :destroy]
|
||||||
resources :quantities, :only => [:index, :create, :destroy]
|
resources :quantities, :only => [:index, :create, :destroy]
|
||||||
|
4
init.rb
4
init.rb
@ -1,3 +1,5 @@
|
|||||||
|
require_dependency 'body_tracking/body_trackers_view_listener'
|
||||||
|
|
||||||
(Rails::VERSION::MAJOR < 5 ? ActionDispatch : ActiveSupport)::Reloader.to_prepare do
|
(Rails::VERSION::MAJOR < 5 ? ActionDispatch : ActiveSupport)::Reloader.to_prepare do
|
||||||
Project.include BodyTracking::ProjectPatch
|
Project.include BodyTracking::ProjectPatch
|
||||||
end
|
end
|
||||||
@ -13,7 +15,7 @@ Redmine::Plugin.register :body_tracking do
|
|||||||
project_module :body_tracking do
|
project_module :body_tracking do
|
||||||
permission :view_body_trackers, {
|
permission :view_body_trackers, {
|
||||||
:body_trackers => [:index],
|
:body_trackers => [:index],
|
||||||
:ingredients => [:index],
|
:ingredients => [:index, :nutrients],
|
||||||
:sources => [:index],
|
:sources => [:index],
|
||||||
:quantities => [:index],
|
:quantities => [:index],
|
||||||
:units => [:index],
|
:units => [:index],
|
||||||
|
5
lib/body_tracking/body_trackers_view_listener.rb
Normal file
5
lib/body_tracking/body_trackers_view_listener.rb
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
module BodyTracking
|
||||||
|
class BodyTrackersViewListener < Redmine::Hook::ViewListener
|
||||||
|
render_on :view_layouts_base_html_head, partial: 'layouts/body_tracking'
|
||||||
|
end
|
||||||
|
end
|
Reference in New Issue
Block a user