aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorZog2018-01-29 11:54:47 +0100
committercedricnjanga2018-02-06 11:04:59 -0800
commit5e1b7a06a9958580fc18a0a4e33ff66ea6adcdf9 (patch)
treebc05cba6cd5b2b594b5991f7b1d5b58ebdbddff1 /app
parentbde34143629e19273493fba8ba9e50bcd5f0c547 (diff)
downloadchouette-core-5e1b7a06a9958580fc18a0a4e33ff66ea6adcdf9.tar.bz2
Refs #5754; Add a filter on purchase_windows on ReferentialVJs#index
Diffstat (limited to 'app')
-rw-r--r--app/controllers/concerns/ransack_date_filter.rb5
-rw-r--r--app/controllers/referential_vehicle_journeys_controller.rb5
-rw-r--r--app/models/chouette/purchase_window.rb1
-rw-r--r--app/models/chouette/vehicle_journey.rb7
-rw-r--r--app/views/referential_vehicle_journeys/_filters.html.slim8
5 files changed, 23 insertions, 3 deletions
diff --git a/app/controllers/concerns/ransack_date_filter.rb b/app/controllers/concerns/ransack_date_filter.rb
index 0fbde91d3..99889294c 100644
--- a/app/controllers/concerns/ransack_date_filter.rb
+++ b/app/controllers/concerns/ransack_date_filter.rb
@@ -29,13 +29,14 @@ module RansackDateFilter
def ransack_period_range **options
return options[:scope] unless !!@begin_range && !!@end_range
+ scope = options[:scope]
if @begin_range > @end_range
flash.now[:error] = options[:error_message]
else
- scope = options[:scope].send options[:query], @begin_range..@end_range
+ scope = scope.send options[:query], @begin_range..@end_range
end
scope
end
end
-end \ No newline at end of file
+end
diff --git a/app/controllers/referential_vehicle_journeys_controller.rb b/app/controllers/referential_vehicle_journeys_controller.rb
index c3fcde0b1..385405b84 100644
--- a/app/controllers/referential_vehicle_journeys_controller.rb
+++ b/app/controllers/referential_vehicle_journeys_controller.rb
@@ -3,6 +3,10 @@
#
class ReferentialVehicleJourneysController < ChouetteController
include ReferentialSupport
+ include RansackDateFilter
+
+ before_action only: [:index] { set_date_time_params("purchase_window", Date) }
+
defaults :resource_class => Chouette::VehicleJourney, collection_name: :vehicle_journeys
requires_feature :referential_vehicle_journeys
@@ -12,6 +16,7 @@ class ReferentialVehicleJourneysController < ChouetteController
def collection
@q ||= end_of_association_chain
@q = @q.with_stop_area_ids(params[:q][:stop_area_ids]) if params[:q] && params[:q][:stop_area_ids]
+ @q = ransack_period_range(scope: @q, error_message: t('vehicle_journeys.errors.purchase_window'), query: :in_purchase_window)
@q = @q.ransack(params[:q])
@vehicle_journeys ||= @q.result.order(:published_journey_name).includes(:vehicle_journey_at_stops).paginate page: params[:page], per_page: params[:per_page] || 10
@all_companies = Chouette::Company.where("id IN (#{@referential.vehicle_journeys.select(:company_id).to_sql})").distinct
diff --git a/app/models/chouette/purchase_window.rb b/app/models/chouette/purchase_window.rb
index 22bcc1de1..334493015 100644
--- a/app/models/chouette/purchase_window.rb
+++ b/app/models/chouette/purchase_window.rb
@@ -18,6 +18,7 @@ module Chouette
validates_presence_of :name, :referential
scope :contains_date, ->(date) { where('date ? <@ any (date_ranges)', date) }
+ scope :overlap_dates, ->(date_range) { where('daterange(?, ?) && any (date_ranges)', date_range.first, date_range.last + 1.day) }
def self.ransackable_scopes(auth_object = nil)
[:contains_date]
diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb
index d94b69271..a252d4519 100644
--- a/app/models/chouette/vehicle_journey.rb
+++ b/app/models/chouette/vehicle_journey.rb
@@ -52,8 +52,15 @@ module Chouette
end
}
+ scope :in_purchase_window, ->(range){
+ purchase_windows = Chouette::PurchaseWindow.overlap_dates(range)
+ sql = purchase_windows.joins(:vehicle_journeys).select('vehicle_journeys.id').uniq.to_sql
+ where("id IN (#{sql})")
+ }
+
# We need this for the ransack object in the filters
ransacker :stop_area_ids
+ ransacker :purchase_window_date_gt
# TODO: Remove this validator
# We've eliminated this validation because it prevented vehicle journeys
diff --git a/app/views/referential_vehicle_journeys/_filters.html.slim b/app/views/referential_vehicle_journeys/_filters.html.slim
index 1301d3dab..af8b2de3a 100644
--- a/app/views/referential_vehicle_journeys/_filters.html.slim
+++ b/app/views/referential_vehicle_journeys/_filters.html.slim
@@ -21,10 +21,16 @@
= f.input :published_journey_name_gteq, label: false, wrapper_html: { class: 'w45'}
.form-group.w10.to= I18n.t('vehicle_journeys.form.to')
= f.input :published_journey_name_lteq, label: false, wrapper_html: { class: 'w45'}
-
.form-group.togglable
= f.label Chouette::StopArea.model_name.human.pluralize, required: false, class: 'control-label'
= f.input :stop_area_ids, collection: @all_stop_areas.select(:id, :name).order(name: :asc), checked: params[:q] && params[:q][:stop_area_ids], as: :check_boxes, label: false, label_method: lambda{|l| ("<span>" + l.name + "</span>").html_safe}, required: false, wrapper_html: { class: 'checkbox_list'}, multiple: true
+ .form-group.togglable
+ = f.label Chouette::VehicleJourney.human_attribute_name(:purchase_window), class: 'control-label'
+ .filter_menu
+ = f.simple_fields_for :purchase_window do |p|
+ = p.input :start_date, as: :date, label: t('simple_form.from'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @begin_range, include_blank: @begin_range ? false : true
+ = p.input :end_date, as: :date, label: t('simple_form.to'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @end_range, include_blank: @end_range ? false : true
+
.actions
= link_to 'Effacer', referential_vehicle_journeys_path(@referential), class: 'btn btn-link'