diff options
| -rw-r--r-- | app/assets/javascripts/select2.coffee | 2 | ||||
| -rw-r--r-- | app/assets/stylesheets/components/_forms.sass | 3 | ||||
| -rw-r--r-- | app/controllers/referential_vehicle_journeys_controller.rb | 8 | ||||
| -rw-r--r-- | app/helpers/table_builder_helper/column.rb | 2 | ||||
| -rw-r--r-- | app/models/chouette/vehicle_journey.rb | 19 | ||||
| -rw-r--r-- | app/views/referential_vehicle_journeys/_filters.html.slim | 13 | ||||
| -rw-r--r-- | app/views/referential_vehicle_journeys/index.html.slim | 7 | ||||
| -rw-r--r-- | config/locales/vehicle_journeys.en.yml | 2 | ||||
| -rw-r--r-- | config/locales/vehicle_journeys.fr.yml | 2 | ||||
| -rw-r--r-- | spec/controllers/referential_vehicle_journeys_controller_spec.rb | 50 |
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 |
