1
0

Added quantity filtering by domain

This commit is contained in:
cryptogopher 2019-11-21 01:28:03 +01:00
parent d3ba8579d6
commit 2ebbe9a306
12 changed files with 99 additions and 29 deletions

View File

@ -1,6 +1,7 @@
class IngredientsController < ApplicationController
require 'csv'
before_action :init_session_filters
before_action :find_project_by_project_id,
only: [:index, :nutrients, :create, :import, :filter, :filter_nutrients]
before_action :find_quantity, only: [:toggle_nutrient_column]
@ -54,13 +55,13 @@ class IngredientsController < ApplicationController
end
def filter
session[:filters] = params[:filters]
session[:i_filters] = params[:filters]
prepare_ingredients
render :toggle
end
def filter_nutrients
session[:filters] = params[:filters]
session[:i_filters] = params[:filters]
prepare_nutrients
render :toggle_nutrient_column
end
@ -167,6 +168,10 @@ class IngredientsController < ApplicationController
private
def init_session_filters
session[:i_filters] ||= {}
end
def ingredient_params
params.require(:ingredient).permit(
:name,
@ -197,13 +202,13 @@ class IngredientsController < ApplicationController
def prepare_ingredients
@ingredients, @formula_q = @project.ingredients.includes(:ref_unit, :source)
.filter(@project, session[:filters])
.filter(@project, session[:i_filters])
end
def prepare_nutrients
@quantities = @project.quantities.where(primary: true)
ingredients, requested_n, extra_n, @formula_q = @project.ingredients
.filter(@project, session[:filters], @quantities)
.filter(@project, session[:i_filters], @quantities)
@nutrients = {}
@extra_nutrients = {}

View File

@ -1,11 +1,12 @@
class QuantitiesController < ApplicationController
before_action :find_project_by_project_id, only: [:index, :create]
before_action :init_session_filters
before_action :find_project_by_project_id, only: [:index, :create, :filter]
before_action :find_quantity, only: [:destroy, :toggle, :up, :down, :left, :right]
before_action :authorize
def index
@quantity = @project.quantities.new
@quantities = @project.quantities
prepare_quantities
end
def create
@ -14,7 +15,7 @@ class QuantitiesController < ApplicationController
flash[:notice] = 'Created new quantity'
redirect_to project_quantities_url(@project)
else
@quantities = @project.quantities
prepare_quantities
render :index
end
end
@ -23,41 +24,51 @@ class QuantitiesController < ApplicationController
if @quantity.destroy
flash[:notice] = 'Deleted quantity'
end
@quantities = @project.quantities
prepare_quantities
render :toggle
end
def toggle
@quantity.toggle_primary!
@quantities = @project.quantities
prepare_quantities
end
def filter
session[:q_filters] = params[:filters]
prepare_quantities
render :toggle
end
def up
@quantity.move_left if @quantity.left_sibling.present?
@quantities = @project.quantities
prepare_quantities
render :toggle
end
def down
@quantity.move_right if @quantity.right_sibling.present?
@quantities = @project.quantities
prepare_quantities
render :toggle
end
def left
@quantity.move_to_right_of(@quantity.parent) if @quantity.parent.present?
@quantities = @project.quantities
prepare_quantities
render :toggle
end
def right
@quantity.move_to_child_of(@quantity.left_sibling) if @quantity.left_sibling.present?
@quantities = @project.quantities
prepare_quantities
render :toggle
end
private
def init_session_filters
session[:q_filters] ||= {}
end
def quantity_params
params[:quantity].delete(:formula) if params[:quantity][:formula].blank?
params.require(:quantity).permit(
@ -69,4 +80,8 @@ class QuantitiesController < ApplicationController
:primary
)
end
def prepare_quantities
@quantities = @project.quantities.filter(@project, session[:q_filters])
end
end

View File

@ -15,7 +15,7 @@ module IngredientsHelper
end
def visibility_options(selected)
options = [["all", nil], ["visible", 1], ["hidden", 0]]
options = [["visible", 1], ["hidden", 0]]
options_for_select(options, selected)
end

View File

@ -1,11 +1,15 @@
module QuantitiesHelper
def domain_options
translations = t('.domains')
translations = t('quantities.form.domains')
Quantity.domains.map do |k,v|
[translations[k.to_sym], k]
end
end
def domain_options_tag(selected)
options_for_select(domain_options, selected)
end
def parent_options(domain)
options = nested_set_options(@quantities.send(domain), @quantity) do |i|
raw("#{'&ensp;' * i.level}#{i.name}")

View File

@ -41,7 +41,7 @@ class Ingredient < ActiveRecord::Base
self.toggle!(:hidden)
end
def self.filter(project, filters = {}, requested_q = Quantity.none)
def self.filter(project, filters, requested_q = Quantity.none)
ingredients = all
if filters[:name].present?

View File

@ -34,4 +34,14 @@ class Quantity < ActiveRecord::Base
def calculate(inputs)
Formula.new(self.project, self.formula).calculate(inputs)
end
def self.filter(project, filters)
quantities = all
if filters[:domain].present?
quantities = quantities.where(domain: domains[filters[:domain]])
end
quantities
end
end

View File

@ -7,27 +7,28 @@
<table class="filter">
<tr>
<td>
<%= text_field_tag 'filters[name]', session[:filters][:name], placeholder: 'name',
:onblur => '$("#filters_form").submit(); return false;' %>
<%= text_field_tag 'filters[name]', session[:i_filters][:name], placeholder: 'name',
onblur: '$("#filters_form").submit(); return false;' %>
</td>
<td>
<%= select_tag 'filters[visibility]',
visibility_options(session[:filters][:visibility]),
:onchange => '$("#filters_form").submit(); return false;' %>
visibility_options(session[:i_filters][:visibility]),
prompt: t('.visibility_prompt'),
onchange: '$("#filters_form").submit(); return false;' %>
</td>
<td style="width:100%;">
<%= text_field_tag 'filters[nutrients]', session[:filters][:nutrients],
<%= text_field_tag 'filters[nutrients]', session[:i_filters][:nutrients],
placeholder: 'conditional expression including nutrients', size: 40,
:style => 'box-sizing:border-box; width:100%;',
:onblur => '$("#filters_form").submit(); return false;' %>
style: 'box-sizing:border-box; width:100%;',
onblur: '$("#filters_form").submit(); return false;' %>
</td>
<td>
<%= link_to l(:button_apply), '#', :class => "icon icon-checked",
:onclick => '$("#filters_form").submit(); return false;' %>
<%= link_to l(:button_apply), '#', class: "icon icon-checked",
onclick: '$("#filters_form").submit(); return false;' %>
</td>
<td>
<%= link_to l(:button_clear), '#', :class => "icon icon-reload",
:onclick => '$("#filters_form input, #filters_form select").val("");
<%= link_to l(:button_clear), '#', class: "icon icon-reload",
onclick: '$("#filters_form input, #filters_form select").val("");
$("#filters_form").submit(); return false;' %>
</td>
</tr>

View File

@ -0,0 +1,27 @@
<fieldset id="filters" class="collapsible">
<legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
<div>
<%= form_tag url, id: 'filters_form', method: :get, remote: true do %>
<table class="filter">
<tr>
<td style="width:100%;">
</td>
<td>
<%= select_tag 'filters[domain]', domain_options_tag(session[:q_filters][:domain]),
prompt: t('.domain_prompt'),
onchange: '$("#filters_form").submit(); return false;' %>
</td>
<td>
<%= link_to l(:button_apply), '#', class: "icon icon-checked",
onclick: '$("#filters_form").submit(); return false;' %>
</td>
<td>
<%= link_to l(:button_clear), '#', class: "icon icon-reload",
onclick: '$("#filters_form input, #filters_form select").val("");
$("#filters_form").submit(); return false;' %>
</td>
</tr>
</table>
<% end %>
</div>
</fieldset>

View File

@ -1,3 +1,6 @@
<%= render :partial => 'quantities/filters',
:locals => {:url => filter_project_quantities_path(@project)} %>
<% if @quantities.any? { |q| q.persisted? } %>
<table class="list">
<thead>

View File

@ -67,6 +67,8 @@ en:
contextual:
link_import_ingredients: 'Import'
link_new_ingredient: 'New ingredient'
filters:
visibility_prompt: 'all'
import:
heading_import_ingredients: 'Import'
label_import_select_csv_file: 'Select CSV file'
@ -98,6 +100,8 @@ en:
heading_new_source: 'New source'
link_new_source: 'New source'
quantities:
filters:
domain_prompt: 'all'
index:
heading: 'Quantities'
heading_new_quantity: 'New quantity'

View File

@ -21,6 +21,7 @@ resources :projects do
resources :quantities, :only => [:index, :create, :destroy] do
post 'toggle', on: :member
post 'up', 'down', 'left', 'right', on: :member
get 'filter', on: :collection
end
resources :units, :only => [:index, :create, :destroy]
end

View File

@ -19,7 +19,7 @@ Redmine::Plugin.register :body_tracking do
:measurements => [:index],
:ingredients => [:index, :nutrients, :filter, :filter_nutrients],
:sources => [:index],
:quantities => [:index],
:quantities => [:index, :filter],
:units => [:index],
}, read: true
permission :manage_common, {