From 4d48e8672828df6306fe54b17d67d60fee6d9695 Mon Sep 17 00:00:00 2001 From: cryptogopher Date: Fri, 27 Dec 2019 21:46:35 +0100 Subject: [PATCH] Added measurement filtering --- app/controllers/measurements_controller.rb | 15 ++++++++-- app/helpers/measurements_helper.rb | 2 +- app/views/measurements/_filters.html.erb | 34 ++++++++++++++++++++++ app/views/measurements/_index.html.erb | 3 ++ app/views/measurements/_options.html.erb | 2 +- app/views/measurements/_readouts.html.erb | 6 +++- config/routes.rb | 3 ++ init.rb | 2 +- 8 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 app/views/measurements/_filters.html.erb diff --git a/app/controllers/measurements_controller.rb b/app/controllers/measurements_controller.rb index 4f83655..eb00545 100644 --- a/app/controllers/measurements_controller.rb +++ b/app/controllers/measurements_controller.rb @@ -2,7 +2,7 @@ class MeasurementsController < ApplicationController menu_item :body_trackers before_action :init_session_filters - before_action :find_project_by_project_id, only: [:index, :new, :create] + before_action :find_project_by_project_id, only: [:index, :new, :create, :filter] before_action :find_quantity_by_quantity_id, only: [:toggle_column] before_action :find_measurement, only: [:edit, :update, :destroy, :retake, :readouts, :toggle_column] @@ -68,6 +68,13 @@ class MeasurementsController < ApplicationController render :index end + def filter + session[:m_filters][:name] = params[:filters][:name] + session[:m_filters][:formula] = params[:filters][:formula] + readouts_view? ? prepare_readouts : prepare_measurements + render :index + end + private def init_session_filters @@ -105,10 +112,14 @@ class MeasurementsController < ApplicationController end def prepare_readouts - @quantities = @measurement.column_view.quantities + @scoping_measurement = @project.measurements.where(session[:m_filters][:scope]).first! + @quantities = @scoping_measurement.column_view.quantities @measurements, @requested_r, @extra_r, @formula_q = @project.measurements .includes(:source) .filter(session[:m_filters], @quantities) + rescue ActiveRecord::RecordNotFound + session[:m_filters][:scope] = {} + render_404 end def readouts_view? diff --git a/app/helpers/measurements_helper.rb b/app/helpers/measurements_helper.rb index f509984..484b873 100644 --- a/app/helpers/measurements_helper.rb +++ b/app/helpers/measurements_helper.rb @@ -16,7 +16,7 @@ module MeasurementsHelper def toggle_column_options disabled = [] - enabled_columns = @measurement.column_view.quantities + enabled_columns = @scoping_measurement.column_view.quantities options = nested_set_options(@project.quantities.measurement) do |q| disabled << q.id if enabled_columns.include?(q) raw("#{' ' * q.level}#{q.name}") diff --git a/app/views/measurements/_filters.html.erb b/app/views/measurements/_filters.html.erb new file mode 100644 index 0000000..5d53a83 --- /dev/null +++ b/app/views/measurements/_filters.html.erb @@ -0,0 +1,34 @@ +
+ <%= l(:label_filter_plural) %> +
+ <%= error_messages_for @formula_q %> + + <%= form_tag url, id: 'filters-form', name: 'filters-form', + method: :get, remote: true do %> + + + + + + + + +
+ <%= text_field_tag 'filters[name]', session[:m_filters][:name], placeholder: 'name', + onblur: '$("#filters-form").submit(); return false;' %> + + <%= text_field_tag 'filters[formula]', session[:m_filters][:formula], + placeholder: 'conditional expression including readouts', size: 40, + style: 'box-sizing:border-box; width:100%;', + onblur: '$("#filters-form").submit(); return false;' %> + + <%= link_to l(:button_apply), '#', class: "icon icon-checked", + onclick: '$("#filters-form").submit(); return false;' %> + + <%= link_to l(:button_clear), '#', class: "icon icon-reload", + onclick: '$("#filters-form input, #filters-form select").val(""); + $("#filters-form").submit(); return false;' %> +
+ <% end %> +
+
diff --git a/app/views/measurements/_index.html.erb b/app/views/measurements/_index.html.erb index 365a7a7..dc4d5bc 100644 --- a/app/views/measurements/_index.html.erb +++ b/app/views/measurements/_index.html.erb @@ -1,3 +1,6 @@ +<%= render partial: 'measurements/filters', + locals: {url: filter_project_measurements_path(@project)} %> + <% if @measurements.any? { |m| m.persisted? } %> diff --git a/app/views/measurements/_options.html.erb b/app/views/measurements/_options.html.erb index e9c8b89..723656a 100644 --- a/app/views/measurements/_options.html.erb +++ b/app/views/measurements/_options.html.erb @@ -1,7 +1,7 @@
<%= l(:label_options) %>
- <%= form_tag toggle_column_measurement_path(@measurement), + <%= form_tag toggle_column_measurement_path(@scoping_measurement), id: 'toggle-column-form', name: 'toggle-column-form', method: :post, remote: true do %> diff --git a/app/views/measurements/_readouts.html.erb b/app/views/measurements/_readouts.html.erb index d2ad351..18de1fd 100644 --- a/app/views/measurements/_readouts.html.erb +++ b/app/views/measurements/_readouts.html.erb @@ -1,3 +1,6 @@ +<%= render partial: 'measurements/filters', + locals: {url: filter_project_measurements_path(@project)} %> + <% if @measurements.any? %> <%= render partial: 'measurements/options' %> @@ -9,7 +12,8 @@ <% @quantities.each do |q| %>
- <%= link_to '', toggle_column_measurement_path(@measurement, quantity_id: q.id), + <%= link_to '', + toggle_column_measurement_path(@scoping_measurement, quantity_id: q.id), {class: "icon icon-close", method: :post, remote: true} %>
<%= q.name %> diff --git a/config/routes.rb b/config/routes.rb index 3973638..acc2c91 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,6 +11,9 @@ resources :projects, shallow: true do get 'readouts' post 'toggle_column' end + collection do + get 'filter' + end end resources :ingredients, only: [:index, :create, :destroy] do post 'toggle', on: :member diff --git a/init.rb b/init.rb index a661d12..6ab3b67 100644 --- a/init.rb +++ b/init.rb @@ -16,7 +16,7 @@ Redmine::Plugin.register :body_tracking do project_module :body_tracking do permission :view_body_trackers, { body_trackers: [:index], - measurements: [:index, :readouts], + measurements: [:index, :readouts, :filter], ingredients: [:index, :nutrients, :filter, :filter_nutrients], sources: [:index], quantities: [:index, :parents, :filter],