diff options
| -rw-r--r-- | app/controllers/referential_vehicle_journeys_controller.rb | 21 | ||||
| -rw-r--r-- | app/models/chouette/vehicle_journey.rb | 4 | ||||
| -rw-r--r-- | app/views/referential_vehicle_journeys/index.html.slim | 10 | 
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..84eb413d3 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]} " +      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' | 
