aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorAlban Peignier2018-02-20 14:27:22 +0100
committerGitHub2018-02-20 14:27:22 +0100
commit338a4df2491bebe0acd30c384665dd420899910c (patch)
tree23be5c137acab77020c5d3c340b1028db1c660a5 /app
parent6599a8d6a10e338fed38119115d12a3acb507e1b (diff)
parent30916d0303fb80d896c125f7531dac573bf97f11 (diff)
downloadchouette-core-338a4df2491bebe0acd30c384665dd420899910c.tar.bz2
Merge pull request #308 from af83/5911-stops-filter-on-referential-journeys-index
Better stops filters on ReferentialVJs#index. Refs #5911
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/select2.coffee2
-rw-r--r--app/assets/stylesheets/components/_forms.sass3
-rw-r--r--app/controllers/referential_vehicle_journeys_controller.rb16
-rw-r--r--app/helpers/table_builder_helper/column.rb2
-rw-r--r--app/models/chouette/vehicle_journey.rb38
-rw-r--r--app/views/referential_vehicle_journeys/_filters.html.slim13
-rw-r--r--app/views/referential_vehicle_journeys/index.html.slim7
7 files changed, 71 insertions, 10 deletions
diff --git a/app/assets/javascripts/select2.coffee b/app/assets/javascripts/select2.coffee
index 05b73dc6b..f34b5d5ce 100644
--- a/app/assets/javascripts/select2.coffee
+++ b/app/assets/javascripts/select2.coffee
@@ -4,7 +4,7 @@ bind_select2 = (el, cfg = {}) ->
theme: 'bootstrap'
language: 'fr'
placeholder: target.data('select2ed-placeholder')
- allowClear: false
+ allowClear: !!target.data('select2ed-allow-clear')
target.select2 $.extend({}, default_cfg, cfg)
diff --git a/app/assets/stylesheets/components/_forms.sass b/app/assets/stylesheets/components/_forms.sass
index caa8ac0e4..b13c5fc23 100644
--- a/app/assets/stylesheets/components/_forms.sass
+++ b/app/assets/stylesheets/components/_forms.sass
@@ -601,6 +601,9 @@ table, .table
white-space: nowrap
overflow: auto
+ &.stop-areas
+ min-width: 250px
+
> .filter_menu-item
display: block
margin: 0
diff --git a/app/controllers/referential_vehicle_journeys_controller.rb b/app/controllers/referential_vehicle_journeys_controller.rb
index e36ef8153..b07d6c600 100644
--- a/app/controllers/referential_vehicle_journeys_controller.rb
+++ b/app/controllers/referential_vehicle_journeys_controller.rb
@@ -19,14 +19,24 @@ class ReferentialVehicleJourneysController < ChouetteController
@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, prefix: :purchase_window)
@q = ransack_period_range(scope: @q, error_message: t('vehicle_journeys.errors.time_table'), query: :with_matching_timetable, prefix: :time_table)
+ @starting_stop = params[:q] && params[:q][:stop_areas] && params[:q][:stop_areas][:start].present? ? Chouette::StopArea.find(params[:q][:stop_areas][:start]) : nil
+ @ending_stop = params[:q] && params[:q][:stop_areas] && params[:q][:stop_areas][:end].present? ? Chouette::StopArea.find(params[:q][:stop_areas][:end]) : nil
+
+ if @starting_stop
+ @q =
+ unless @ending_stop
+ @q.with_stop_area_id(@starting_stop.id)
+ else
+ @q.with_ordered_stop_area_ids(@starting_stop.id, @ending_stop.id)
+ end
+ end
+
@q = @q.ransack(params[:q])
@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
diff --git a/app/helpers/table_builder_helper/column.rb b/app/helpers/table_builder_helper/column.rb
index b4c569882..05aa9f563 100644
--- a/app/helpers/table_builder_helper/column.rb
+++ b/app/helpers/table_builder_helper/column.rb
@@ -23,7 +23,7 @@ module TableBuilderHelper
end
def header_label(model = nil)
- return @name unless @name.empty?
+ return @name if @name.present?
# Transform `Chouette::Line` into "line"
model_key = model.to_s.demodulize.underscore
diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb
index 1a79db823..6209993de 100644
--- a/app/models/chouette/vehicle_journey.rb
+++ b/app/models/chouette/vehicle_journey.rb
@@ -52,6 +52,44 @@ module Chouette
end
}
+ scope :with_stop_area_id, ->(id){
+ if id.present?
+ joins(journey_pattern: :stop_points).where('stop_points.stop_area_id = ?', id)
+ else
+ all
+ end
+ }
+
+ scope :with_ordered_stop_area_ids, ->(first, second){
+ if first.present? && second.present?
+ joins(journey_pattern: :stop_points).
+ joins('INNER JOIN "journey_patterns" ON "journey_patterns"."id" = "vehicle_journeys"."journey_pattern_id" INNER JOIN "journey_patterns_stop_points" ON "journey_patterns_stop_points"."journey_pattern_id" = "journey_patterns"."id" INNER JOIN "stop_points" as "second_stop_points" ON "stop_points"."id" = "journey_patterns_stop_points"."stop_point_id"').
+ where('stop_points.stop_area_id = ?', first).
+ where('second_stop_points.stop_area_id = ? and stop_points.position < second_stop_points.position', second)
+ else
+ all
+ end
+ }
+
+ scope :starting_with, ->(id){
+ if id.present?
+ joins(journey_pattern: :stop_points).where('stop_points.position = 0 AND stop_points.stop_area_id = ?', id)
+ else
+ all
+ end
+ }
+
+ scope :ending_with, ->(id){
+ if id.present?
+ pattern_ids = all.select(:journey_pattern_id).uniq.map(&:journey_pattern_id)
+ pattern_ids = Chouette::JourneyPattern.where(id: pattern_ids).to_a.select{|jp| p "ici: #{jp.stop_points.order(:position).last.stop_area_id}" ; jp.stop_points.order(:position).last.stop_area_id == id.to_i}.map &:id
+ where(journey_pattern_id: pattern_ids)
+ else
+ all
+ 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
diff --git a/app/views/referential_vehicle_journeys/_filters.html.slim b/app/views/referential_vehicle_journeys/_filters.html.slim
index 3104e3a71..5f102ae1b 100644
--- a/app/views/referential_vehicle_journeys/_filters.html.slim
+++ b/app/views/referential_vehicle_journeys/_filters.html.slim
@@ -40,9 +40,18 @@
= 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 class=filter_item_class(params[:q], :stop_area_ids)
+ .form-group.togglable class=filter_item_class(params[:q], :stop_areas)
= 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
+ .filter_menu.stop-areas
+ = f.simple_fields_for :stop_areas do |p|
+ - json_url = referential_autocomplete_stop_areas_path(@referential, :format => :json)
+ - opts = {as: :select, label: false, required: false, wrapper_html: { class: 'filter_menu-item select2ed' }, input_html: {style: "width: 100%", data: { 'select2-ajax': 'true', 'select2ed-placeholder': '', url: json_url, 'select2ed-allow-clear': true}}}
+ - opts = opts.update({collection: [@starting_stop].compact, selected: @starting_stop&.id})
+ - opts[:input_html][:data][:'select2ed-placeholder'] = I18n.t('vehicle_journeys.form.starting_stop')
+ = p.input :start, opts
+ - opts = opts.update({collection: [@ending_stop].compact, selected: @ending_stop&.id})
+ - opts[:input_html][:data][:'select2ed-placeholder'] = I18n.t('vehicle_journeys.form.ending_stop')
+ = p.input :end, opts
.form-group.togglable class=filter_item_class(params[:q], :purchase_window)
= f.label Chouette::VehicleJourney.human_attribute_name(:purchase_window), class: 'control-label'
.filter_menu
diff --git a/app/views/referential_vehicle_journeys/index.html.slim b/app/views/referential_vehicle_journeys/index.html.slim
index ca1b1ecd9..04c01cc12 100644
--- a/app/views/referential_vehicle_journeys/index.html.slim
+++ b/app/views/referential_vehicle_journeys/index.html.slim
@@ -40,13 +40,14 @@
TableBuilderHelper::Column.new( \
key: :departure_time, \
attribute: Proc.new {|v| v.vehicle_journey_at_stops.first&.departure }, \
- sortable: true \
+ sortable: false, \
+ name: @starting_stop&.name, \
), \
- @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: true \
+ sortable: false, \
+ name: @ending_stop&.name, \
), \
].flatten.compact,
cls: 'table has-filter has-search'