aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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.rb8
-rw-r--r--app/helpers/table_builder_helper/column.rb2
-rw-r--r--app/models/chouette/vehicle_journey.rb19
-rw-r--r--app/views/referential_vehicle_journeys/_filters.html.slim13
-rw-r--r--app/views/referential_vehicle_journeys/index.html.slim7
-rw-r--r--config/locales/vehicle_journeys.en.yml2
-rw-r--r--config/locales/vehicle_journeys.fr.yml2
-rw-r--r--spec/controllers/referential_vehicle_journeys_controller_spec.rb50
10 files changed, 71 insertions, 37 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..3f3f3d9e6 100644
--- a/app/controllers/referential_vehicle_journeys_controller.rb
+++ b/app/controllers/referential_vehicle_journeys_controller.rb
@@ -19,14 +19,16 @@ 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
+ @q = @q.starting_with(@starting_stop&.id)
+ @q = @q.ending_with(@ending_stop&.id)
@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 028cd18dd..e17376612 100644
--- a/app/models/chouette/vehicle_journey.rb
+++ b/app/models/chouette/vehicle_journey.rb
@@ -52,6 +52,25 @@ module Chouette
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..45611fdde 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 :end, 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 :start, 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'
diff --git a/config/locales/vehicle_journeys.en.yml b/config/locales/vehicle_journeys.en.yml
index 0c8a75b0c..1fa2618dd 100644
--- a/config/locales/vehicle_journeys.en.yml
+++ b/config/locales/vehicle_journeys.en.yml
@@ -40,6 +40,7 @@ en:
label: Journey departure range
start: Start
end: End
+ ending_stop: "Arrival"
infos: Informations
set: "Set"
show_arrival_time: "Show and edit arrival times"
@@ -49,6 +50,7 @@ en:
slide_departure: "departure time at first stop"
slide_title: "Shift all vehicle passing times"
slide: "Shift"
+ starting_stop: "Departure"
stop_title: "Stop"
submit_frequency_edit: "Edit frequency vehicle journey"
submit_frequency: "Create frequency vehicle journey"
diff --git a/config/locales/vehicle_journeys.fr.yml b/config/locales/vehicle_journeys.fr.yml
index 1034a3fba..a43fa4580 100644
--- a/config/locales/vehicle_journeys.fr.yml
+++ b/config/locales/vehicle_journeys.fr.yml
@@ -40,6 +40,7 @@ fr:
label: Plage horaire au départ de la course
start: Début
end: Fin
+ ending_stop: "Arrivée"
infos: Informations
set: "Fixer"
show_arrival_time: "Afficher et éditer les horaires d'arrivée"
@@ -49,6 +50,7 @@ fr:
slide_departure: "horaire de départ au 1° arrêt à"
slide_title: "Décaler l'ensemble des horaires de course"
slide: "Décaler"
+ starting_stop: "Origine"
stop_title: "Arrêt"
submit_frequency_edit: "Editer course en fréquence"
submit_frequency: "Créer course en fréquence"
diff --git a/spec/controllers/referential_vehicle_journeys_controller_spec.rb b/spec/controllers/referential_vehicle_journeys_controller_spec.rb
index cc6b44b9d..6b77208a4 100644
--- a/spec/controllers/referential_vehicle_journeys_controller_spec.rb
+++ b/spec/controllers/referential_vehicle_journeys_controller_spec.rb
@@ -44,7 +44,8 @@ RSpec.describe ReferentialVehicleJourneysController, type: :controller do
get :index, referential_id: referential, q: q
}
- let(:stop_area_ids){ [] }
+ let(:from_area_id){ nil }
+ let(:to_area_id){ nil }
def create_journey_pattern_with_stop_areas(*stop_areas)
j = create(:journey_pattern)
@@ -56,40 +57,35 @@ RSpec.describe ReferentialVehicleJourneysController, type: :controller do
j
end
- let(:q){ {stop_area_ids: stop_area_ids}}
- let(:stop_area_1){ create :stop_area }
- let(:stop_area_2){ create :stop_area }
- let!(:journey_1){ create_journey_pattern_with_stop_areas(stop_area_1)}
- let!(:journey_2){ create_journey_pattern_with_stop_areas(stop_area_2)}
- let!(:journey_1_and_2){ create_journey_pattern_with_stop_areas(stop_area_1, stop_area_2)}
- let!(:vehicle_journey_1){ create(:vehicle_journey, journey_pattern: journey_1)}
- let!(:vehicle_journey_2){ create(:vehicle_journey, journey_pattern: journey_2)}
- let!(:vehicle_journey_1_and_2){ create(:vehicle_journey, journey_pattern: journey_1_and_2)}
-
- context "with one stop" do
- let(:stop_area_ids){[stop_area_1.id]}
+ let(:q){ {stop_areas: {start: from_area_id, end: to_area_id}} }
+ let(:journey_pattern){ create(:journey_pattern) }
+ let(:journey_pattern_2){ create(:journey_pattern) }
+
+ let!(:vehicle_journey_1){ create(:vehicle_journey, journey_pattern: journey_pattern)}
+ let!(:vehicle_journey_2){ create(:vehicle_journey, journey_pattern: journey_pattern_2)}
+
+ context "with the start stop" do
+ let(:from_area_id){ vehicle_journey_1.stop_areas.first.id }
it "should apply filters" do
- expect(vehicle_journey_1.stop_areas).to include stop_area_1
- expect(vehicle_journey_2.stop_areas).to_not include stop_area_1
- expect(vehicle_journey_1_and_2.stop_areas).to include stop_area_1
expect(assigns[:vehicle_journeys]).to include(vehicle_journey_1)
expect(assigns[:vehicle_journeys]).to_not include(vehicle_journey_2)
- expect(assigns[:vehicle_journeys]).to include(vehicle_journey_1_and_2)
end
end
- context "with 2 stops" do
- let(:stop_area_ids){[stop_area_1.id, stop_area_2.id]}
+ context "with the end stop" do
+ let(:to_area_id){ vehicle_journey_1.stop_areas.last.id }
it "should apply filters" do
- expect(vehicle_journey_1.stop_areas).to include stop_area_1
- expect(vehicle_journey_1.stop_areas).to_not include stop_area_2
- expect(vehicle_journey_2.stop_areas).to include stop_area_2
- expect(vehicle_journey_2.stop_areas).to_not include stop_area_1
- expect(vehicle_journey_1_and_2.stop_areas).to include stop_area_1
- expect(vehicle_journey_1_and_2.stop_areas).to include stop_area_2
- expect(assigns[:vehicle_journeys]).to_not include(vehicle_journey_1)
+ expect(assigns[:vehicle_journeys]).to include(vehicle_journey_1)
+ expect(assigns[:vehicle_journeys]).to_not include(vehicle_journey_2)
+ end
+ end
+
+ context "with both stops" do
+ let(:from_area_id){ vehicle_journey_1.stop_areas.first.id }
+ let(:to_area_id){ vehicle_journey_1.stop_areas.last.id }
+ it "should apply filters" do
+ expect(assigns[:vehicle_journeys]).to include(vehicle_journey_1)
expect(assigns[:vehicle_journeys]).to_not include(vehicle_journey_2)
- expect(assigns[:vehicle_journeys]).to include(vehicle_journey_1_and_2)
end
end
end