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 | 
