diff options
| author | Xinhui | 2017-03-21 13:41:49 +0100 |
|---|---|---|
| committer | Xinhui | 2017-03-21 13:48:54 +0100 |
| commit | faa208a63066e0ac723765ff83c6d8b1df7eaead (patch) | |
| tree | eca0934c330a4d438d101a3fc0c67df2f2cc30d0 | |
| parent | 5f1e3df6e2c3d99740de3e03834a1ed5eba57bd1 (diff) | |
| download | chouette-core-faa208a63066e0ac723765ff83c6d8b1df7eaead.tar.bz2 | |
Refactoring workbench_controller & ransack_associated_lines filter
Refs #2799
| -rw-r--r-- | app/controllers/workbenches_controller.rb | 71 | ||||
| -rw-r--r-- | app/models/referential.rb | 1 | ||||
| -rw-r--r-- | app/views/workbenches/_filters.html.slim | 4 |
3 files changed, 46 insertions, 30 deletions
diff --git a/app/controllers/workbenches_controller.rb b/app/controllers/workbenches_controller.rb index cbbf1b058..7f108b266 100644 --- a/app/controllers/workbenches_controller.rb +++ b/app/controllers/workbenches_controller.rb @@ -1,27 +1,16 @@ class WorkbenchesController < BreadcrumbController - defaults :resource_class => Workbench - respond_to :html, :only => [:show] + before_action :query_params, only: [:show] + + defaults resource_class: Workbench + respond_to :html, only: [:show] def show - scope = Workbench.find(params[:id]) - scope = params[:q] ? scope.all_referentials : scope.referentials.ready - periode = ransack_periode - scope = scope.in_periode(periode) if periode - @q = scope.ransack(params[:q]) + scope = params[:q] ? resource.all_referentials : resource.referentials.ready + scope = ransack_associated_lines(scope) + @q = ransack_periode(scope).ransack(params[:q]) @q.organisation_name_eq_any ||= current_organisation.name unless params[:q] - @wbench_refs = @q.result - # @wbench_refs = Workbench.find(params[:id]).referentials - - case sort_column - when "lines" - @wbench_refs = @wbench_refs.joins(:metadatas).group("referentials.id").order("sum(array_length(referential_metadata.line_ids,1)) #{sort_direction}") - else - @wbench_refs = @wbench_refs.order("#{sort_column} #{sort_direction}") - end - - @wbench_refs = @wbench_refs.paginate(page: params[:page], per_page: 30) - + @wbench_refs = sort_result(@q.result).paginate(page: params[:page], per_page: 30) show! do build_breadcrumb :show end @@ -38,27 +27,49 @@ class WorkbenchesController < BreadcrumbController end private - def sort_column - (Workbench.find(params[:id]).referentials.column_names + %w{lines}).include?(params[:sort]) ? params[:sort] : 'name' + def resource + @workbench = Workbench.find params[:id] + end + + def sort_result collection + col = (Workbench.find(params[:id]).referentials.column_names + %w{lines}).include?(params[:sort]) ? params[:sort] : 'name' + dir = %w[asc desc].include?(params[:direction]) ? params[:direction] : 'asc' + if col == "lines" + collection.joins(:metadatas).group("referentials.id").order("sum(array_length(referential_metadata.line_ids,1)) #{dir}") + else + collection.order("#{col} #{dir}") + end end - def sort_direction - %w[asc desc].include?(params[:direction]) ? params[:direction] : 'asc' + def query_params + if params[:q].present? + params[:q].delete_if { |query, value| value.blank? } + end + end + + # Fake ransack filter + def ransack_associated_lines scope + if params[:q] && params[:q]['associated_lines_id_eq'] + scope = scope.include_metadatas_lines([params[:q]['associated_lines_id_eq']]) + params[:q].delete('associated_lines_id_eq') + end + scope end - def ransack_periode - return false unless params[:q] && params[:q]['validity_period'] + # Fake ransack filter + def ransack_periode scope + return scope unless params[:q] && params[:q]['validity_period'] periode = params[:q]['validity_period'] - return false if periode['end_lteq(1i)'].empty? || periode['begin_gteq(1i)'].empty? + return scope if periode['end_lteq(1i)'].empty? || periode['begin_gteq(1i)'].empty? - start_range = Date.civil(periode["begin_gteq(1i)"].to_i, periode["begin_gteq(2i)"].to_i, periode["begin_gteq(3i)"].to_i) + begin_range = Date.civil(periode["begin_gteq(1i)"].to_i, periode["begin_gteq(2i)"].to_i, periode["begin_gteq(3i)"].to_i) end_range = Date.civil(periode["end_lteq(1i)"].to_i, periode["end_lteq(2i)"].to_i, periode["end_lteq(3i)"].to_i) - if start_range > end_range + if begin_range > end_range flash.now[:error] = t('referentials.errors.validity_period') - false else - start_range..end_range + scope = scope.in_periode(begin_range..end_range) end + scope end end diff --git a/app/models/referential.rb b/app/models/referential.rb index 85d581c33..1b02bdd7a 100644 --- a/app/models/referential.rb +++ b/app/models/referential.rb @@ -44,6 +44,7 @@ class Referential < ActiveRecord::Base scope :ready, -> { where(ready: true) } scope :in_periode, ->(periode) { where(id: referential_ids_in_periode(periode)) } + scope :include_metadatas_lines, ->(line_ids) { where('referential_metadata.line_ids && ARRAY[?]::bigint[]', line_ids) } def lines if metadatas.blank? diff --git a/app/views/workbenches/_filters.html.slim b/app/views/workbenches/_filters.html.slim index 9584a566d..1233d5c30 100644 --- a/app/views/workbenches/_filters.html.slim +++ b/app/views/workbenches/_filters.html.slim @@ -6,6 +6,10 @@ button.btn.btn-default type='submit' span.fa.fa-search + .input-group.search_bar + = f.label 'Ligne', required: false, class: 'control-label' + = f.input :associated_lines_id_eq, as: :select, collection: @workbench.lines.order(:name).map{|l| [l.name, l.id]}, input_html: {'data-select2ed': 'true'}, label: false + .ffg-row .form-group.togglable = f.label @wbench_refs.human_attribute_name(:status), required: false, class: 'control-label' |
