aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlban Peignier2018-02-19 21:20:29 +0100
committerGitHub2018-02-19 21:20:29 +0100
commit85993d98b132f40d222bf4f68b6ca3baa3684b88 (patch)
tree43993881323ad93a13b459b3e05bc9c8dcbc73ec
parent0e44fcc6b5f97436e3956ae113d8cf56c54053f4 (diff)
parent839d7a12c4ffb4322dc28f1c4a475a83e4079fc2 (diff)
downloadchouette-core-85993d98b132f40d222bf4f68b6ca3baa3684b88.tar.bz2
Merge pull request #309 from af83/5919-make-coluns-sortable
Make ReferentialVJs#index sortable. Refs #5919
-rw-r--r--app/controllers/referential_vehicle_journeys_controller.rb21
-rw-r--r--app/models/chouette/vehicle_journey.rb4
-rw-r--r--app/views/referential_vehicle_journeys/index.html.slim10
3 files changed, 27 insertions, 8 deletions
diff --git a/app/controllers/referential_vehicle_journeys_controller.rb b/app/controllers/referential_vehicle_journeys_controller.rb
index 2ce28a5cc..e36ef8153 100644
--- a/app/controllers/referential_vehicle_journeys_controller.rb
+++ b/app/controllers/referential_vehicle_journeys_controller.rb
@@ -20,11 +20,30 @@ class ReferentialVehicleJourneysController < ChouetteController
@q = ransack_period_range(scope: @q, error_message: t('vehicle_journeys.errors.purchase_window'), query: :in_purchase_window, prefix: :purchase_window)
@q = ransack_period_range(scope: @q, error_message: t('vehicle_journeys.errors.time_table'), query: :with_matching_timetable, prefix: :time_table)
@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
+ @vehicle_journeys ||= @q.result
+ @vehicle_journeys = parse_order @vehicle_journeys
+ @vehicle_journeys = @vehicle_journeys.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
@all_stop_areas = Chouette::StopArea.where("id IN (#{@referential.vehicle_journeys.joins(:stop_areas).select("stop_areas.id").to_sql})").distinct
stop_area_ids = params[:q].try(:[], :stop_area_ids).try(:select, &:present?)
@filters_stop_areas = Chouette::StopArea.find(stop_area_ids) if stop_area_ids.present? && stop_area_ids.size <= 2
end
+ def parse_order scope
+ return scope.order(:published_journey_name) unless params[:sort].present?
+ direction = params[:direction] || "asc"
+ attributes = Chouette::VehicleJourney.column_names.map{|n| "vehicle_journeys.#{n}"}.join(',')
+ case params[:sort]
+ when "line"
+ scope.order("lines.name #{direction}").joins(route: :line)
+ when "route"
+ scope.order("routes.name #{direction}").joins(:route)
+ when "departure_time"
+ scope.joins(:vehicle_journey_at_stops).group(attributes).select(attributes).order("MIN(vehicle_journey_at_stops.departure_time) #{direction}")
+ when "arrival_time"
+ scope.joins(:vehicle_journey_at_stops).group(attributes).select(attributes).order("MAX(vehicle_journey_at_stops.departure_time) #{direction}")
+ else
+ scope.order "#{params[:sort]} #{direction}"
+ end
+ end
end
diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb
index 4a6ba3f75..028cd18dd 100644
--- a/app/models/chouette/vehicle_journey.rb
+++ b/app/models/chouette/vehicle_journey.rb
@@ -381,8 +381,8 @@ module Chouette
end
def self.lines
- lines_query = joins(:route).select("routes.line_id").to_sql
- Chouette::Line.where("id IN (#{lines_query})")
+ lines_query = joins(:route).select("routes.line_id").reorder(nil).except(:group).pluck(:'routes.line_id')
+ Chouette::Line.where(id: lines_query)
end
end
end
diff --git a/app/views/referential_vehicle_journeys/index.html.slim b/app/views/referential_vehicle_journeys/index.html.slim
index 69e29597c..ca1b1ecd9 100644
--- a/app/views/referential_vehicle_journeys/index.html.slim
+++ b/app/views/referential_vehicle_journeys/index.html.slim
@@ -25,28 +25,28 @@
link_to: lambda do |vehicle_journey| \
vehicle_journey.published_journey_name ? referential_line_route_vehicle_journeys_path(@referential, vehicle_journey.route.line, vehicle_journey.route) : '' \
end, \
- sortable: false \
+ sortable: true \
), \
TableBuilderHelper::Column.new( \
key: :line, \
attribute: Proc.new {|v| v.route.line.name}, \
- sortable: false \
+ sortable: true \
), \
TableBuilderHelper::Column.new( \
key: :route, \
attribute: Proc.new {|v| v.route.name}, \
- sortable: false \
+ sortable: true \
), \
TableBuilderHelper::Column.new( \
key: :departure_time, \
attribute: Proc.new {|v| v.vehicle_journey_at_stops.first&.departure }, \
- sortable: false \
+ sortable: true \
), \
@filters_stop_areas&.map{|s| table_builder_column_for_stop_area(s)},
TableBuilderHelper::Column.new( \
key: :arrival_time, \
attribute: Proc.new {|v| v.vehicle_journey_at_stops.last&.arrival }, \
- sortable: false \
+ sortable: true \
), \
].flatten.compact,
cls: 'table has-filter has-search'