diff options
96 files changed, 1743 insertions, 576 deletions
| diff --git a/.gitignore b/.gitignore index cc3e0cd16..8b21c30a3 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,6 @@ chouette2.war  vendor/bundle  .ruby-version  coverage + +# IDE +.idea diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 212ccdff8..1ae76cd05 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -22,10 +22,12 @@  //= require footable/footable.filter  //= require footable/footable.paginate  //= require footable/footable.sort +//= require tools  //= require_directory ./plugins  //= require_directory .  //= require_directory ./stop_areas  //= require_directory ./vehicle_journeys +//= require_directory ./vehicle_journey_frequencies  //= require_directory ./import_tasks  //= require_directory ./compliance_check_tasks  //= require_directory ./compliance_checks diff --git a/app/assets/javascripts/timebands.js.coffee b/app/assets/javascripts/timebands.js.coffee new file mode 100644 index 000000000..24f83d18b --- /dev/null +++ b/app/assets/javascripts/timebands.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/tools.js.coffee b/app/assets/javascripts/tools.js.coffee new file mode 100644 index 000000000..b30eb6f15 --- /dev/null +++ b/app/assets/javascripts/tools.js.coffee @@ -0,0 +1,6 @@ +(($) -> +  $ -> +    $('.ce-hide').removeClass 'ce-hide' +    return +  return +) jQuery diff --git a/app/assets/javascripts/vehicle_journey.js.coffee b/app/assets/javascripts/vehicle_journey.js.coffee index 54b359b7a..caf505960 100644 --- a/app/assets/javascripts/vehicle_journey.js.coffee +++ b/app/assets/javascripts/vehicle_journey.js.coffee @@ -1,6 +1,6 @@  jQuery ->    swap_hour_minute = ( from, to) -> -    rows =  $('.vehicle_journeys tbody.journey_pattern_dependent_list tr.time') +    rows =  $('tbody.journey_pattern_dependent_list tr.time')      for row in rows        do (row) ->          $(row).find( to).find('.hour')[0].value = $(row).find( from).find('.hour')[0].value @@ -8,15 +8,15 @@ jQuery ->    copy_departures_to_arrivals = (event) ->      event.preventDefault() -    swap_hour_minute( '.departure_time', '.arrival_time') +    swap_hour_minute('.departure_time', '.arrival_time') -  $(document).on("click", '.vehicle_journeys a.to_arrivals', copy_departures_to_arrivals) +  $(document).on('click', '[data-ce-action="to_arrivals"]', copy_departures_to_arrivals)    copy_arrivals_to_departures = (event) ->      event.preventDefault() -    swap_hour_minute( '.arrival_time', '.departure_time') +    swap_hour_minute('.arrival_time', '.departure_time') -  $(document).on("click", '.vehicle_journeys a.to_departures', copy_arrivals_to_departures) +  $(document).on('click', '[data-ce-action="to_departures"]', copy_arrivals_to_departures)    switch_vehicle_journey_at_stops = (event) ->      event.preventDefault() @@ -72,4 +72,4 @@ jQuery ->      slide_to( '.departure_time', duration)      slide_to( '.arrival_time', duration) -  $(document).on("click", '.vehicle_journeys a.slide', slide)    
\ No newline at end of file +  $(document).on("click", '.vehicle_journeys a.slide', slide)     diff --git a/app/assets/javascripts/vehicle_journey_frequencies.js.coffee b/app/assets/javascripts/vehicle_journey_frequencies.js.coffee new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/app/assets/javascripts/vehicle_journey_frequencies.js.coffee diff --git a/app/assets/javascripts/vehicle_journey_frequencies/index.js.coffee b/app/assets/javascripts/vehicle_journey_frequencies/index.js.coffee new file mode 100644 index 000000000..4f4fccc18 --- /dev/null +++ b/app/assets/javascripts/vehicle_journey_frequencies/index.js.coffee @@ -0,0 +1,4 @@ +$(".vehicle_journey_frequencies.index").ready -> +  $( 'body' ).popover({html: true, trigger: "click", selector: '[rel="popover"]'}).on("show.bs.popover", (event)-> +    $('[aria-describedby]').click() +    $(event.target).data("bs.popover").tip().css("maxWidth", "350px")) diff --git a/app/assets/javascripts/vehicle_journeys/index.js.coffee b/app/assets/javascripts/vehicle_journeys/index.js.coffee index e89c3f519..02de558d4 100644 --- a/app/assets/javascripts/vehicle_journeys/index.js.coffee +++ b/app/assets/javascripts/vehicle_journeys/index.js.coffee @@ -4,4 +4,3 @@ $(".vehicle_journeys.index").ready ->    .on("show.bs.popover", (event)->      $(event.target).data("bs.popover").tip().css("maxWidth", "350px")) -       
\ No newline at end of file diff --git a/app/assets/stylesheets/application.css.scss.erb b/app/assets/stylesheets/application.css.scss.erb index 52405c14c..770e3c82b 100644 --- a/app/assets/stylesheets/application.css.scss.erb +++ b/app/assets/stylesheets/application.css.scss.erb @@ -17,6 +17,7 @@ $body-bg: #eee;  @import "modules/progress_bars";  // Partials +@import "partials/base";  @import "partials/header";  @import "partials/footer"; diff --git a/app/assets/stylesheets/main/layout.css.scss b/app/assets/stylesheets/main/layout.css.scss index 0a9ade3a8..aac5846c5 100644 --- a/app/assets/stylesheets/main/layout.css.scss +++ b/app/assets/stylesheets/main/layout.css.scss @@ -17,6 +17,10 @@ ol.breadcrumb{      margin-top: 10px;  } +.ce-hide { +  display: none; +} +  #middle{      min-height: 500px;      -webkit-box-shadow: 0 0 5px 2px rgba(0, 0, 0, .2); diff --git a/app/assets/stylesheets/main/lines.css.scss b/app/assets/stylesheets/main/lines.css.scss index 94201212a..e114a2338 100644 --- a/app/assets/stylesheets/main/lines.css.scss +++ b/app/assets/stylesheets/main/lines.css.scss @@ -78,7 +78,30 @@              display: inline;          }      } -}         - - +} +.ce-LineBlock-header-list { +  display: table; +  width: 100%; +  margin: 0; +  padding: 0; +  > li { +    display: table-cell; +    vertical-align: middle; +    > input { +      margin-top: 0; +    } +    &:first-child { +      width: 37px; +    } +    &:last-child { +      text-align: right; +      width: 73px; +    } +  } +} +.ce-LineBlock-header-title { +  padding: 0 !important; +  line-height: 12px; +  font-size: 13px; +} diff --git a/app/assets/stylesheets/main/timebands.css.scss b/app/assets/stylesheets/main/timebands.css.scss new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/app/assets/stylesheets/main/timebands.css.scss diff --git a/app/assets/stylesheets/main/vehicle_journey_frequencies.scss b/app/assets/stylesheets/main/vehicle_journey_frequencies.scss new file mode 100644 index 000000000..f973de209 --- /dev/null +++ b/app/assets/stylesheets/main/vehicle_journey_frequencies.scss @@ -0,0 +1,153 @@ +#workspace { +  .ce-TimeBandFormTable { +    .btn { +      white-space: normal; +      width: 130px; +    } +  } +  .ce-TimeBandFormTable th { +    text-align: left; +    padding: 6px 20px 6px 20px; +  } +  .ce-TimeBandFormTable td { +    padding: 6px 20px 6px 20px; +  } +  .ce-TimeBandFormTable td { +    vertical-align: middle; +  } +  .ce-TimeBandFormTable-circleLine { +    position: relative; +  } +  .ce-TimeBandFormTable-line:after { +    content: ''; +    position: absolute; +    top: 0; +    bottom: 0; +    left: 50%; +    width: 2px; +    margin-left: -1px; +    background-color: #61970b; +  } +  tr:first-child td .ce-TimeBandFormTable-line:after { +    top: 50%; +  } +  tr:last-child td .ce-TimeBandFormTable-line:after { +    bottom: 50%; +  } +  .ce-TimeBandFormTable-circle { +    position: relative; +    z-index: 999; +    display: block; +    width: 16px; +    height: 16px; +    border-radius: 8px; +    background-color: #4d7809; +  } +  tr:hover .ce-TimeBandFormTable-circle { +    background-color: #fff; +    border: 2px solid #61970b; +  } +  .ce-FrequencyFormFields { +    display: table; +    width: 100%; +    padding-left: 25%; +    .inline-errors { +      margin: 0; +    } +    > li { +      display: table-cell; +      width: 21%; +      vertical-align: top; +      padding:0 ; +      margin: 0; +      &:first-child select { +        width: 160px; +      } +      &:nth-last-child(2), &:last-child { +        width: 8%; +      } +      label { +        font-size: 13px; +        padding-left: 0; +      } +      legend { +        position: relative; +        width: auto; +        float: none; +        border: 0; +        label { +          position: relative; +        } +      } +      .fragments-group { +        float: none; +        width: auto; +        padding: 0; +        > li { +          display: inline-block; +          vertical-align: top; +        } +      } +    } +  } +  &.vehicle_journey_frequencies { +    .actions-add-fields { +      clear: both; +      padding-left: 25%; +      margin-top: 10px; +    } +  } +  td.ce-VehicleJourneyBlock-frequency { +    background-color: rgba(95, 95, 95, 0.2); +  } +  .ce-VehicleJourneyFrequencyTableBlock { +    margin: 0 !important; +  } +  .ce-VehicleJourneyFrequenciesMatrix { +    margin: 0; +    padding: 0; +    > li { +      background-color: #eee; +      height: 22px; +      margin-bottom: 20px; +      position: relative; +      > ul { +        margin: 0; +        padding: 0; +        > li { +          cursor: pointer; +          position: absolute; +          padding: 0 2px; +          top: 0; +          bottom: 0; +          background-color: $brand-primary; +          border-left: 1px solid #000; +          border-right: 1px solid #000; +          &:hover { +            z-index: 9999; +            background-color: #4d7809; +            top: -2px; +            bottom: -2px; +            > span { +              display: block; +            } +          } +        } +      } +    } +  } +  .ce-VehicleJourneyFrequenciesMatrix-firstDepartureTime, +  .ce-VehicleJourneyFrequenciesMatrix-lastDepartureTime { +    display: none; +    position: absolute; +    top: -13px; +    font-size: 11px; +    color: #262626; +  } +  .ce-VehicleJourneyFrequenciesMatrix-firstDepartureTime { +    left: -32px; +  } +  .ce-VehicleJourneyFrequenciesMatrix-lastDepartureTime { +    right: -32px; +  } +} diff --git a/app/assets/stylesheets/main/vehicle_journeys.css.scss b/app/assets/stylesheets/main/vehicle_journeys.css.scss index 119883fb4..6f67bc4b4 100644 --- a/app/assets/stylesheets/main/vehicle_journeys.css.scss +++ b/app/assets/stylesheets/main/vehicle_journeys.css.scss @@ -1,21 +1,30 @@ -// Place all the styles related to the routes controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: http://sass-lang.com/ - -#workspace.vehicle_journeys.edit, #workspace.vehicle_journeys.update, #workspace.vehicle_journeys.create, #workspace.vehicle_journeys.new { +#workspace.vehicle_journeys.edit, +#workspace.vehicle_journeys.update, +#workspace.vehicle_journeys.create, +#workspace.vehicle_journeys.new, +#workspace.vehicle_journey_frequencies.edit, +#workspace.vehicle_journey_frequencies.update, +#workspace.vehicle_journey_frequencies.create, +#workspace.vehicle_journey_frequencies.new {      #route_color{          width: 100px;          color: white;          font-weight: bold;      } +    .btn { +      padding: 6px 12px; +    } +      .time_table_list { padding-left: 25%; } -    #vehicle_journey_footnote_ids_input { +    #vehicle_journey_footnote_ids_input, +    #vehicle_journey_frequency_footnote_ids_input {          min-height: 3em;      } -    .vehicle_journey_at_stops { +    .vehicle_journey_at_stops, +    .vehicle_journey_frequency_at_stops {          margin-left: 25%;          thead, tbody, tfoot{ @@ -56,7 +65,8 @@      }  } -#workspace.vehicle_journeys.index +#workspace.vehicle_journeys.index, +#workspace.vehicle_journey_frequencies.index  {      #search{ @@ -95,39 +105,44 @@  } -#workspace.vehicle_journeys.show, #workspace.vehicle_journeys.edit, #workspace.vehicle_journeys.update, #workspace.vehicle_journeys.create, #workspace.vehicle_journeys.new { - -    .to_departures { -        cursor: pointer; -    } - -    .to_arrivals { -        cursor: pointer; -    } +#workspace.vehicle_journeys.show, +#workspace.vehicle_journeys.edit, +#workspace.vehicle_journeys.update, +#workspace.vehicle_journeys.create, +#workspace.vehicle_journeys.new, +#workspace.vehicle_journey_journey.show, +#workspace.vehicle_journey_journey.edit, +#workspace.vehicle_journey_journey.update, +#workspace.vehicle_journey_journey.create, +#workspace.vehicle_journey_journey.new {      .slide {          cursor: pointer;      }  } -#workspace.vehicle_journeys.show +#workspace.vehicle_journeys.show, +#workspace.vehicle_journey_frequencies.show  {      .summary p label {          font-weight: bold;      }  } -#workspace.vehicle_journeys.timeless +#workspace.vehicle_journeys.timeless, +#workspace.vehicle_journey_frequencies.timeless  {      .summary p label {          font-weight: bold;      } -    .vehicle_journeys { +    .vehicle_journeys, +    .vehicle_journey_frequencies {          margin-top: 20px;      } -    .vehicle_journey { +    .vehicle_journey, +    .vehicle_journey_frequency {          span.included_day_type {              font-weight: bolder; diff --git a/app/assets/stylesheets/partials/base.scss b/app/assets/stylesheets/partials/base.scss new file mode 100644 index 000000000..e4258c277 --- /dev/null +++ b/app/assets/stylesheets/partials/base.scss @@ -0,0 +1,23 @@ +.formtastic.timeband { +  .time_select { +    .fragments { +      .fragments-group { +        padding-left: 0; +      } +      legend.label { +        position: relative; +        width: auto; +        display: block; +        width: 25%; +        float: left; +        border: none; +        label { +          position: relative; +          width: auto; +          font-size: 125%; +          padding: .2em .6em .3em; +        } +      } +    } +  } +} diff --git a/app/assets/stylesheets/vendor/bootstrap_changes.css.scss b/app/assets/stylesheets/vendor/bootstrap_changes.css.scss index 67cf90ae4..6e2ccc1f6 100644 --- a/app/assets/stylesheets/vendor/bootstrap_changes.css.scss +++ b/app/assets/stylesheets/vendor/bootstrap_changes.css.scss @@ -11,6 +11,7 @@      span.included_day_type {          color: black; +        font-weight: bold;      }      span.excluded_day_type {      } @@ -32,3 +33,26 @@          color: $brand-success;      }  } +.popover-title { +  display: table; +  width: 100%; +  > a { +    display: table-cell; +    vertical-align: top; +    &:first-child { +      padding-right: 10px; +    } +    &:last-child { +      width: 32px; +    } +  } +} +.popover-content { +  > ul { +    margin: 0; +    padding: 0; +    > li { +      list-style: none !important; +    } +  } +} diff --git a/app/controllers/breadcrumb_controller.rb b/app/controllers/breadcrumb_controller.rb index 143651b52..29ecd262c 100644 --- a/app/controllers/breadcrumb_controller.rb +++ b/app/controllers/breadcrumb_controller.rb @@ -1,37 +1,37 @@  class BreadcrumbController < InheritedResources::Base    include BreadcrumbHelper -   +    def show -    show! do  +    show! do        build_breadcrumb :show      end    end -   +    def index -    index! do  +    index! do        build_breadcrumb :index      end    end -     +    def edit      edit! do        build_breadcrumb :edit      end    end -  def update  +  def update      update! do |success, failure|        build_breadcrumb :edit      end    end    def new -    new! do  +    new! do        build_breadcrumb :new      end    end -   +    def create      create! do |success, failure|        build_breadcrumb :new diff --git a/app/controllers/journey_patterns_controller.rb b/app/controllers/journey_patterns_controller.rb index ce59d00b6..b7cdccc72 100644 --- a/app/controllers/journey_patterns_controller.rb +++ b/app/controllers/journey_patterns_controller.rb @@ -36,7 +36,8 @@ class JourneyPatternsController < ChouetteController    def new_vehicle_journey      @vehicle_journey = Chouette::VehicleJourney.new(:route_id => route.id)      @vehicle_journey.update_journey_pattern(resource) -    render "vehicle_journeys/select_journey_pattern" +    vehicle_journey_category = params[:journey_category] ? "vehicle_journey_#{params[:journey_category]}" : 'vehicle_journey' +    render "#{vehicle_journey_category.pluralize}/select_journey_pattern"    end    # overwrite inherited resources to use delete instead of destroy diff --git a/app/controllers/timebands_controller.rb b/app/controllers/timebands_controller.rb new file mode 100644 index 000000000..446255cac --- /dev/null +++ b/app/controllers/timebands_controller.rb @@ -0,0 +1,20 @@ +class TimebandsController < ChouetteController + +  defaults :resource_class => Chouette::Timeband + +  respond_to :html + +  belongs_to :referential + +  def new +    new! do +      build_breadcrumb :new +    end +  end + +  private + +  def timeband_params +    params.require(:timeband).permit( :name, :start_time, :end_time ) +  end +end diff --git a/app/controllers/vehicle_journey_frequencies_controller.rb b/app/controllers/vehicle_journey_frequencies_controller.rb new file mode 100644 index 000000000..c12400775 --- /dev/null +++ b/app/controllers/vehicle_journey_frequencies_controller.rb @@ -0,0 +1,20 @@ +class VehicleJourneyFrequenciesController < VehicleJourneysController + +  defaults resource_class: Chouette::VehicleJourneyFrequency + +  private + +  def vehicle_journey_frequency_params +    params.require(:vehicle_journey_frequency).permit( { footnote_ids: [] } , :journey_pattern_id, :number, :published_journey_name, +                                             :published_journey_identifier, :comment, :transport_mode_name, +                                             :mobility_restricted_suitability, :flexible_service, :status_value, +                                             :facility, :vehicle_type_identifier, :objectid, :time_table_tokens, +                                             { date: [ :hour, :minute ] }, :button, :referential_id, :line_id, +                                             :route_id, :id, { vehicle_journey_at_stops_attributes: [ :arrival_time, +                                                                                                      :id, :_destroy, +                                                                                                      :stop_point_id, +                                                                                                      :departure_time] }, +                                             { journey_frequencies_attributes: [ :id, :_destroy, :scheduled_headway_interval, :first_departure_time, +                                                                                 :last_departure_time, :exact_time, :timeband_id ] } ) +    end +end diff --git a/app/controllers/vehicle_journeys_controller.rb b/app/controllers/vehicle_journeys_controller.rb index ace7aff5e..036816b21 100644 --- a/app/controllers/vehicle_journeys_controller.rb +++ b/app/controllers/vehicle_journeys_controller.rb @@ -28,7 +28,6 @@ class VehicleJourneysController < ChouetteController    def index      index! do -      @matrix ||= matrix        if collection.out_of_bounds?          redirect_to params.merge(:page => 1)        end @@ -50,10 +49,11 @@ class VehicleJourneysController < ChouetteController    def collection      unless @vehicle_journeys        @vehicle_filter = VehicleFilter.new adapted_params +      @vehicle_filter.journey_category_model = resource_class.model_name.route_key        @q = @vehicle_filter.vehicle_journeys.search @vehicle_filter.filtered_params        @vehicle_journeys = @q.result( :distinct => false ).paginate(:page => params[:page], :per_page => 8)      end - +    matrix      @vehicle_journeys    end    alias_method :vehicle_journeys, :collection @@ -74,20 +74,21 @@ class VehicleJourneysController < ChouetteController    end    def matrix -    {}.tap do |hash| -      vehicle_journeys.each do |vj| -        vj.vehicle_journey_at_stops.each do |vjas| -          hash[ "#{vj.id}-#{vjas.stop_point_id}"] = vjas -        end -      end -    end +    @matrix = resource_class.matrix(@vehicle_journeys)    end -    private    def vehicle_journey_params -    params.require(:vehicle_journey).permit( { footnote_ids: [] } , :journey_pattern_id, :number, :published_journey_name, :published_journey_identifier, :comment, :transport_mode_name, :mobility_restricted_suitability, :flexible_service, :status_value, :facility, :vehicle_type_identifier, :objectid, :time_table_tokens, { date: [ :hour, :minute ] }, :button, :referential_id, :line_id, :route_id, :id, { vehicle_journey_at_stops_attributes: [ :arrival_time, :id, :_destroy, :stop_point_id, :departure_time ] } ) +    params.require(:vehicle_journey).permit( { footnote_ids: [] } , :journey_pattern_id, :number, :published_journey_name, +                                             :published_journey_identifier, :comment, :transport_mode_name, +                                             :mobility_restricted_suitability, :flexible_service, :status_value, +                                             :facility, :vehicle_type_identifier, :objectid, :time_table_tokens, +                                             { date: [ :hour, :minute ] }, :button, :referential_id, :line_id, +                                             :route_id, :id, { vehicle_journey_at_stops_attributes: [ :arrival_time, +                                                                                                      :id, :_destroy, +                                                                                                      :stop_point_id, +                                                                                                      :departure_time] } )    end  end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index d3e9655b9..37b9d7a63 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -51,6 +51,8 @@ module ApplicationHelper        "group_of_lines"      when path.include?("/vehicle_journeys")        "vehicle_journeys" +    when path.include?("/vehicle_journey_frequencies") +      "vehicle_journeys"      when path.include?("/journey_patterns")        "journey_patterns"      when path.include?("/routes") @@ -67,6 +69,8 @@ module ApplicationHelper        "connection_links"      when path.include?("/time_tables")        "time_tables" +    when path.include?("/timebands") +      "timebands"      when path.include?("/rule_parameter_set")        "parametersets"      when path.include?("/import_tasks") diff --git a/app/helpers/breadcrumb_helper.rb b/app/helpers/breadcrumb_helper.rb index c98691b72..52da8b887 100644 --- a/app/helpers/breadcrumb_helper.rb +++ b/app/helpers/breadcrumb_helper.rb @@ -16,6 +16,8 @@ module BreadcrumbHelper        journey_pattern_breadcrumb action      when "Chouette::VehicleJourney"        vehicle_journey_breadcrumb action +    when "Chouette::VehicleJourneyFrequency" +      vehicle_journey_frequency_breadcrumb action      when "VehicleJourneyImport"        vehicle_journey_import_breadcrumb action      when "Chouette::StopArea" @@ -28,6 +30,8 @@ module BreadcrumbHelper        connection_link_breadcrumb action      when "Chouette::TimeTable"        time_table_breadcrumb action +    when "Chouette::Timeband" +      timeband_breadcrumb action      when "StopAreaCopy"        stop_area_copy_breadcrumb action      when "Import" @@ -102,6 +106,12 @@ module BreadcrumbHelper      add_breadcrumb breadcrumb_label(@time_table), referential_time_table_path(@referential, @time_table),:title => breadcrumb_tooltip(@time_table) if action == :edit    end +  def timeband_breadcrumb(action) +    referential_breadcrumb +    add_breadcrumb Chouette::Timeband.model_name.human(:count => 2), referential_timebands_path(@referential) unless action == :index +    add_breadcrumb breadcrumb_label(@timeband), referential_timeband_path(@referential, @timeband),:title => breadcrumb_tooltip(@timeband) if action == :edit +  end +    def line_breadcrumb(action)      referential_breadcrumb      add_breadcrumb Chouette::Line.model_name.human(:count => 2), referential_lines_path(@referential) unless action == :index @@ -124,6 +134,12 @@ module BreadcrumbHelper      add_breadcrumb breadcrumb_label(@vehicle_journey), referential_line_route_vehicle_journey_path(@referential, @line,@route,@vehicle_journey),:title => breadcrumb_tooltip(@vehicle_journey) if action == :edit    end +   def vehicle_journey_frequency_breadcrumb(action) +     route_breadcrumb :edit +     add_breadcrumb I18n.t("breadcrumbs.vehicle_journey_frequencies"), referential_line_route_vehicle_journey_frequencies_path(@referential, @line, @route) unless action == :index +     add_breadcrumb breadcrumb_label(@vehicle_journey_frequency), referential_line_route_vehicle_journey_frequency_path(@referential, @line,@route, @vehicle_journey_frequency),:title => breadcrumb_tooltip(@vehicle_journey_frequency) if action == :edit +   end +    def vehicle_journey_import_breadcrumb (action)      route_breadcrumb :edit    end diff --git a/app/helpers/timebands_helper.rb b/app/helpers/timebands_helper.rb new file mode 100644 index 000000000..51251e46f --- /dev/null +++ b/app/helpers/timebands_helper.rb @@ -0,0 +1,2 @@ +module TimebandsHelper +end diff --git a/app/helpers/vehicle_journey_frequencies_helper.rb b/app/helpers/vehicle_journey_frequencies_helper.rb new file mode 100644 index 000000000..1c603e4b1 --- /dev/null +++ b/app/helpers/vehicle_journey_frequencies_helper.rb @@ -0,0 +1,9 @@ +module VehicleJourneyFrequenciesHelper +  def journey_frequency_percent(journey_frequency) +    base = 100.0 / 2359.0 +    left = base * journey_frequency.first_departure_time.strftime("%H%M").to_i +    right = base * journey_frequency.last_departure_time.strftime("%H%M").to_i +    width = (right < left ? 100 - left : right - left) +    [left.round(2), width.round(2)] +  end +end diff --git a/app/helpers/vehicle_journeys_helper.rb b/app/helpers/vehicle_journeys_helper.rb index 95741f441..c5f3242be 100644 --- a/app/helpers/vehicle_journeys_helper.rb +++ b/app/helpers/vehicle_journeys_helper.rb @@ -16,18 +16,29 @@ module VehicleJourneysHelper      return "missing" if (is_present && is_present.departure_time.nil?)    end -  def vehicle_departure(vehicle) -    first_vjas = vehicle.vehicle_journey_at_stops.first -    return "" unless first_vjas.departure_time -    l(first_vjas.departure_time, :format => :hour).gsub( /  /, ' ')  +  def vehicle_departure(vehicle, departure_time=nil) +    unless departure_time +      first_vjas = vehicle.vehicle_journey_at_stops.first +      return '' unless first_vjas.departure_time +      departure_time = first_vjas.departure_time +    end +    l(departure_time, :format => :hour).gsub( /  /, ' ')    end -  def vehicle_title( vehicle) -    return t('vehicle_journeys.vehicle_journey.title_stopless', :name => vehicle_name( vehicle)) if vehicle.vehicle_journey_at_stops.empty? +  def vehicle_title(vehicle, journey_frequency=nil) +    return t("vehicle_journeys.vehicle_journey#{'_frequency' if vehicle.frequency?}.title_stopless", :name => vehicle_name( vehicle)) if vehicle.vehicle_journey_at_stops.empty?      first_vjas = vehicle.vehicle_journey_at_stops.first -    t('vehicle_journeys.vehicle_journey.title',  -          :stop => first_vjas.stop_point.stop_area.name, -          :time => vehicle_departure(vehicle)) +    if vehicle.frequency? && journey_frequency +      t("vehicle_journeys.vehicle_journey_frequency.title_frequency", +        :interval => l(journey_frequency.scheduled_headway_interval, format: :hour), +        :stop => first_vjas.stop_point.stop_area.name, +        :time_first => vehicle_departure(nil, journey_frequency.first_departure_time), +        :time_last => vehicle_departure(nil, journey_frequency.last_departure_time)) +    else +      t("vehicle_journeys.vehicle_journey#{'_frequency' if vehicle.frequency?}.title", +            :stop => first_vjas.stop_point.stop_area.name, +            :time => vehicle_departure(vehicle, (journey_frequency ? journey_frequency.first_departure_time : nil ))) +    end    end    def edit_vehicle_title( vehicle) diff --git a/app/models/referential.rb b/app/models/referential.rb index d50694c60..e32c956fb 100644 --- a/app/models/referential.rb +++ b/app/models/referential.rb @@ -79,6 +79,10 @@ class Referential < ActiveRecord::Base      Chouette::TimeTable.all    end +  def timebands +    Chouette::Timeband.all +  end +    def connection_links      Chouette::ConnectionLink.all    end diff --git a/app/models/vehicle_filter.rb b/app/models/vehicle_filter.rb index 64cc3e75a..13a302dc6 100644 --- a/app/models/vehicle_filter.rb +++ b/app/models/vehicle_filter.rb @@ -1,6 +1,7 @@  class VehicleFilter    attr_accessor :route    attr_accessor :q +  attr_accessor :journey_category_model    def initialize(attributes = {})      attributes.each do |name, value| @@ -17,9 +18,9 @@ class VehicleFilter    end    def vehicles_passing_time_filtered      if without_any_passing_time? -      route.vehicle_journeys.without_any_passing_time +      route.send(journey_category_model).without_any_passing_time      else -      route.sorted_vehicle_journeys +      route.sorted_vehicle_journeys(journey_category_model)      end    end    def vehicle_journeys diff --git a/app/views/help/timebands.textile b/app/views/help/timebands.textile new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/app/views/help/timebands.textile diff --git a/app/views/lines/_line.erb b/app/views/lines/_line.erb index 69c7978ab..b23992a1c 100644 --- a/app/views/lines/_line.erb +++ b/app/views/lines/_line.erb @@ -1,26 +1,26 @@ -<div id="index_item" class="panel panel-default line"> -  <div class="panel-heading"> -    <div class="panel-title clearfix"> -      <span class="pull-right">                 -        <%= link_to edit_referential_line_path(@referential, line), :class => "btn btn-default btn-sm" do %> +<div id="index_item" class="panel panel-default line ce-LineBlock"> +  <div class="panel-heading ce-LineBlock-header"> +    <ul class="ce-LineBlock-header-list"> +      <li> +        <%= check_box_tag "ids[]", line.id, false, class: "multiple_selection", style: "display: none;" %> +        <% if line.number && line.number.length <= 3 %> +          <span class="label label-default line_number" style="<%= number_style(line) %>"><%= line.number %></span> +        <% end %> +      </li> +      <li> +        <%= link_to([@referential, line], class: 'preview', title: "#{Chouette::Line.model_name.human.capitalize} #{line.name}") do %> +          <h5 class="ce-LineBlock-header-title"><%= truncate(line.name, length: 24) %></h5> +        <% end %> +      </li> +      <li> +        <%= link_to edit_referential_line_path(@referential, line), class: 'btn btn-default btn-sm' do %>            <span class="fa fa-pencil"></span> -        <% end  if edit %> -        <%= link_to referential_line_path(@referential, line), :method => :delete, :data => {:confirm =>  t('lines.actions.destroy_confirm')}, :class => "btn btn-danger btn-sm" do %> +        <% end if edit %> +        <%= link_to referential_line_path(@referential, line), method: :delete, data: { confirm:  t('lines.actions.destroy_confirm') }, class: 'btn btn-danger btn-sm' do %>            <span class="fa fa-trash-o"></span>          <% end if delete %> -      </span> -      <h5> -        <%= check_box_tag "ids[]", line.id, false, :class => "multiple_selection", :style => "display: none;" %> -        <% if line.number and line.number.length <= 3 %> -           <span class="label label-default line_number" style="<%= number_style(line) %>"><%= line.number %></span> -        <% end %>       -        <%= link_to([@referential, line], :class => "preview", :title => "#{Chouette::Line.model_name.human.capitalize} #{line.name}") do %>           -        <span class="name">           -          <%= truncate(line.name, :length => 20) %>           -        </span> -        <% end %> -      </h5> -    </div>                           +      </li> +    </ul>    </div>    <div class="panel-body">      <p> diff --git a/app/views/routes/_route.html.erb b/app/views/routes/_route.html.erb index 0fee47cd1..179f06a25 100644 --- a/app/views/routes/_route.html.erb +++ b/app/views/routes/_route.html.erb @@ -22,26 +22,33 @@      </div>                              </div>    <div class="panel-body"> -     <p> -  <% if route.journey_patterns.size > 0 %> -    <i class="fa fa-clock-o"></i><%= link_to t("vehicle_journeys.actions.index"), referential_line_route_vehicle_journeys_path(@referential, @line, route) %> -  <% else %>  -    <%= t('.no_journey_pattern')%>	 -  <% end%> -  </p> -  <p> -    <% if route.opposite_route %> -      <%= fonticon_wayback(route.opposite_route.wayback) %><%= link_to truncate(route.opposite_route.name, :length => 30), referential_line_route_path( @referential, @line, route.opposite_route) %> -    <% else %> -    <%= t('.no_opposite') %> +    <p> +      <% if route.journey_patterns.size > 0 %> +        <i class="fa fa-clock-o"></i> +        <%= link_to t("vehicle_journeys.actions.index"), referential_line_route_vehicle_journeys_path(@referential, @line, route) %> +      <% else %> +        <%= t('.no_journey_pattern')%> +      <% end%> +    </p> +    <% if @line.vehicle_journey_frequencies? %> +      <p> +        <i class="fa fa-clock-o"></i> +        <%= link_to t("vehicle_journey_frequencies.actions.index"), referential_line_route_vehicle_journey_frequencies_path(@referential, @line, route) %> +      </p>      <% end %> -  </p> -  <p> -    <% if ! route.direction.blank? %> -    <%= route.human_attribute_name('direction_code') %> : <%= t('directions.label.'+route.direction_code) %> -    <% else %> -    <br>   -    <% end %> -  </p> +    <p> +      <% if route.opposite_route %> +        <%= fonticon_wayback(route.opposite_route.wayback) %><%= link_to truncate(route.opposite_route.name, :length => 30), referential_line_route_path( @referential, @line, route.opposite_route) %> +      <% else %> +        <%= t('.no_opposite') %> +      <% end %> +    </p> +    <p> +      <% if ! route.direction.blank? %> +        <%= route.human_attribute_name('direction_code') %> : <%= t('directions.label.'+route.direction_code) %> +      <% else %> +        <br> +      <% end %> +    </p>    </div>  </div> diff --git a/app/views/shared/_header.erb b/app/views/shared/_header.erb index d1e8dd2ce..1e8a63fba 100644 --- a/app/views/shared/_header.erb +++ b/app/views/shared/_header.erb @@ -65,6 +65,10 @@                 <span class="badge pull-right"><%= @referential.time_tables.size %></span><%= Referential.human_attribute_name("time_tables") %>                <% end %>              </li> +            <li><%= link_to referential_timebands_path(@referential) do %> +                <span class="badge pull-right"><%= @referential.timebands.size %></span><%= Referential.human_attribute_name("timebands") %> +              <% end %> +            </li>            </ul>          </li>          <li><%= link_to Referential.human_attribute_name("imports"), referential_imports_path(@referential) %></li> diff --git a/app/views/timebands/_form.html.erb b/app/views/timebands/_form.html.erb new file mode 100644 index 000000000..bfa32212e --- /dev/null +++ b/app/views/timebands/_form.html.erb @@ -0,0 +1,12 @@ +<%= semantic_form_for [@referential, @timeband] do |form| %> +  <%= form.inputs do %> +    <%= form.input :name %> +    <%= form.input :start_time %> +    <%= form.input :end_time %> +  <% end %> + +  <%= form.actions do %> +    <%= form.action :submit, :as => :button %> +    <%= form.action :cancel, :as => :link %> +  <% end %> +<% end %> diff --git a/app/views/timebands/_sidebar.html.erb b/app/views/timebands/_sidebar.html.erb new file mode 100644 index 000000000..8ffa16dca --- /dev/null +++ b/app/views/timebands/_sidebar.html.erb @@ -0,0 +1,11 @@ +<% content_for :sidebar do %> +  <ul class="actions"> +    <li><%= link_to t('timebands.actions.new'), new_referential_timeband_path(@referential), :class => "add" %></li> +    <% if @timeband %> +      <li><%= link_to t('timebands.actions.edit'), edit_referential_timeband_path(@referential, @timeband), :class => "edit" %></li> +      <li><%= link_to t('timebands.actions.destroy'), referential_timeband_path(@referential, @timeband), :method => :delete, :data => {:confirm =>  t('timebands.actions.destroy_confirm')}, :class => "remove" %></li> +    <% end %> +  </ul> +<% end %> + + diff --git a/app/views/timebands/edit.html.erb b/app/views/timebands/edit.html.erb new file mode 100644 index 000000000..bc2c73ace --- /dev/null +++ b/app/views/timebands/edit.html.erb @@ -0,0 +1,3 @@ +<%= title_tag t('timebands.edit.title', timeband: @timeband.name) %> + +<%= render "form" %> diff --git a/app/views/timebands/index.html.erb b/app/views/timebands/index.html.erb new file mode 100644 index 000000000..54be52675 --- /dev/null +++ b/app/views/timebands/index.html.erb @@ -0,0 +1,29 @@ +<%= title_tag t('timebands.index.title') %> + +<% if @timebands.any? %> +  <table class="table table-striped table-condensed"> +    <thead> +      <tr> +        <th><%= t('activerecord.attributes.timeband.name') %></th> +        <th><%= t('activerecord.attributes.timeband.start_time') %></th> +        <th><%= t('activerecord.attributes.timeband.end_time') %></th> +        <th></th> +      </tr> +    </thead> +    <tbody> +      <% @timebands.each do |timeband| %> +        <tr> +          <td><%= link_to timeband.name, referential_timeband_path(@referential, timeband) %></td> +          <td><%= l(timeband.start_time, format: :hour) %></td> +          <td><%= l(timeband.end_time, format: :hour) %></td> +          <td> +            <%= link_to '', edit_referential_timeband_path(@referential, timeband), :class => "edit" %> +            <%= link_to '', referential_timeband_path(@referential, timeband), :method => :delete, :data => {:confirm =>  t('timebands.actions.destroy_confirm')}, :class => "remove" %> +          </td> +        </tr> +      <% end %> +    </tbody> +  </table> +<% end %> + +<%= render 'sidebar' %> diff --git a/app/views/timebands/new.html.erb b/app/views/timebands/new.html.erb new file mode 100644 index 000000000..c016325d0 --- /dev/null +++ b/app/views/timebands/new.html.erb @@ -0,0 +1,3 @@ +<%= title_tag t('timebands.new.title') %> + +<%= render "form" %> diff --git a/app/views/timebands/show.html.erb b/app/views/timebands/show.html.erb new file mode 100644 index 000000000..1a6171712 --- /dev/null +++ b/app/views/timebands/show.html.erb @@ -0,0 +1,12 @@ +<%= title_tag t( 'timebands.show.title', timeband: @timeband.name )%> + +<div class="summary"> +  <p> +    <label><%= @timeband.name %>: </label> +    <%= l(@timeband.start_time, format: :hour) %> +    - +    <%= l(@timeband.end_time, format: :hour) %> +  </p> +</div> + +<%= render 'sidebar' %> diff --git a/app/views/vehicle_journey_frequencies/_form_footer.html.erb b/app/views/vehicle_journey_frequencies/_form_footer.html.erb new file mode 100644 index 000000000..d38f8af0e --- /dev/null +++ b/app/views/vehicle_journey_frequencies/_form_footer.html.erb @@ -0,0 +1,14 @@ +<% if vehicle_journey.new_record? %> +  <%= javascript_include_tag new_referential_line_route_vehicle_journey_frequency_path( +                                 @referential, +                                 @line, +                                 @route, +                                 format: :js) %> +<% else %> +  <%= javascript_include_tag edit_referential_line_route_vehicle_journey_frequency_path( +                                 @referential, +                                 @line, +                                 @route, +                                 vehicle_journey, +                                 format: :js) %> +<% end %> diff --git a/app/views/vehicle_journey_frequencies/_form_vehicle_journey_at_stops.html.erb b/app/views/vehicle_journey_frequencies/_form_vehicle_journey_at_stops.html.erb new file mode 100644 index 000000000..7f503e547 --- /dev/null +++ b/app/views/vehicle_journey_frequencies/_form_vehicle_journey_at_stops.html.erb @@ -0,0 +1,59 @@ +<li class="input"> +  <%= form.label vehicle_journey.human_attribute_name(:vehicle_journey_at_stop_ids), class: 'label' %> +  <table class="table-striped ce-TimeBandFormTable"> +    <thead> +      <tr> +        <th> +          <%= t('vehicle_journeys.form.stop_title') %> +        </th> +        <th></th> +        <th> +          <%= t('vehicle_journeys.form.arrival') %> +        </th> +        <th> +          <%= t('vehicle_journeys.form.departure') %> +        </th> +      </tr> +    </thead> +    <tbody class="journey_pattern_dependent_list"> +      <%= render partial: 'vehicle_journey_at_stop_fields', +                 collection: vehicle_journey.vehicle_journey_at_stops, as: :vehicle_journey_at_stop, +                 locals: { vehicle_journey_at_stops_size: vehicle_journey.vehicle_journey_at_stops.size } %> +    </tbody> +    <tfoot> +      <tr> +        <td></td> +        <td></td> +        <td> +          <%= button_tag 'data-ce-action' => 'to_departures', class: 'ce-hide btn btn-primary' do %> +            <%= t('vehicle_journeys.form.to_departures').html_safe %> +            <i class="fa fa-angle-double-right"></i> +          <% end %> +        <td> +          <%= button_tag 'data-ce-action' => 'to_arrivals', class: 'ce-hide btn btn-primary' do %> +            <i class="fa fa-angle-double-left"></i> +            <%= t('vehicle_journeys.form.to_arrivals').html_safe %> +          <% end %> +        </td> +      </tr> +    </tfoot> +  </table> +</li> + +<li class="input"> +  <%= form.label vehicle_journey.human_attribute_name(:journey_frequency_ids), class: 'label' %> +  <ul class="ce-FrequencyFormFields"> +    <li><%= t('activerecord.attributes.journey_frequency.timeband') %></li> +    <li><%= t('activerecord.attributes.journey_frequency.first_departure_time') %></li> +    <li><%= t('activerecord.attributes.journey_frequency.last_departure_time') %></li> +    <li><%= t('activerecord.attributes.journey_frequency.scheduled_headway_interval') %></li> +    <li></li> +    <li></li> +  </ul> +  <%= form.semantic_fields_for :journey_frequencies do |journey_frequency| %> +    <%= render 'journey_frequency_fields', f: journey_frequency %> +  <% end %> +  <div class="actions-add-fields"> +    <%= link_to_add_association t('journey_frequencies.form.add_line'), form, :journey_frequencies, class: 'btn btn-primary' %> +  </div> +</li> diff --git a/app/views/vehicle_journey_frequencies/_journey_frequency_fields.html.erb b/app/views/vehicle_journey_frequencies/_journey_frequency_fields.html.erb new file mode 100644 index 000000000..9370fc8d3 --- /dev/null +++ b/app/views/vehicle_journey_frequencies/_journey_frequency_fields.html.erb @@ -0,0 +1,15 @@ +<div class="nested-fields"> +  <ul class="ce-FrequencyFormFields"> +    <%= f.input :timeband, collection: Chouette::Timeband.all.map{ |timeband| [timeband.fullname, timeband.id] }, label: false %> +    <%= f.input :first_departure_time, label: false %> +    <%= f.input :last_departure_time, label: false %> +    <%= f.input :scheduled_headway_interval, label: false %> +    <%= f.input :exact_time, label: t('activerecord.attributes.journey_frequency.exact_time') %> +    <li> +      <label class="label"></label> +      <%= link_to_remove_association f do %> +        <i class="fa fa-trash"></i> +      <% end %> +    </li> +  </ul> +</div> diff --git a/app/views/vehicle_journey_frequencies/_show_journey_frequencies.html.erb b/app/views/vehicle_journey_frequencies/_show_journey_frequencies.html.erb new file mode 100644 index 000000000..328c702f9 --- /dev/null +++ b/app/views/vehicle_journey_frequencies/_show_journey_frequencies.html.erb @@ -0,0 +1,28 @@ +<h3><%= t('vehicle_journeys.show.journey_frequencies') %></h3> +<div class="journey_frequencies content"> +  <table class="table table-hover table-striped"> +    <thead> +    <tr> +      <th><%= t('activerecord.attributes.journey_frequency.timeband') %></th> +      <th><%= t('activerecord.attributes.journey_frequency.first_departure_time') %></th> +      <th><%= t('activerecord.attributes.journey_frequency.last_departure_time') %></th> +      <th><%= t('activerecord.attributes.journey_frequency.scheduled_headway_interval') %></th> +      <th><%= t('activerecord.attributes.journey_frequency.exact_time') %></th> +    </tr> +    <thead> +    <tbody> +    <% @vehicle_journey_frequency.journey_frequencies.each do |journey_frequency| %> +      <tr class="<%= cycle :odd, :even %>"> +        <td> +          <%= link_to journey_frequency.timeband.fullname, +                      referential_timeband_path(@referential, journey_frequency.timeband) if journey_frequency.timeband %> +        </td> +        <td><%= l(journey_frequency.first_departure_time, format: :hour) %></td> +        <td><%= l(journey_frequency.last_departure_time, format: :hour) %></td> +        <td><%= l(journey_frequency.scheduled_headway_interval, format: :hour) %></td> +        <td><%= '<i class="fa fa-check"></i>'.html_safe if journey_frequency.exact_time %></td> +      </tr> +    <% end %> +    </tbody> +  </table> +</div> diff --git a/app/views/vehicle_journey_frequencies/_show_sidebar.html.erb b/app/views/vehicle_journey_frequencies/_show_sidebar.html.erb new file mode 100644 index 000000000..2a7be143c --- /dev/null +++ b/app/views/vehicle_journey_frequencies/_show_sidebar.html.erb @@ -0,0 +1,23 @@ +<% content_for :sidebar do %> +  <ul class="actions"> +    <li> +      <%= link_to t('vehicle_journeys.actions.new'), +                  new_referential_line_route_vehicle_journey_path(@referential, @line, @route), class: "add" %> +    </li> +    <li> +      <%= link_to t('vehicle_journeys.actions.new_frequency'), +                  new_referential_line_route_vehicle_journey_frequency_path(@referential, @line, @route), class: "add" %> +    </li> +    <li> +      <%= link_to t('vehicle_journeys.actions.edit_frequency'), +                  edit_referential_line_route_vehicle_journey_frequency_path(@referential, @line, @route, @vehicle_journey_frequency), +                  class: "edit" %> +    </li> +    <li> +      <%= link_to t('vehicle_journeys.actions.destroy'), +                  referential_line_route_vehicle_journey_path(@referential, @line, @route, @vehicle_journey_frequency), +                  method: :delete, data: { confirm: t('vehicle_journeys.actions.destroy_confirm') }, class: "remove" %> +    </li> +  </ul> +  <%= creation_tag(@vehicle_journey_frequency) %> +<% end %> diff --git a/app/views/vehicle_journey_frequencies/_show_vehicle_journey_at_stops.html.erb b/app/views/vehicle_journey_frequencies/_show_vehicle_journey_at_stops.html.erb new file mode 100644 index 000000000..0a91a8af3 --- /dev/null +++ b/app/views/vehicle_journey_frequencies/_show_vehicle_journey_at_stops.html.erb @@ -0,0 +1,29 @@ +<div class="vehicle_journey_at_stops content"> +  <table class="table-striped ce-TimeBandFormTable"> +    <thead> +      <tr> +        <th class="stop title" ><%= t('vehicle_journeys.show.stop_title') %></th> +        <th></th> +        <th class="hour title"><%= t('vehicle_journeys.show.arrival') %></th> +        <th class="hour title"><%= t('vehicle_journeys.show.departure') %></th> +      </tr> +    <thead> +    <tbody> +      <% @vehicle_journey_frequency.vehicle_journey_at_stops.each do |vjas| %> +        <tr class="<%= cycle :odd, :even %>"> +          <td><%= link_to vjas.stop_point.stop_area.name, [@referential, vjas.stop_point.stop_area] %></td> +          <td class="ce-TimeBandFormTable-circleLine"> +            <span class="ce-TimeBandFormTable-circle"></span> +            <span class="ce-TimeBandFormTable-line"></span> +          </td> +          <td class="hour <%= 'missing' if vjas.arrival_time.nil? %>"> +            <%= l(vjas.arrival_time, format: :hour) if vjas.arrival_time %> +          </td> +          <td class="hour <%= 'missing' if vjas.departure_time.nil? %>"> +            <%= l(vjas.departure_time, format: :hour) if vjas.departure_time %> +          </td> +        </tr> +      <% end %> +    </tbody> +  </table> +</div> diff --git a/app/views/vehicle_journey_frequencies/_vehicle_journey_at_stop_fields.html.erb b/app/views/vehicle_journey_frequencies/_vehicle_journey_at_stop_fields.html.erb new file mode 100644 index 000000000..5a4ed7382 --- /dev/null +++ b/app/views/vehicle_journey_frequencies/_vehicle_journey_at_stop_fields.html.erb @@ -0,0 +1,52 @@ +<% +   vjas = vehicle_journey_at_stop +   tab_counter_arrival = 2 * vehicle_journey_at_stop_counter + 100 +   tab_counter_departure = (vehicle_journey_at_stops_size * 2) + 2 * vehicle_journey_at_stop_counter + 100 +%> +<tr class="time input optional <%= 'no_stop' if vjas._destroy %> <%= cycle :odd, :even %>" > +  <td> +    <%= { +          id: vjas.id, +          _destroy: (vjas._destroy ? 1 : 0), +          stop_point_id: vjas.stop_point_id, +          :'departure_time(3i)' => 1, +          :'departure_time(2i)' => 1, +          :'departure_time(1i)' => 1, +          :'arrival_time(3i)' => 1, +          :'arrival_time(2i)' => 1, +          :'arrival_time(1i)' => 2000 +        }.map{ |k, v| +          "<input name=\"vehicle_journey_frequency[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][#{k}]\" +                  type=\"hidden\" value=\"#{v}\">" }.join("\n").html_safe %> + +    <%= vjas.stop_point.stop_area.name %> +  </td> +  <td class="ce-TimeBandFormTable-circleLine"> +    <span class="ce-TimeBandFormTable-circle"></span> +    <span class="ce-TimeBandFormTable-line"></span> +  </td> +  <td class="arrival_time <%= 'missing' unless vjas.arrival_time %> <%= 'invalid_position' if vjas.errors[:arrival_time].present?  %>"> +    <%= select_hour(vjas.arrival_time ? vjas.arrival_time.hour : 0, +                      { +                        prefix: 'vehicle_journey_frequency', +                        field_name: "vehicle_journey_at_stops_attributes[#{vehicle_journey_at_stop_counter}][arrival_time(4i)]" +                      }, class: 'hour', tabindex: tab_counter_arrival + 1) %> +    <%= select_minute(vjas.arrival_time ? vjas.arrival_time.min : 0, +                      { +                        prefix: 'vehicle_journey_frequency', +                        field_name: "vehicle_journey_at_stops_attributes[#{vehicle_journey_at_stop_counter}][arrival_time(5i)]" +                      }, class: 'minute', tabindex: tab_counter_arrival + 2) %> +  </td> +  <td class="departure_time <%= 'missing' unless vjas.departure_time %> <%= 'invalid_position' if vjas.errors[:departure_time].present? %>"> +    <%= select_hour(vjas.departure_time ? vjas.departure_time.hour : 0, +                      { +                        prefix: 'vehicle_journey_frequency', +                        field_name: "vehicle_journey_at_stops_attributes[#{vehicle_journey_at_stop_counter}][departure_time(4i)]" +                      }, class: 'hour', tabindex: tab_counter_departure + 1) %> +    <%= select_minute(vjas.departure_time ? vjas.departure_time.min : 0, +                      { +                        prefix: 'vehicle_journey_frequency', +                        field_name: "vehicle_journey_at_stops_attributes[#{vehicle_journey_at_stop_counter}][departure_time(5i)]" +                      }, class: 'minute', tabindex: tab_counter_departure + 2) %> +  </td> +</tr> diff --git a/app/views/vehicle_journey_frequencies/_vehicle_journeys_matrix.html.erb b/app/views/vehicle_journey_frequencies/_vehicle_journeys_matrix.html.erb new file mode 100644 index 000000000..c023f9cfb --- /dev/null +++ b/app/views/vehicle_journey_frequencies/_vehicle_journeys_matrix.html.erb @@ -0,0 +1,22 @@ +<ul class="ce-VehicleJourneyFrequenciesMatrix"> +<% @vehicle_journeys.each do |vj| %> +  <li> +    <ul> +      <% vj.journey_frequencies.each do |jf| %> +        <% left, width = journey_frequency_percent(jf) %> +        <li style="left:<%= left %>%;width:<%= width %>%" +            data-style="primary" data-container="body" rel="popover" data-toggle="popover" +            data-title='<%= link_to(vehicle_title(vj, jf), [@referential, @line, @route, vj] ) %> +                        <%= link_to('<span class="fa fa-pencil"></span>'.html_safe, +                                    send("edit_referential_line_route_vehicle_journey#{'_frequency' if vj.frequency?}_path", @referential, @line, @route, vj), +                                    :class => "btn btn-default btn-sm" ) %>' +            data-placement= "top" +            data-content='<%= render 'vehicle_journeys/show_popover', { vehicle_journey: vj } %>'> +          <span class="ce-VehicleJourneyFrequenciesMatrix-firstDepartureTime"><%= l(jf.first_departure_time, format: :hour) %></span> +          <span class="ce-VehicleJourneyFrequenciesMatrix-lastDepartureTime"><%= l(jf.last_departure_time, format: :hour) %></span> +        </li> +      <% end %> +    </ul> +  </li> +<% end %> +</ul> diff --git a/app/views/vehicle_journey_frequencies/edit.html.erb b/app/views/vehicle_journey_frequencies/edit.html.erb new file mode 100644 index 000000000..1bc1e6d88 --- /dev/null +++ b/app/views/vehicle_journey_frequencies/edit.html.erb @@ -0,0 +1,7 @@ +<%= title_tag edit_vehicle_title(@vehicle_journey_frequency) %> + +<%= render 'vehicle_journeys/form', vehicle_journey: @vehicle_journey_frequency, +           form_url: referential_line_route_vehicle_journey_frequency_path(@referential, +                                                                           @line, +                                                                           @route, +                                                                           id: @vehicle_journey_frequency) %> diff --git a/app/views/vehicle_journey_frequencies/edit.js.erb b/app/views/vehicle_journey_frequencies/edit.js.erb new file mode 100644 index 000000000..f5aaf8ad7 --- /dev/null +++ b/app/views/vehicle_journey_frequencies/edit.js.erb @@ -0,0 +1,10 @@ +$(document).ready(function() { +  $("#vehicle_journey_frequency_journey_pattern_id").change( +    function(){ +      var url = "<%= select_journey_pattern_referential_line_route_vehicle_journey_path( @referential, @line, @route, @vehicle_journey_frequency)%>?journey_pattern_id="+ +          $("#vehicle_journey_frequency_journey_pattern_input select option:selected").attr("value"); +      url += "&journey_category=frequency"; +      $.get(url); +    } +  ); +}); diff --git a/app/views/vehicle_journey_frequencies/new.html.erb b/app/views/vehicle_journey_frequencies/new.html.erb new file mode 100644 index 000000000..677605276 --- /dev/null +++ b/app/views/vehicle_journey_frequencies/new.html.erb @@ -0,0 +1,6 @@ +<%= title_tag t('vehicle_journeys.new.title_frequency') %> + +<%= render 'vehicle_journeys/form', vehicle_journey: @vehicle_journey_frequency, +                                    form_url: referential_line_route_vehicle_journey_frequencies_path(@referential, +                                                                                                      @line, +                                                                                                      @route) %> diff --git a/app/views/vehicle_journey_frequencies/new.js.erb b/app/views/vehicle_journey_frequencies/new.js.erb new file mode 100644 index 000000000..b5fc75aef --- /dev/null +++ b/app/views/vehicle_journey_frequencies/new.js.erb @@ -0,0 +1,13 @@ +$(document).ready(function() { +  $("#vehicle_journey_frequency_journey_pattern_id").change( +    function(){ +      var vehicle_journey_journey_pattern_id = $("#vehicle_journey_frequency_journey_pattern_input select option:selected").attr("value"); +      if (vehicle_journey_journey_pattern_id > 0) { +        var url = "<%= referential_line_route_journey_patterns_path(@referential.id,@line.id,@route.id) %>"; +        url = url + "/" + vehicle_journey_journey_pattern_id + +            "/new_vehicle_journey?journey_category=frequency"; +        $.get(url); +      } +    } +  ); +}); diff --git a/app/views/vehicle_journey_frequencies/select_journey_pattern.js.erb b/app/views/vehicle_journey_frequencies/select_journey_pattern.js.erb new file mode 100644 index 000000000..8fe20ed37 --- /dev/null +++ b/app/views/vehicle_journey_frequencies/select_journey_pattern.js.erb @@ -0,0 +1,5 @@ +$('.journey_pattern_dependent_list').html('<%= escape_javascript( +  render(partial: 'vehicle_journey_frequencies/vehicle_journey_at_stop_fields', +         collection: @vehicle_journey.vehicle_journey_at_stops, +         as: :vehicle_journey_at_stop, +         locals: { vehicle_journey_at_stops_size: @vehicle_journey.vehicle_journey_at_stops.size })).html_safe %>'); diff --git a/app/views/vehicle_journey_frequencies/show.html.erb b/app/views/vehicle_journey_frequencies/show.html.erb new file mode 100644 index 000000000..7939ae319 --- /dev/null +++ b/app/views/vehicle_journey_frequencies/show.html.erb @@ -0,0 +1,3 @@ +<%= render 'vehicle_journeys/show_details', vehicle_journey: @vehicle_journey_frequency %> +<%= render 'show_journey_frequencies' %> +<%= render 'show_sidebar' %> diff --git a/app/views/vehicle_journeys/_form.html.erb b/app/views/vehicle_journeys/_form.html.erb index e4b1ce432..10d9bfeee 100644 --- a/app/views/vehicle_journeys/_form.html.erb +++ b/app/views/vehicle_journeys/_form.html.erb @@ -1,4 +1,4 @@ -<%= semantic_form_for [@referential, @line, @route, @vehicle_journey] do |form| %> +<%= semantic_form_for vehicle_journey, url: form_url do |form| %>    <%= form.inputs do %>      <%= form.input :journey_pattern, :as => :select, :collection => @route.journey_patterns, :member_label => Proc.new { |jp| journey_name(jp) }  %>      <%= form.input :number %> @@ -6,64 +6,23 @@      <%= form.input :published_journey_identifier %>      <%= form.input :comment %>      <%= form.input :transport_mode_name, :as => :select, :collection => Chouette::Line.transport_modes, :include_blank => true, :member_label => Proc.new { |mode| t("transport_modes.label.#{mode}") }  %> -    <%= form.input :mobility_restricted_suitability, :as => :select, :collection => [[@vehicle_journey.human_attribute_name("accessible"), true], [@vehicle_journey.human_attribute_name("not_accessible"), false]], :include_blank => true %> -    <%= form.input :flexible_service, :as => :select, :collection => [[@vehicle_journey.human_attribute_name("on_demand_fs"), true], [@vehicle_journey.human_attribute_name("regular_fs"), false]], :include_blank => true %> +    <%= form.input :mobility_restricted_suitability, :as => :select, :collection => [[vehicle_journey.human_attribute_name("accessible"), true], [vehicle_journey.human_attribute_name("not_accessible"), false]], :include_blank => true %> +    <%= form.input :flexible_service, :as => :select, :collection => [[vehicle_journey.human_attribute_name("on_demand_fs"), true], [vehicle_journey.human_attribute_name("regular_fs"), false]], :include_blank => true %>      <%= form.input :status_value %>      <%= form.input :facility %>      <%= form.input :vehicle_type_identifier%> -    <%= form.input :objectid, :required => !@vehicle_journey.new_record?, :input_html => { :title => t("formtastic.titles#{format_restriction_for_locales(@referential)}.vehicle_journey.objectid")} %> -    <%= form.input :time_table_tokens, :label => t('.time_tables'), :as => :search_time_table, :json => referential_autocomplete_time_tables_path(@referential, :format => :json), :hint_text => t('search_hint'), :no_result_text => t('no_result_text'),:searching_text => t('searching_term'),  :input_html => { :"data-pre" => Rabl::Renderer.new( 'autocomplete_time_tables/index', @vehicle_journey.time_tables, :view_path => 'app/views', :format => :json, :scope => :self ).render }  %> +    <%= form.input :objectid, :required => !vehicle_journey.new_record?, :input_html => { :title => t("formtastic.titles#{format_restriction_for_locales(@referential)}.vehicle_journey.objectid")} %> +    <%= form.input :time_table_tokens, :label => t('.time_tables'), :as => :search_time_table, :json => referential_autocomplete_time_tables_path(@referential, :format => :json), :hint_text => t('search_hint'), :no_result_text => t('no_result_text'),:searching_text => t('searching_term'),  :input_html => { :"data-pre" => Rabl::Renderer.new( 'autocomplete_time_tables/index', vehicle_journey.time_tables, :view_path => 'app/views', :format => :json, :scope => :self ).render }  %>      <%= form.input :footnote_ids, :as => :check_boxes, :collection => @line.footnotes.map { |f| [ "#{f.code}: #{f.label}", f.id.to_s]} %> -    <li class="input"> -	    <%= form.label @vehicle_journey.human_attribute_name(:vehicle_journey_at_stop_ids), :class => "label" %> -    </li> -    <% unless @vehicle_journey.vehicle_journey_at_stops.empty? || -       @vehicle_journey.vehicle_journey_at_stops.any? { |vjas| vjas.departure_time.nil? } %>    <div class="vehicle_journey_at_stops"> -      <div class="well"> -        <span class="title"><%= t(".slide_title") %></span> -        <div> -          <span><%= t(".set") %></span> <%= select_tag "", options_for_select( [ [t('.slide_departure'), "departure"], [t('.slide_arrival'), "arrival"] ] ), :class => "departure_or_arrival" %> <span><%= t(".to") %></span> -          <%= select_hour(@vehicle_journey.vehicle_journey_at_stops.first.departure_time.hour) %> -          <%= select_minute(@vehicle_journey.vehicle_journey_at_stops.first.departure_time.min) %> -          <a class="slide btn btn-default"><%= t(".slide") %></a> -        </div> -      </div> -    <% end %> - -    <table class="table table-hover table-striped"> -	    <thead> -	      <tr> -	        <th class="hour title"><%= t('.arrival') %></th> -	        <th class="stop title" ><%= t('.stop_title') %></th> -	        <th class="hour title"><%= t('.departure') %></th> -	      </tr> -	    </thead> -	    <tfoot> -	      <tr> -	        <td class="title"> <a class="to_departures"><%= t('.to_departures') %></a></td> -	        <td class="title" ></td> -	        <td class="title"><a class="to_arrivals"><%= t('.to_arrivals') %></a></td> -	      </tr> -	    </tfoot> -	    <tbody class="journey_pattern_dependent_list"> -	      <%= render :partial => "vehicle_journeys/vehicle_journey_at_stop_fields", -	      :collection => @vehicle_journey.vehicle_journey_at_stops, :as => :vehicle_journey_at_stop, :locals => { :vehicle_journey_at_stops_size => @vehicle_journey.vehicle_journey_at_stops.size } %> - -      </tbody> -    </table>     +    <%= render 'form_vehicle_journey_at_stops', vehicle_journey: vehicle_journey, form: form %>    <% end %>    <%= form.actions do %> -    <%= form.action :submit, :as => :button %> -    <%= form.action :cancel, :as => :link %> +    <%= form.action :submit, as: :button, label: t(".submit_#{vehicle_journey.journey_category}") %> +    <%= form.action :cancel, as: :link %>    <% end %>  <% end %> -<% if @vehicle_journey.new_record? %> -  <%= javascript_include_tag new_referential_line_route_vehicle_journey_path(@referential, @line, @route, :format => :js) %> -<% else %> -  <%= javascript_include_tag edit_referential_line_route_vehicle_journey_path(@referential, @line, @route, @vehicle_journey, :format => :js) %> -<% end %> - +<%= render 'form_footer', vehicle_journey: vehicle_journey %> diff --git a/app/views/vehicle_journeys/_form_footer.html.erb b/app/views/vehicle_journeys/_form_footer.html.erb new file mode 100644 index 000000000..c4c51b2b3 --- /dev/null +++ b/app/views/vehicle_journeys/_form_footer.html.erb @@ -0,0 +1,5 @@ +<% if vehicle_journey.new_record? %> +  <%= javascript_include_tag new_referential_line_route_vehicle_journey_path(@referential, @line, @route, :format => :js) %> +<% else %> +  <%= javascript_include_tag edit_referential_line_route_vehicle_journey_path(@referential, @line, @route, vehicle_journey, :format => :js) %> +<% end %> diff --git a/app/views/vehicle_journeys/_form_vehicle_journey_at_stops.html.erb b/app/views/vehicle_journeys/_form_vehicle_journey_at_stops.html.erb new file mode 100644 index 000000000..7e9bc1b38 --- /dev/null +++ b/app/views/vehicle_journeys/_form_vehicle_journey_at_stops.html.erb @@ -0,0 +1,49 @@ +<li class="input"> +  <%= form.label vehicle_journey.human_attribute_name(:vehicle_journey_at_stop_ids), :class => "label" %> +</li> +<% unless vehicle_journey.vehicle_journey_at_stops.empty? || vehicle_journey.vehicle_journey_at_stops.any? { |vjas| vjas.departure_time.nil? } %> +  <div class="vehicle_journey_at_stops"> +    <div class="well"> +      <span class="title"><%= t('vehicle_journeys.form.slide_title') %></span> +      <div> +        <span><%= t('vehicle_journeys.form.set') %></span> +        <%= select_tag '', options_for_select( [ [t('vehicle_journeys.form.slide_departure'), "departure"], [t('vehicle_journeys.form.slide_arrival'), "arrival"] ] ), :class => "departure_or_arrival" %> +        <span><%= t('vehicle_journeys.form.to') %></span> +        <%= select_hour(vehicle_journey.vehicle_journey_at_stops.first.departure_time.hour) %> +        <%= select_minute(vehicle_journey.vehicle_journey_at_stops.first.departure_time.min) %> +        <a class="slide btn btn-default"><%= t('vehicle_journeys.form.slide') %></a> +      </div> +    </div> +  </div> +<% end %> + +<table class="table table-hover table-striped"> +  <thead> +    <tr> +      <th class="hour title"><%= t('vehicle_journeys.form.arrival') %></th> +      <th class="stop title"><%= t('vehicle_journeys.form.stop_title') %></th> +      <th class="hour title"><%= t('vehicle_journeys.form.departure') %></th> +    </tr> +  </thead> +  <tfoot> +    <tr> +      <td class="title"> +        <%= button_tag 'data-ce-action' => 'to_departures', class: 'ce-hide btn btn-primary' do %> +          <%= t('vehicle_journeys.form.to_departures').html_safe %> +          <i class="fa fa-angle-double-right"></i> +        <% end %> +      <td class="title"></td> +      <td class="title"> +        <%= button_tag 'data-ce-action' => 'to_arrivals', class: 'ce-hide btn btn-primary' do %> +          <i class="fa fa-angle-double-left"></i> +          <%= t('vehicle_journeys.form.to_arrivals').html_safe %> +        <% end %> +      </td> +    </tr> +  </tfoot> +  <tbody class="journey_pattern_dependent_list"> +    <%= render :partial => "vehicle_journeys/vehicle_journey_at_stop_fields", +               :collection => vehicle_journey.vehicle_journey_at_stops, :as => :vehicle_journey_at_stop, +               :locals => { :vehicle_journey_at_stops_size => vehicle_journey.vehicle_journey_at_stops.size } %> +  </tbody> +</table> diff --git a/app/views/vehicle_journeys/_route_popover.html.erb b/app/views/vehicle_journeys/_route_popover.html.erb index 1acba5665..27023b625 100644 --- a/app/views/vehicle_journeys/_route_popover.html.erb +++ b/app/views/vehicle_journeys/_route_popover.html.erb @@ -1,6 +1,5 @@  <ul>  <% (selected_route.line.routes.limit(10).reject{ |route| route == selected_route}).each do |route| %> -  <li><%= link_to route.name.truncate(30), [@referential, route.line, route, 'vehicle_journeys'] %></li> +  <li><%= link_to route.name.truncate(30), [@referential, route.line, route, controller_name] %></li>  <% end %>  </ul> -</p> diff --git a/app/views/vehicle_journeys/_show_details.html.erb b/app/views/vehicle_journeys/_show_details.html.erb new file mode 100644 index 000000000..fccf3d210 --- /dev/null +++ b/app/views/vehicle_journeys/_show_details.html.erb @@ -0,0 +1,87 @@ +<%= title_tag vehicle_title(vehicle_journey) %> + +<div id="modal_translation" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> +  <div class="modal-dialog"> +    <div class="modal-content"> +      <div class="modal-header"> +        <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button> +        <h4 class="modal-title" id="myModalLabel"><%= t('vehicle_journeys.show.translation_form') %></h4> +        <div id="translate_form"></div> +      </div> +    </div> +  </div> +</div> + +<div class="vehicle_journey"> +  <div class="summary"> +    <p> +      <label><%= vehicle_journey.human_attribute_name(:journey_pattern) %>: </label> +      <%= link_to journey_name(vehicle_journey.journey_pattern), [@referential, @line, @route, vehicle_journey.journey_pattern] %> +    </p> +    <p> +      <label><%= vehicle_journey.human_attribute_name("number") %>: </label> +      <%= vehicle_journey.number %> +    </p> +    <p> +      <label><%= vehicle_journey.human_attribute_name("published_journey_name") %>: </label> +      <%= vehicle_journey.published_journey_name %> +    </p> +    <p> +      <label><%= vehicle_journey.human_attribute_name("published_journey_identifier") %>: </label> +      <%= vehicle_journey.published_journey_identifier %> +    </p> + +    <p> +      <label><%= vehicle_journey.human_attribute_name("mobility_restricted_suitability") %>: </label> +      <% if vehicle_journey.mobility_restricted_suitability.nil? %> +        <%= vehicle_journey.human_attribute_name("unspecified_mrs") %> +      <% elsif vehicle_journey.mobility_restricted_suitability? %> +        <%= vehicle_journey.human_attribute_name("accessible") %> +      <% else %> +        <%= vehicle_journey.human_attribute_name("not_accessible") %> +      <% end %> +    </p> +    <p> +      <label><%= vehicle_journey.human_attribute_name("flexible_service") %>: </label> +      <% if vehicle_journey.flexible_service.nil? %> +        <%= vehicle_journey.human_attribute_name("unspecified_fs") %> +      <% elsif vehicle_journey.flexible_service? %> +        <%= vehicle_journey.human_attribute_name("on_demand_fs") %> +      <% else %> +        <%= vehicle_journey.human_attribute_name("regular_fs") %> +      <% end %> +    </p> + +    <p> +      <label><%= vehicle_journey.human_attribute_name("comment") %>: </label> +      <%= vehicle_journey.comment %> +    </p> +    <p> +      <label><%= vehicle_journey.human_attribute_name("status_value") %>: </label> +      <%= vehicle_journey.status_value %> +    </p> +    <p> +      <label><%= vehicle_journey.human_attribute_name("facility") %>: </label> +      <%= vehicle_journey.facility %> +    </p> +    <p> +      <label><%= vehicle_journey.human_attribute_name("vehicle_type_identifier") %>: </label> +      <%= vehicle_journey.vehicle_type_identifier %> +    </p> +    <p> +      <label><%= vehicle_journey.human_attribute_name("footnote_ids") %>: </label> +    <ul> +      <% vehicle_journey.footnotes.each do |footnote| %> +        <li><%= footnote.code %> : <%= footnote.label %></li> +      <% end %> +    </ul> +    </p> +  </div> +</div> +<h3><%= vehicle_journey.human_attribute_name(:vehicle_journey_at_stop_ids) %></h3> +<%= render 'show_vehicle_journey_at_stops' %> + +<h3><%= t('vehicle_journeys.show.time_tables') %></h3> +<div class="time_tables paginated_content"> +  <%= paginated_content vehicle_journey.time_tables, "time_tables/time_table", :delete => false %> +</div> diff --git a/app/views/vehicle_journeys/_show_sidebar.html.erb b/app/views/vehicle_journeys/_show_sidebar.html.erb new file mode 100644 index 000000000..5ab7d449a --- /dev/null +++ b/app/views/vehicle_journeys/_show_sidebar.html.erb @@ -0,0 +1,15 @@ +<% content_for :sidebar do %> +  <ul class="actions"> +    <li><%= link_to t('vehicle_journeys.actions.new'), new_referential_line_route_vehicle_journey_path(@referential, @line, @route), :class => "add" %></li> +    <li><%= link_to t('vehicle_journeys.actions.new_frequency'), new_referential_line_route_vehicle_journey_frequency_path(@referential, @line, @route), :class => "add" %></li> +    <li><%= link_to t('vehicle_journeys.actions.edit'), edit_referential_line_route_vehicle_journey_path(@referential, @line, @route, @vehicle_journey), :class => "edit" %></li> +    <li><%= link_to t('vehicle_journeys.actions.destroy'), referential_line_route_vehicle_journey_path(@referential, @line, @route, @vehicle_journey), :method => :delete, :data => {:confirm =>  t('vehicle_journeys.actions.destroy_confirm')}, :class => "remove" %></li> +    <% unless @vehicle_journey.vehicle_journey_at_stops.empty? %> +      <li> +        <i class="fa fa-cubes fa-fw" style="color:#D98F3B;"></i> +        <%= link_to t('vehicle_journeys.show.translation_form'), new_referential_line_route_vehicle_journey_vehicle_translation_path(@referential, @line, @route, @vehicle_journey), {:remote => true, 'data-toggle' =>  "modal", 'data-target' => '#modal_translation', :class => "with_fa" } %> +      </li> +    <% end %> +  </ul> +  <%= creation_tag(@vehicle_journey) %> +<% end %> diff --git a/app/views/vehicle_journeys/_show_vehicle_journey_at_stops.html.erb b/app/views/vehicle_journeys/_show_vehicle_journey_at_stops.html.erb new file mode 100644 index 000000000..cb4a95263 --- /dev/null +++ b/app/views/vehicle_journeys/_show_vehicle_journey_at_stops.html.erb @@ -0,0 +1,20 @@ +<div class="vehicle_journey_at_stops content"> +  <table class="table table-hover table-striped"> +    <thead> +    <tr> +      <th class="hour title"><%= t('vehicle_journeys.show.arrival') %></th> +      <th class="stop title" ><%= t('vehicle_journeys.show.stop_title') %></th> +      <th class="hour title"><%= t('vehicle_journeys.show.departure') %></th> +    </tr> +    <thead> +    <tbody> +    <% @vehicle_journey.vehicle_journey_at_stops.each_with_index do |vjas, index| %> +      <tr class="<%= index%2==0 ? "odd" : "even" %>"> +        <td class="hour <%= vjas.arrival_time.nil? ? "missing" : "" %>"><%= vjas.arrival_time ? l( vjas.arrival_time, :format => :hour) : "" %></td> +        <td><%= link_to vjas.stop_point.stop_area.name, [@referential, vjas.stop_point.stop_area] %></td> +        <td class="hour <%= vjas.departure_time.nil? ? "missing" : "" %>"><%= vjas.departure_time ? l( vjas.departure_time, :format => :hour) : "" %></td> +      </tr> +    <% end %> +    </tbody> +  </table> +</div> diff --git a/app/views/vehicle_journeys/_sidebar.html.erb b/app/views/vehicle_journeys/_sidebar.html.erb index 8d6f310d3..11260cd7b 100644 --- a/app/views/vehicle_journeys/_sidebar.html.erb +++ b/app/views/vehicle_journeys/_sidebar.html.erb @@ -1,6 +1,7 @@ -  <ul class="actions"> -    <li><%= link_to t('vehicle_journeys.actions.new'), new_referential_line_route_vehicle_journey_path(@referential, @line, @route), :class => "add" %></li> -	<li><%= link_to t('vehicle_journey_imports.new.title'), new_referential_line_route_vehicle_journey_import_path( @referential, @line, @route ), :class => "import" %></li> -    <li><%= link_to t('vehicle_journey_exports.new.title'), referential_line_route_vehicle_journey_exports_path(@referential, @line, @route, :format => :zip), :class => "export" %></li> -  </ul> +<ul class="actions"> +  <li><%= link_to t('vehicle_journeys.actions.new'), new_referential_line_route_vehicle_journey_path(@referential, @line, @route), :class => "add" %></li> +  <li><%= link_to t('vehicle_journeys.actions.new_frequency'), new_referential_line_route_vehicle_journey_frequency_path(@referential, @line, @route), :class => "add" %></li> +  <li><%= link_to t('vehicle_journey_imports.new.title'), new_referential_line_route_vehicle_journey_import_path( @referential, @line, @route ), :class => "import" %></li> +  <li><%= link_to t('vehicle_journey_exports.new.title'), referential_line_route_vehicle_journey_exports_path(@referential, @line, @route, :format => :zip), :class => "export" %></li> +</ul> diff --git a/app/views/vehicle_journeys/_vehicle_journeys.html.erb b/app/views/vehicle_journeys/_vehicle_journeys.html.erb index ecdb12c6e..3bff10b59 100644 --- a/app/views/vehicle_journeys/_vehicle_journeys.html.erb +++ b/app/views/vehicle_journeys/_vehicle_journeys.html.erb @@ -1,39 +1,21 @@  <div class="page_info"> -  <span class="search"> <%= t("will_paginate.page_entries_info.search") %></span> <%= page_entries_info @vehicle_journeys %> +  <span class="search"><%= t("will_paginate.page_entries_info.search") %></span> +  <%= page_entries_info @vehicle_journeys %> +  <span class="pull-right"> +    <i class="fa fa-clock-o"></i> +    <% if controller_name == 'vehicle_journey_frequencies' %> +      <%= link_to t("vehicle_journeys.actions.show"), referential_line_route_vehicle_journeys_path(@referential, @line, @route) %> +    <% else %> +      <%= link_to t("vehicle_journey_frequencies.actions.show"), referential_line_route_vehicle_journey_frequencies_path(@referential, @line, @route) %> +    <% end %> +  </span>  </div>  <div class="pagination">    <%= will_paginate @vehicle_journeys, :container => false, renderer: RemoteBootstrapPaginationLinkRenderer %>  </div>  <div class="vehicle_journeys paginated_content"> -  <table class="table table-hover table-striped"> -  <thead>     -    <tr> -      <th class="title"> -        <button data-style="primary" data-container="body" rel="popover" data-toggle="popover" title='<%= t(".line_routes") %>' data-placement="top" data-content='<%= render( partial: "route_popover", :locals => { :selected_route => @route }) %>' class="route_popover btn btn-default btn-sm"><i class='fa fa-search'></i><%= Chouette::Route.model_name.human.capitalize %></button> -      </th> -      <% @vehicle_journeys.each do |vj| %> -      <th class="vehicle_journey"> -        <button data-style="primary" data-container="body" rel="popover" data-toggle="popover" data-title='<%= link_to(vehicle_title(vj), [@referential, @line, @route, vj] ) %> <%= link_to('<span class="fa fa-pencil"></span>'.html_safe, ["edit", @referential, @line, @route, vj], :class => "btn btn-default btn-sm" ) %>' data-placement= "top" data-content='<%= render( partial: "show_popover", :locals => { :vehicle_journey => vj }) %>' class="vehicle_journey_popover btn btn-default btn-sm"><i class='fa fa-search'></i></button> -      </th> -      <% end %> -    </tr> -  </thead> -  <tbody> -  <% @route.stop_points.each_with_index do |sp, index| %> -  <tr class="<%= cycle('odd', 'even') %>"> -    <td class="stop_area"><%= sp.stop_area.name %></td> -    <% @vehicle_journeys.each do |vj| %> -      <td class="hours <%= missing_time_check(@matrix["#{vj.id}-#{sp.id}"]) %>"> -        <%= (@matrix["#{vj.id}-#{sp.id}"] && @matrix["#{vj.id}-#{sp.id}"].departure_time) ? l( @matrix["#{vj.id}-#{sp.id}"].departure_time, :format => :hour) : "--" %> -      </td> -    <% end %> -  </tr> -  <% end %> -  </tbody> -  </table> +  <%= render 'vehicle_journeys_matrix' %>  </div>  <div class="pagination">    <%= will_paginate @vehicle_journeys, :container => false, renderer: RemoteBootstrapPaginationLinkRenderer %>  </div>  - - diff --git a/app/views/vehicle_journeys/_vehicle_journeys_matrix.html.erb b/app/views/vehicle_journeys/_vehicle_journeys_matrix.html.erb new file mode 100644 index 000000000..3254430cd --- /dev/null +++ b/app/views/vehicle_journeys/_vehicle_journeys_matrix.html.erb @@ -0,0 +1,40 @@ +<table class="table table-hover table-striped"> +  <thead> +    <tr> +      <th class="title"> +        <button data-style="primary" data-container="body" rel="popover" data-toggle="popover" title='<%= t(".line_routes") %>' +                data-placement="top" data-content='<%= render( partial: "route_popover", :locals => { :selected_route => @route }) %>' +                class="route_popover btn btn-default btn-sm"> +          <i class='fa fa-search'></i> +          <%= Chouette::Route.model_name.human.capitalize %> +        </button> +      </th> +      <% @vehicle_journeys.each do |vj| %> +        <th class="vehicle_journey"> +          <button data-style="primary" data-container="body" rel="popover" data-toggle="popover" +                  data-title='<%= link_to(vehicle_title(vj), [@referential, @line, @route, vj] ) %> +                      <%= link_to('<span class="fa fa-pencil"></span>'.html_safe, +                                  send("edit_referential_line_route_vehicle_journey#{'_frequency' if vj.frequency?}_path", @referential, @line, @route, vj), +                                  :class => "btn btn-default btn-sm" ) %>' +                  data-placement= "top" +                  data-content='<%= render( partial: "show_popover", :locals => { :vehicle_journey => vj }) %>' +                  class="vehicle_journey_popover btn btn-default btn-sm"> +            <i class='fa fa-search'></i> +          </button> +        </th> +      <% end %> +    </tr> +  </thead> +  <tbody> +    <% @route.stop_points.each_with_index do |sp, index| %> +      <tr class="<%= cycle('odd', 'even') %>"> +        <td class="stop_area"><%= sp.stop_area.name %></td> +        <% @vehicle_journeys.each do |vj| %> +          <td class="hours <%= missing_time_check(@matrix["#{vj.id}-#{sp.id}"]) %><%= ' ce-VehicleJourneyBlock-frequency' if vj.frequency? %>"> +            <%= (@matrix["#{vj.id}-#{sp.id}"] && @matrix["#{vj.id}-#{sp.id}"].departure_time) ? l( @matrix["#{vj.id}-#{sp.id}"].departure_time, :format => :hour) : "--" %> +          </td> +        <% end %> +      </tr> +    <% end %> +  </tbody> +</table> diff --git a/app/views/vehicle_journeys/edit.html.erb b/app/views/vehicle_journeys/edit.html.erb index 51653a34a..0d3a2db96 100644 --- a/app/views/vehicle_journeys/edit.html.erb +++ b/app/views/vehicle_journeys/edit.html.erb @@ -1,4 +1,5 @@  <%= title_tag edit_vehicle_title(@vehicle_journey) %> -<%= render "form" %> +<%= render 'form', vehicle_journey: @vehicle_journey, form_url: referential_line_route_vehicle_journey_path(@referential, @line, @route, @vehicle_journey) %> + diff --git a/app/views/vehicle_journeys/index.html.erb b/app/views/vehicle_journeys/index.html.erb index 13126b2e1..3fd123c79 100644 --- a/app/views/vehicle_journeys/index.html.erb +++ b/app/views/vehicle_journeys/index.html.erb @@ -14,30 +14,31 @@    <div id="advanced_search" class="panel-collapse collapse">      <div class="panel-body">        <div> -      <%= f.label :time_tables_id_not_eq, "Sans calendrier" %> -      <%= f.check_box :time_tables_id_not_eq %> +        <%= f.label :time_tables_id_not_eq, "Sans calendrier" %> +        <%= f.check_box :time_tables_id_not_eq %> -      <span class="time_tables_id_eq"> -        <%= f.label :time_tables_id_eq, "Sélectionner calendriers" %> -        <%= f.text_field :time_tables_id_eq, :input_html => { :"data-pre" => [].to_json} %> -      </span> +        <span class="time_tables_id_eq"> +          <%= f.label :time_tables_id_eq, "Sélectionner calendriers" %> +          <%= f.text_field :time_tables_id_eq, :input_html => { :"data-pre" => [].to_json} %> +        </span>        </div> +      <% if controller_name != 'vehicle_journey_frequencies' %> +        <div> +          <%= f.label :vehicle_journey_at_stops_departure_time_not_eq, "Sans horaire" %> +          <%= f.check_box :vehicle_journey_at_stops_departure_time_not_eq %> -      <div> -      <%= f.label :vehicle_journey_at_stops_departure_time_not_eq, "Sans horaire" %> -      <%= f.check_box :vehicle_journey_at_stops_departure_time_not_eq %> - -      <span class="vehicle_journey_at_stops_departure_time_gt"> -        <input name=<%= "q[vehicle_journey_at_stops_departure_time_gt(3i)]" %> type="hidden" value="1"> -        <input name=<%= "q[vehicle_journey_at_stops_departure_time_gt(2i)]" %> type="hidden" value="1"> -        <input name=<%= "q[vehicle_journey_at_stops_departure_time_gt(1i)]" %> type="hidden" value="2000"> -        <%= f.label :vehicle_journey_at_stops_departure_time_gt, t('.time_range') %> -        <%= select_hour(@q.send( "vehicle_journey_at_stops_departure_time_gt") ? @q.send( "vehicle_journey_at_stops_departure_time_gt").hour : 0, -                         :prefix => "q", :field_name => "vehicle_journey_at_stops_departure_time_gt(4i)") %> -        <%= select_minute(@q.send( "vehicle_journey_at_stops_departure_time_gt") ? @q.send( "vehicle_journey_at_stops_departure_time_gt").min : 0, -                           :prefix => "q", :field_name => "vehicle_journey_at_stops_departure_time_gt(5i)") %> -      </span> -      </div> +          <span class="vehicle_journey_at_stops_departure_time_gt"> +            <input name=<%= "q[vehicle_journey_at_stops_departure_time_gt(3i)]" %> type="hidden" value="1"> +            <input name=<%= "q[vehicle_journey_at_stops_departure_time_gt(2i)]" %> type="hidden" value="1"> +            <input name=<%= "q[vehicle_journey_at_stops_departure_time_gt(1i)]" %> type="hidden" value="2000"> +            <%= f.label :vehicle_journey_at_stops_departure_time_gt, t('.time_range') %> +            <%= select_hour(@q.send( "vehicle_journey_at_stops_departure_time_gt") ? @q.send( "vehicle_journey_at_stops_departure_time_gt").hour : 0, +                             :prefix => "q", :field_name => "vehicle_journey_at_stops_departure_time_gt(4i)") %> +            <%= select_minute(@q.send( "vehicle_journey_at_stops_departure_time_gt") ? @q.send( "vehicle_journey_at_stops_departure_time_gt").min : 0, +                               :prefix => "q", :field_name => "vehicle_journey_at_stops_departure_time_gt(5i)") %> +          </span> +        </div> +      <% end %>      </div>    </div>  </div> diff --git a/app/views/vehicle_journeys/new.html.erb b/app/views/vehicle_journeys/new.html.erb index a32e9cc31..d2e9d7c4c 100644 --- a/app/views/vehicle_journeys/new.html.erb +++ b/app/views/vehicle_journeys/new.html.erb @@ -1,4 +1,4 @@  <%= title_tag t('vehicle_journeys.new.title') %> -<%= render "form" %> +<%= render 'form', { vehicle_journey: @vehicle_journey, form_url: referential_line_route_vehicle_journeys_path(@referential, @line, @route, @vehicle_journey) } %> diff --git a/app/views/vehicle_journeys/new.js.erb b/app/views/vehicle_journeys/new.js.erb index 65e5dfccb..160e7a34b 100644 --- a/app/views/vehicle_journeys/new.js.erb +++ b/app/views/vehicle_journeys/new.js.erb @@ -1,10 +1,13 @@  $(document).ready(function() {    $("#vehicle_journey_journey_pattern_id").change(      function(){ -      var url = "<%= referential_line_route_journey_patterns_path(@referential.id,@line.id,@route.id) %>"; -      url = url + "/" + $("#vehicle_journey_journey_pattern_input select option:selected").attr("value") + -        "/new_vehicle_journey"; -      $.get(url); +      var vehicle_journey_journey_pattern_id = $("#vehicle_journey_journey_pattern_input select option:selected").attr("value"); +      if (vehicle_journey_journey_pattern_id > 0) { +        var url = "<%= referential_line_route_journey_patterns_path(@referential.id,@line.id,@route.id) %>"; +        url = url + "/" + vehicle_journey_journey_pattern_id + +                "/new_vehicle_journey"; +        $.get(url); +      }      }    )  }); diff --git a/app/views/vehicle_journeys/show.html.erb b/app/views/vehicle_journeys/show.html.erb index 695b5c8b5..4bf814bbe 100644 --- a/app/views/vehicle_journeys/show.html.erb +++ b/app/views/vehicle_journeys/show.html.erb @@ -1,119 +1,2 @@ -<%= title_tag vehicle_title(@vehicle_journey) %> - -<div id="modal_translation" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> -  <div class="modal-dialog"> -    <div class="modal-content"> -      <div class="modal-header"> -        <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button> -        <h4 class="modal-title" id="myModalLabel"><%= t('.translation_form') %></h4> -        <div id="translate_form"></div> -      </div> -    </div> -  </div> -</div> - -<div class="vehicle_journey"> -  <div class="summary"> -    <p> -      <label><%= @vehicle_journey.human_attribute_name(:journey_pattern) %>: </label> -      <%= link_to journey_name(@vehicle_journey.journey_pattern), [@referential, @line, @route, @vehicle_journey.journey_pattern] %> -    </p> -    <p> -      <label><%= @vehicle_journey.human_attribute_name("number") %>: </label> -      <%= @vehicle_journey.number %> -    </p> -    <p> -      <label><%= @vehicle_journey.human_attribute_name("published_journey_name") %>: </label> -      <%= @vehicle_journey.published_journey_name %> -    </p> -    <p> -      <label><%= @vehicle_journey.human_attribute_name("published_journey_identifier") %>: </label> -      <%= @vehicle_journey.published_journey_identifier %> -    </p> - -    <p> -      <label><%= @vehicle_journey.human_attribute_name("mobility_restricted_suitability") %>: </label> -      <% if @vehicle_journey.mobility_restricted_suitability.nil? %> -      <%= @vehicle_journey.human_attribute_name("unspecified_mrs") %> -      <% elsif @vehicle_journey.mobility_restricted_suitability? %> -      <%= @vehicle_journey.human_attribute_name("accessible") %> -      <% else %> -      <%= @vehicle_journey.human_attribute_name("not_accessible") %> -      <% end %> -    </p> -    <p> -      <label><%= @vehicle_journey.human_attribute_name("flexible_service") %>: </label> -      <% if @vehicle_journey.flexible_service.nil? %> -      <%= @vehicle_journey.human_attribute_name("unspecified_fs") %> -      <% elsif @vehicle_journey.flexible_service? %> -      <%= @vehicle_journey.human_attribute_name("on_demand_fs") %> -      <% else %> -      <%= @vehicle_journey.human_attribute_name("regular_fs") %> -      <% end %> -    </p> - -    <p> -      <label><%= @vehicle_journey.human_attribute_name("comment") %>: </label> -      <%= @vehicle_journey.comment %> -    </p> -    <p> -      <label><%= @vehicle_journey.human_attribute_name("status_value") %>: </label> -      <%= @vehicle_journey.status_value %> -    </p> -    <p> -      <label><%= @vehicle_journey.human_attribute_name("facility") %>: </label> -      <%= @vehicle_journey.facility %> -    </p> -    <p> -      <label><%= @vehicle_journey.human_attribute_name("vehicle_type_identifier") %>: </label> -      <%= @vehicle_journey.vehicle_type_identifier %> -    </p> -        <p> -      <label><%= @vehicle_journey.human_attribute_name("footnote_ids") %>: </label> -      <ul> -        <% @vehicle_journey.footnotes.each do |footnote| %> -        <li><%= footnote.code %> : <%= footnote.label %></li>           -      <% end %> -      </ul> -    </p> -  </div> -</div> -<h3><%= @vehicle_journey.human_attribute_name(:vehicle_journey_at_stop_ids) %></h3> -<div class="vehicle_journey_at_stops content"> -  <table class="table table-hover table-striped"> -    <thead> -      <tr> -        <th class="hour title"><%= t('.arrival') %></th> -        <th class="stop title" ><%= t('.stop_title') %></th> -        <th class="hour title"><%= t('.departure') %></th> -      </tr> -    <thead> -      <tbody> -        <% @vehicle_journey.vehicle_journey_at_stops.each_with_index do |vjas, index| %> -        <tr class="<%= index%2==0 ? "odd" : "even" %>"> -          <td class="hour <%= vjas.arrival_time.nil? ? "missing" : "" %>"><%= vjas.arrival_time ? l( vjas.arrival_time, :format => :hour) : "" %></td> -          <td><%= link_to vjas.stop_point.stop_area.name, [@referential, vjas.stop_point.stop_area] %></td> -          <td class="hour <%= vjas.departure_time.nil? ? "missing" : "" %>"><%= vjas.departure_time ? l( vjas.departure_time, :format => :hour) : "" %></td> -        </tr> -        <% end %> -      </tbody> -  </table> -</div> - -<h3><%= t('.time_tables') %></h3> -<div class="time_tables paginated_content"> -  <%= paginated_content @vehicle_journey.time_tables, "time_tables/time_table", :delete => false %> -</div> - - -<% content_for :sidebar do %> -  <ul class="actions"> -    <li><%= link_to t('vehicle_journeys.actions.new'), new_referential_line_route_vehicle_journey_path(@referential, @line, @route), :class => "add" %></li> -    <li><%= link_to t('vehicle_journeys.actions.edit'), edit_referential_line_route_vehicle_journey_path(@referential, @line, @route, @vehicle_journey), :class => "edit" %></li> -    <li><%= link_to t('vehicle_journeys.actions.destroy'), referential_line_route_vehicle_journey_path(@referential, @line, @route, @vehicle_journey), :method => :delete, :data => {:confirm =>  t('vehicle_journeys.actions.destroy_confirm')}, :class => "remove" %></li> -  <% unless @vehicle_journey.vehicle_journey_at_stops.empty? %> -    <li><font color="#D98F3B"><i class="fa fa-cubes fa-fw"></i></font><%= link_to t('.translation_form'), new_referential_line_route_vehicle_journey_vehicle_translation_path(@referential, @line, @route, @vehicle_journey), {:remote => true, 'data-toggle' =>  "modal", 'data-target' => '#modal_translation', :class => "with_fa" } %></li> -  <% end %> -  </ul> -  <%= creation_tag(@vehicle_journey) %> -<% end %> +<%= render 'show_details', vehicle_journey: @vehicle_journey %> +<%= render 'show_sidebar' %> diff --git a/config/locales/breadcrumbs.yml b/config/locales/breadcrumbs.yml index ccf97c414..c40e5dd9b 100644 --- a/config/locales/breadcrumbs.yml +++ b/config/locales/breadcrumbs.yml @@ -1,10 +1,12 @@  en:    breadcrumbs:      vehicle_journeys: "Passing times" +    vehicle_journey_frequencies: "Times bands"      referentials: "Home"      users: "Users"  fr:    breadcrumbs:      vehicle_journeys: "Horaires" +    vehicle_journey_frequencies: "Plages horaires"      referentials: "Accueil"      users: "Utilisateurs" diff --git a/config/locales/journey_frequencies.en.yml b/config/locales/journey_frequencies.en.yml new file mode 100644 index 000000000..ad4a92432 --- /dev/null +++ b/config/locales/journey_frequencies.en.yml @@ -0,0 +1,13 @@ +en: +  journey_frequencies: +    time_band: Time band +    form: +      add_line: Add a line +  activerecord: +    attributes: +      journey_frequency: +        first_departure_time: First departure +        last_departure_time: Last departure +        scheduled_headway_interval: Interval +        exact_time: Exact? +        timeband: Time bands diff --git a/config/locales/journey_frequencies.fr.yml b/config/locales/journey_frequencies.fr.yml new file mode 100644 index 000000000..7bfd6de69 --- /dev/null +++ b/config/locales/journey_frequencies.fr.yml @@ -0,0 +1,13 @@ +fr: +  journey_frequencies: +    time_band: Plages horaires +    form: +      add_line: Ajouter une ligne +  activerecord: +    attributes: +      journey_frequency: +        first_departure_time: Premier départ +        last_departure_time: Dernier départ +        scheduled_headway_interval: Intervalle +        exact_time: Exact ? +        timeband: Plage horaires diff --git a/config/locales/lines_en.yml b/config/locales/lines_en.yml index baaad6bbf..b0200240b 100644 --- a/config/locales/lines_en.yml +++ b/config/locales/lines_en.yml @@ -37,7 +37,7 @@ en:        deselect_all: "Deselect all"        unset: "undefined"        advanced_search: "Advanced Search" -      color: "Colors" +      color: "Color"      form:        group_of_lines: "Associated groups of lines"        no_group_of_line: "No group of line" diff --git a/config/locales/lines_fr.yml b/config/locales/lines_fr.yml index 3661f6856..ad0bee6c2 100644 --- a/config/locales/lines_fr.yml +++ b/config/locales/lines_fr.yml @@ -37,7 +37,7 @@ fr:        deselect_all: "Tout désélectionner"        unset: "non défini"        advanced_search: "Recherche avancée" -      color: "Couleurs" +      color: "Couleur"      form:        group_of_lines: "Groupes de lignes associés"        no_group_of_line: "Aucun groupe de lignes" diff --git a/config/locales/referentials.yml b/config/locales/referentials.yml index 22e923be7..abc56ae51 100644 --- a/config/locales/referentials.yml +++ b/config/locales/referentials.yml @@ -68,6 +68,7 @@ en:          rule_parameter_sets: "Rule parameters sets"          data_format_restrictions: "Data format constraint"          data_format: "Favorite format for export" +        timebands: "Time bands"    formtastic:      titles:        referential: @@ -146,6 +147,7 @@ fr:          rule_parameter_sets: "Jeux de paramètres"          data_format_restrictions: "Format d'export privilégié"          data_format: "Format d'export privilégié" +        timebands: "Plages horaires"    formtastic:      titles:        referential: diff --git a/config/locales/timebands.en.yml b/config/locales/timebands.en.yml new file mode 100644 index 000000000..fae2f1d30 --- /dev/null +++ b/config/locales/timebands.en.yml @@ -0,0 +1,26 @@ +en: +  timebands: +    actions: +      new: "Add a time band" +      edit: "Edit a time band" +      destroy: "Delete a time band" +      destroy_confirm: "Thank you to confirm the deletion of these time band." +    new: +      title: "Add a time band" +    edit: +      title: "Edit this time band %{timeband}" +    show: +      title: "Time band %{timeband}" +    index: +      title: "Time bands" +  activerecord: +    models: +      timeband: +        zero:  "Time band" +        one:   "Time band" +        other: "Time bands" +    attributes: +      timeband: +        name: "Title" +        start_time: "Start time" +        end_time: "End time" diff --git a/config/locales/timebands.fr.yml b/config/locales/timebands.fr.yml new file mode 100644 index 000000000..1865d0c39 --- /dev/null +++ b/config/locales/timebands.fr.yml @@ -0,0 +1,26 @@ +fr: +  timebands: +    actions: +      new: "Ajouter une plage horaire" +      edit: "Modifier cette plage horaire" +      destroy: "Supprimer cette plage horaire" +      destroy_confirm: "Merci de confirmer la suppression de cette plage horaire." +    new: +      title: "Ajouter une plage horaire" +    edit: +      title: "Modifier la plage horaire %{timeband}" +    show: +      title: Plage horaire %{timeband} +    index: +      title: "Plages horaires" +  activerecord: +    models: +      timeband: +        zero:  "plage horaire" +        one:   "plage horaire" +        other: "plages horaires" +    attributes: +      timeband: +        name: "Titre" +        start_time: "Heure de début" +        end_time: "Heure de fin" diff --git a/config/locales/vehicle_journey_frequencies.en.yml b/config/locales/vehicle_journey_frequencies.en.yml new file mode 100644 index 000000000..f502ff0ab --- /dev/null +++ b/config/locales/vehicle_journey_frequencies.en.yml @@ -0,0 +1,7 @@ +en: +  vehicle_journey_frequencies: +    vehicle_journeys_matrix: +      line_routes: "Line's routes" +    actions: +      index: "Vehicle journey frequency" +      show: "Show frequency vehicle journey" diff --git a/config/locales/vehicle_journey_frequencies.fr.yml b/config/locales/vehicle_journey_frequencies.fr.yml new file mode 100644 index 000000000..d8bc48b4b --- /dev/null +++ b/config/locales/vehicle_journey_frequencies.fr.yml @@ -0,0 +1,7 @@ +fr: +  vehicle_journey_frequencies: +    vehicle_journeys_matrix: +      line_routes: Séquences d'arrêts de la ligne +    actions: +      index: "Courses à fréquence" +      show: "Voir les courses à fréquence" diff --git a/config/locales/vehicle_journeys.en.yml b/config/locales/vehicle_journeys.en.yml new file mode 100644 index 000000000..6d51cc8bf --- /dev/null +++ b/config/locales/vehicle_journeys.en.yml @@ -0,0 +1,125 @@ +en: +  vehicle_journeys: +    vehicle_journeys_matrix: +      line_routes: "Line's routes"       +    vehicle_journey: +      title_stopless: "Vehicle journey %{name}" +      title: "Vehicle journey leaving from %{stop} at %{time}" +    vehicle_journey_frequency: +      title_stopless: "Vehicle journey frequency %{name}" +      title: "Vehicle journey frequency leaving from %{stop} at %{time}" +      title_frequency: "Vehicle journey frequency with %{interval}min leaving from %{stop} at %{time_first} to %{time_last}" +    actions: +      index: "Vehicle time's board" +      new: "Add a new timed vehicle journey" +      new_frequency: "Add a new frequency vehicle journey" +      edit: "Edit this timed vehicle journey" +      edit_frequency: "Edit this frequency vehicle journey" +      destroy: "Remove this vehicle journey" +      destroy_confirm: "Are you sure you want destroy this vehicle journey?" +      show: "Show timed vehicle journeys" +    new: +      title: "Add a new vehicle journey" +      title_frequency: "Add a new frequency vehicle journey" +    edit: +      title_stopless: "Update vehicle journey %{name}" +      title: "Update vehicle journey %{name} leaving from %{stop} at %{time}" +    form: +      stop_title: "Stop" +      departure: "Departure" +      arrival: "Arrival" +      to_arrivals: "Copy departures to arrivals" +      to_departures: "Copy arrivals to departures" +      time_tables: "Associated calendars to vehicle journey" +      slide: "Shift" +      slide_title: "Shift all vehicle passing times" +      set: "Set" +      to: "at" +      slide_departure: "departure time at first stop" +      slide_arrival: "arrival time at first stop" +      submit_timed: "Create vehicle journey" +      submit_frequency: "Create frequency vehicle journey" +    timeless: +      title: "Timeless vehicle journeys" +      vehicle_journeys: "Vehicle journeys with times at stop" +      vehicles_list: "Vehicle journeys list" +    show: +      title: "Vehicle Journey %{vehicle journey}" +      stop_title: "Stop" +      departure: "Departure" +      arrival: "Arrival" +      time_tables: "Calendars list" +      bounding: "From %{start} to %{end}" +      translation_form: "Vehicle journey translations" +      journey_frequencies: "Interval time duration" +    index: +      title: "Vehicle journeys on route %{route}" +      vehicle_journeys: "Departure's times" +      selection: "Filter on" +      selection_all: "All" +      select_journey_patterns: "Select journey pattern" +      select_time_tables: "Enter a timetable" +      time_range: "Departure time threshold" +      advanced_search: "Advanced Search" +    sidebar: +      timeless: "Timeless vehicle journeys" +    time_filter: +      time_range_filter: "Filter" +  activerecord: +    models: +      vehicle_journey: +        zero:  "vehicle journey" +        one:   "vehicle journey" +        other: "vehicle journeys" +    attributes: +      vehicle_journey: +        line: "Line" +        route: "Route" +        journey_pattern: "Journey Pattern" +        time_tables: "Calendars" +        time_slot: "Time Slot" +        company: "Company" +        number: "Number" +        comment: "Comments" +        status_value: "Status Value" +        transport_mode_name: "Transport Mode" +        mobility_restricted_suitability: "PRM accessibility" +        flexible_service: "On demond transportation" +        unspecified_mrs: "Not specified" +        accessible: "Accessible" +        not_accessible: "Not accessible" +        unspecified_fs: "Not specified" +        on_demand_fs: "On demand service" +        regular_fs: "Regular service" +        published_journey_name: "Published Name" +        published_journey_identifier: "Published Identifier" +        facility: "Facility" +        vehicletypeidentifier: "Vehicle Type Identifier" +        time_table_ids: "Calendar list" +        vehicle_journey_at_stop_ids: "Time list" +        journey_frequency_ids: "Interval time duration" +        objectid: "Neptune identifier" +        object_version: "Version" +        creation_time: "Created on" +        creator_id: "Created by" +        footnote_ids: "Footnotes" +    errors: +      models: +        vehicle_journey: +          invalid_times: "Invalid times" +  formtastic: +    titles: +      vehicle_journey: +        objectid: "[prefix]:VehicleJourney:[unique_key] : prefix contains only alphanumerical or underscore characters, unique_key accepts also minus character" +      neptune: +        vehicle_journey: +          objectid: "[prefix]:VehicleJourney:[unique_key] : prefix contains only alphanumerical or underscore characters, unique_key accepts also minus character" +      netex: +        vehicle_journey: +          objectid: "[prefix]:VehicleJourney:[unique_key] : prefix contains only alphanumerical or underscore characters, unique_key accepts also minus character" +      gtfs: +        vehicle_journey: +          objectid: "[prefix]:VehicleJourney:[unique_key] : prefix contains only alphanumerical or underscore characters, unique_key accepts also minus character" +      hub: +        vehicle_journey: +          objectid: "[prefix]:VehicleJourney:[unique_key] : prefix contains only alphanumerical or underscore characters, unique_key accepts also minus character. Maximum length of the unique key = 8." diff --git a/config/locales/vehicle_journeys.fr.yml b/config/locales/vehicle_journeys.fr.yml new file mode 100644 index 000000000..98d6c7eb4 --- /dev/null +++ b/config/locales/vehicle_journeys.fr.yml @@ -0,0 +1,125 @@ +fr: +  vehicle_journeys: +    vehicle_journeys_matrix: +      line_routes: "Séquences d'arrêts de la ligne" +    vehicle_journey: +      title_stopless: "Course %{name}" +      title: "Course partant de %{stop} à %{time}" +    vehicle_journey_frequency: +      title_stopless: "Course à fréquences %{name}" +      title: "Course à fréquence partant de %{stop} à %{time}" +      title_frequency: "Course à fréquence de %{interval}min partant de %{stop} de %{time_first} à %{time_last}" +    actions: +      index: "Horaires des courses" +      new: "Ajouter une course à horaire" +      new_frequency: "Ajouter une course à fréquence" +      edit: "Modifier cette course à horaire" +      edit_frequency: "Modifier cette course à fréquence" +      destroy: "Supprimer cette course" +      destroy_confirm: "Etes vous sûr de supprimer cette course ?" +      show: "Voir les courses à horaire" +    new: +      title: "Ajouter une course à horaire" +      title_frequency: "Ajouter une course à fréquence" +    edit: +      title_stopless: "Modifier la course %{name}" +      title: "Modifier la course partant de %{stop} à %{time}" +    form: +      stop_title: "Arrêt" +      departure: "Départ" +      arrival: "Arrivée" +      to_arrivals: "Copie départs vers arrivées" +      to_departures: "Copie arrivées vers départs" +      time_tables: "Calendriers associés à la course" +      slide: "Décaler" +      slide_title: "Décaler l'ensemble des horaires de course" +      set: "Fixer" +      to: "à" +      slide_departure: "horaire de départ au 1° arrêt à" +      slide_arrival: "horaire d'arrivée au 1° arrêt à" +      submit_timed: "Créer course" +      submit_frequency: "Créer course à fréquence" +    timeless: +      title: "Courses sans horaire" +      vehicle_journeys: "Courses ayant des horaires" +      vehicles_list: "Liste des courses" +    show: +      title: "Course au départ de %{stop} à %{time} sur la séquence %{route}" +      stop_title: "Arrêt" +      departure: "Départ" +      arrival: "Arrivée" +      time_tables: "Liste des calendriers" +      bounding: "De %{start} à %{end}" +      translation_form: "Cloner la course" +      journey_frequencies: "Durée d'intervalle du trajet" +    index: +      title: "Horaires de la séquence d'arrêts %{route}" +      vehicle_journeys: "Horaires de départ aux arrêts" +      selection: "Filtrer sur" +      selection_all: "Tous" +      select_journey_patterns: "Sélectionner une mission" +      select_time_tables: "Saisir un calendrier" +      time_range: "Seuil horaire au départ" +      advanced_search: "Recherche avancée" +    time_filter: +      time_range_filter: "Filtrer" +    sidebar: +      timeless: "Courses sans horaire" +  activerecord: +    models: +      vehicle_journey: +        zero:  "course" +        one:   "course" +        other: "courses" +    attributes: +      vehicle_journey: +        line: "Ligne" +        route: "Séquence d'arrêt" +        journey_pattern: "Mission" +        time_tables: "Calendriers" +        time_slot: "Fréquence" +        company: "Transporteur" +        number: "Numéro" +        comment: "Commentaires" +        status_value: "Etat de trafic" +        transport_mode_name: "Mode de transport" +        mobility_restricted_suitability: "Accessibilité PMR" +        flexible_service: "Transport à la demande" +        unspecified_mrs: "Non spécifié" +        accessible: "Accessible" +        not_accessible: "Non accessible" +        unspecified_fs: "Non spécifié" +        on_demand_fs: "Service à la demande" +        regular_fs: "Service régulier" +        published_journey_name: "Nom public" +        published_journey_identifier: "Identifiant public" +        facility: "Equipement" +        vehicle_type_identifier: "Type d'identifiant du véhicule" +        time_table_ids: "Liste des calendriers" +        vehicle_journey_at_stop_ids: "Liste des horaires" +        journey_frequency_ids: "Durée d'intervalle du trajet" +        objectid: "Identifiant Neptune" +        object_version: "Version" +        creation_time: "Créé le" +        creator_id: "Créé par" +        footnote_ids: "Notes de bas de page" +    errors: +      models: +        vehicle_journey: +          invalid_times: "Horaires invalides" +  formtastic: +    titles: +      vehicle_journey: +        objectid: "[prefixe]:VehicleJourney:[clé_unique]  caractères autorisés : alphanumériques et 'souligné' pour le préfixe, la clé unique accepte en plus le 'moins'" +      neptune: +        vehicle_journey: +          objectid: "[prefixe]:VehicleJourney:[clé_unique]  caractères autorisés : alphanumériques et 'souligné' pour le préfixe, la clé unique accepte en plus le 'moins'" +      netex: +        vehicle_journey: +          objectid: "[prefixe]:VehicleJourney:[clé_unique]  caractères autorisés : alphanumériques et 'souligné' pour le préfixe, la clé unique accepte en plus le 'moins'" +      gtfs: +        vehicle_journey: +          objectid: "[prefixe]:VehicleJourney:[clé_unique]  caractères autorisés : alphanumériques et 'souligné' pour le préfixe, la clé unique accepte en plus le 'moins'" +      hub: +        vehicle_journey: +          objectid: "[prefixe]:VehicleJourney:[clé_unique]  caractères autorisés : alphanumériques et 'souligné' pour le préfixe, la clé unique accepte en plus le 'moins'. Longueur maximale de la clé unique = 8." diff --git a/config/locales/vehicle_journeys.yml b/config/locales/vehicle_journeys.yml deleted file mode 100644 index 3b18447f4..000000000 --- a/config/locales/vehicle_journeys.yml +++ /dev/null @@ -1,228 +0,0 @@ -en: -  vehicle_journeys: -    vehicle_journeys:   -      line_routes: "Line's routes"       -    vehicle_journey: -      title_stopless: "Vehicle journey %{name}" -      title: "Vehicle journey leaving from %{stop} at %{time}" -    actions: -      index: "Vehicle time's board" -      new: "Add a new vehicle journey" -      edit: "Edit this vehicle journey" -      destroy: "Remove this vehicle journey" -      destroy_confirm: "Are you sure you want destroy this vehicle journey?" -    new: -      title: "Add a new vehicle journey" -    edit: -      title_stopless: "Update vehicle journey %{name}" -      title: "Update vehicle journey %{name} leaving from %{stop} at %{time}" -    form: -      stop_title: "Stop" -      departure: "Departure" -      arrival: "Arrival" -      to_arrivals: "Copy departures to arrivals" -      to_departures: "Copy arrivals to departures" -      time_tables: "Associated calendars to vehicle journey" -      slide: "Shift" -      slide_title: "Shift all vehicle passing times" -      set: "Set" -      to: "at" -      slide_departure: "departure time at first stop" -      slide_arrival: "arrival time at first stop" -    timeless: -      title: "Timeless vehicle journeys" -      vehicle_journeys: "Vehicle journeys with times at stop" -      vehicles_list: "Vehicle journeys list" -    show: -      title: "Vehicle Journey %{vehicle journey}" -      stop_title: "Stop" -      departure: "Departure" -      arrival: "Arrival" -      time_tables: "Calendars list" -      bounding: "From %{start} to %{end}" -      translation_form: "Vehicle journey translations" -    index: -      title: "Vehicle journeys on route %{route}" -      vehicle_journeys: "Departure's times" -      selection: "Filter on" -      selection_all: "All" -      select_journey_patterns: "Select journey pattern" -      select_time_tables: "Enter a timetable" -      time_range: "Departure time threshold" -      advanced_search: "Advanced Search" -    sidebar: -      timeless: "Timeless vehicle journeys" -    time_filter: -      time_range_filter: "Filter" -  activerecord: -    models: -      vehicle_journey: -        zero:  "vehicle journey" -        one:   "vehicle journey" -        other: "vehicle journeys" -    attributes: -      vehicle_journey: -        line: "Line" -        route: "Route" -        journey_pattern: "Journey Pattern" -        time_tables: "Calendars" -        time_slot: "Time Slot" -        company: "Company" -        number: "Number" -        comment: "Comments" -        status_value: "Status Value" -        transport_mode_name: "Transport Mode" -        mobility_restricted_suitability: "PRM accessibility" -        flexible_service: "On demond transportation" -        unspecified_mrs: "Not specified" -        accessible: "Accessible" -        not_accessible: "Not accessible" -        unspecified_fs: "Not specified" -        on_demand_fs: "On demand service" -        regular_fs: "Regular service" -        published_journey_name: "Published Name" -        published_journey_identifier: "Published Identifier" -        facility: "Facility" -        vehicletypeidentifier: "Vehicle Type Identifier" -        time_table_ids: "Calendar list" -        vehicle_journey_at_stop_ids: "Time list" -        objectid: "Neptune identifier" -        object_version: "Version" -        creation_time: "Created on" -        creator_id: "Created by" -        footnote_ids: "Footnotes" -    errors: -      models: -        vehicle_journey: -          invalid_times: "Invalid times" -  formtastic: -    titles: -      vehicle_journey: -        objectid: "[prefix]:VehicleJourney:[unique_key] : prefix contains only alphanumerical or underscore characters, unique_key accepts also minus character" -      neptune: -        vehicle_journey: -          objectid: "[prefix]:VehicleJourney:[unique_key] : prefix contains only alphanumerical or underscore characters, unique_key accepts also minus character" -      netex: -        vehicle_journey: -          objectid: "[prefix]:VehicleJourney:[unique_key] : prefix contains only alphanumerical or underscore characters, unique_key accepts also minus character" -      gtfs: -        vehicle_journey: -          objectid: "[prefix]:VehicleJourney:[unique_key] : prefix contains only alphanumerical or underscore characters, unique_key accepts also minus character" -      hub: -        vehicle_journey: -          objectid: "[prefix]:VehicleJourney:[unique_key] : prefix contains only alphanumerical or underscore characters, unique_key accepts also minus character. Maximum length of the unique key = 8." - -fr: -  vehicle_journeys: -    vehicle_journeys:   -      line_routes: "Séquences d'arrêts de la ligne"   -    vehicle_journey: -      title_stopless: "Course %{name}" -      title: "Course partant de %{stop} à %{time}" -    actions: -      index: "Horaires des courses" -      new: "Ajouter une course" -      edit: "Modifier cette course" -      destroy: "Supprimer cette course" -      destroy_confirm: "Etes vous sûr de supprimer cette course ?" -    new: -      title: "Ajouter une course" -    edit: -      title_stopless: "Modifier la course %{name}" -      title: "Modifier la course partant de %{stop} à %{time}" -    form: -      stop_title: "Arrêt" -      departure: "Départ" -      arrival: "Arrivée" -      to_arrivals: "Copie départs vers arrivées" -      to_departures: "Copie arrivées vers départs" -      time_tables: "Calendriers associés à la course" -      slide: "Décaler" -      slide_title: "Décaler l'ensemble des horaires de course" -      set: "Fixer" -      to: "à" -      slide_departure: "horaire de départ au 1° arrêt à" -      slide_arrival: "horaire d'arrivée au 1° arrêt à" -    timeless: -      title: "Courses sans horaire" -      vehicle_journeys: "Courses ayant des horaires" -      vehicles_list: "Liste des courses" -    show: -      title: "Course au départ de %{stop} à %{time} sur la séquence %{route}" -      stop_title: "Arrêt" -      departure: "Départ" -      arrival: "Arrivée" -      time_tables: "Liste des calendriers" -      bounding: "De %{start} à %{end}" -      translation_form: "Cloner la course" -    index: -      title: "Horaires de la séquence d'arrêts %{route}" -      vehicle_journeys: "Horaires de départ aux arrêts" -      selection: "Filtrer sur" -      selection_all: "Tous" -      select_journey_patterns: "Sélectionner une mission" -      select_time_tables: "Saisir un calendrier" -      time_range: "Seuil horaire au départ" -      advanced_search: "Recherche avancée" -    time_filter: -      time_range_filter: "Filtrer" -    sidebar: -      timeless: "Courses sans horaire" -  activerecord: -    models: -      vehicle_journey: -        zero:  "course" -        one:   "course" -        other: "courses" -    attributes: -      vehicle_journey: -        line: "Ligne" -        route: "Séquence d'arrêt" -        journey_pattern: "Mission" -        time_tables: "Calendriers" -        time_slot: "Fréquence" -        company: "Transporteur" -        number: "Numéro" -        comment: "Commentaires" -        status_value: "Etat de trafic" -        transport_mode_name: "Mode de transport" -        mobility_restricted_suitability: "Accessibilité PMR" -        flexible_service: "Transport à la demande" -        unspecified_mrs: "Non spécifié" -        accessible: "Accessible" -        not_accessible: "Non accessible" -        unspecified_fs: "Non spécifié" -        on_demand_fs: "Service à la demande" -        regular_fs: "Service régulier" -        published_journey_name: "Nom public" -        published_journey_identifier: "Identifiant public" -        facility: "Equipement" -        vehicle_type_identifier: "Type d'identifiant du véhicule" -        time_table_ids: "Liste des calendriers" -        vehicle_journey_at_stop_ids: "Liste des horaires" -        objectid: "Identifiant Neptune" -        object_version: "Version" -        creation_time: "Créé le" -        creator_id: "Créé par" -        footnote_ids: "Notes de bas de page" -    errors: -      models: -        vehicle_journey: -          invalid_times: "Horaires invalides" -  formtastic: -    titles: -      vehicle_journey: -        objectid: "[prefixe]:VehicleJourney:[clé_unique]  caractères autorisés : alphanumériques et 'souligné' pour le préfixe, la clé unique accepte en plus le 'moins'" -      neptune: -        vehicle_journey: -          objectid: "[prefixe]:VehicleJourney:[clé_unique]  caractères autorisés : alphanumériques et 'souligné' pour le préfixe, la clé unique accepte en plus le 'moins'" -      netex: -        vehicle_journey: -          objectid: "[prefixe]:VehicleJourney:[clé_unique]  caractères autorisés : alphanumériques et 'souligné' pour le préfixe, la clé unique accepte en plus le 'moins'" -      gtfs: -        vehicle_journey: -          objectid: "[prefixe]:VehicleJourney:[clé_unique]  caractères autorisés : alphanumériques et 'souligné' pour le préfixe, la clé unique accepte en plus le 'moins'" -      hub: -        vehicle_journey: -          objectid: "[prefixe]:VehicleJourney:[clé_unique]  caractères autorisés : alphanumériques et 'souligné' pour le préfixe, la clé unique accepte en plus le 'moins'. Longueur maximale de la clé unique = 8." - diff --git a/config/routes.rb b/config/routes.rb index 29ef9eff1..fdcc506bf 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -70,7 +70,7 @@ ChouetteIhm::Application.routes.draw do              get 'new_vehicle_journey'            end          end -        resources :vehicle_journeys do +        resources :vehicle_journeys, :vehicle_journey_frequencies do            get 'select_journey_pattern', :on => :member            resources :vehicle_translations            resources :time_tables @@ -133,6 +133,8 @@ ChouetteIhm::Application.routes.draw do        resources :time_table_combinations      end +    resources :timebands +      resources :access_points do         resources :access_links      end diff --git a/db/migrate/20151015150300_create_journey_frequencies.ninoxe_engine.rb b/db/migrate/20151015150300_create_journey_frequencies.ninoxe_engine.rb new file mode 100644 index 000000000..e5c763ab7 --- /dev/null +++ b/db/migrate/20151015150300_create_journey_frequencies.ninoxe_engine.rb @@ -0,0 +1,14 @@ +# This migration comes from ninoxe_engine (originally 20151015143707) +class CreateJourneyFrequencies < ActiveRecord::Migration +  def change +    create_table :journey_frequencies do |t| +      t.references :vehicle_journey, index: true +      t.time :scheduled_headway_interval, null: false +      t.time :first_departure_time, null: false +      t.time :last_departure_time +      t.boolean :exact_time, default: false + +      t.timestamps +    end +  end +end diff --git a/db/migrate/20151022150419_add_journey_category_to_vehicle_journey.ninoxe_engine.rb b/db/migrate/20151022150419_add_journey_category_to_vehicle_journey.ninoxe_engine.rb new file mode 100644 index 000000000..b8af53f24 --- /dev/null +++ b/db/migrate/20151022150419_add_journey_category_to_vehicle_journey.ninoxe_engine.rb @@ -0,0 +1,6 @@ +# This migration comes from ninoxe_engine (originally 20151022150156) +class AddJourneyCategoryToVehicleJourney < ActiveRecord::Migration +  def change +    add_column :vehicle_journeys, :journey_category, :integer, null: false, default: 0 +  end +end diff --git a/db/migrate/20151023101306_create_timebands.ninoxe_engine.rb b/db/migrate/20151023101306_create_timebands.ninoxe_engine.rb new file mode 100644 index 000000000..3758fdf09 --- /dev/null +++ b/db/migrate/20151023101306_create_timebands.ninoxe_engine.rb @@ -0,0 +1,16 @@ +# This migration comes from ninoxe_engine (originally 20151023083836) +class CreateTimebands < ActiveRecord::Migration +  def change +    create_table :timebands do |t| +      t.string   "objectid", :null => false +      t.integer  "object_version" +      t.datetime "creation_time" +      t.string   "creator_id" +      t.string :name +      t.time :start_time, null: false +      t.time :end_time, null: false + +      t.timestamps +    end +  end +end diff --git a/db/migrate/20151028105423_add_timeband_id_to_journey_frequencies.ninoxe_engine.rb b/db/migrate/20151028105423_add_timeband_id_to_journey_frequencies.ninoxe_engine.rb new file mode 100644 index 000000000..094efa005 --- /dev/null +++ b/db/migrate/20151028105423_add_timeband_id_to_journey_frequencies.ninoxe_engine.rb @@ -0,0 +1,6 @@ +# This migration comes from ninoxe_engine (originally 20151028105340) +class AddTimebandIdToJourneyFrequencies < ActiveRecord::Migration +  def change +    add_reference :journey_frequencies, :timeband, index: true +  end +end diff --git a/db/schema.rb b/db/schema.rb index b68c3190a..38b935b6c 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@  #  # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20150922095511) do +ActiveRecord::Schema.define(version: 20151028105423) do    # These are extensions that must be enabled in order to support this database    enable_extension "plpgsql" @@ -134,6 +134,19 @@ ActiveRecord::Schema.define(version: 20150922095511) do    add_index "delayed_jobs", ["priority", "run_at"], name: "delayed_jobs_priority", using: :btree +  create_table "exports", force: true do |t| +    t.integer  "referential_id",  limit: 8 +    t.string   "status" +    t.string   "type" +    t.string   "options" +    t.datetime "created_at" +    t.datetime "updated_at" +    t.string   "references_type" +    t.string   "reference_ids" +  end + +  add_index "exports", ["referential_id"], name: "index_exports_on_referential_id", using: :btree +    create_table "facilities", force: true do |t|      t.integer  "stop_area_id",       limit: 8      t.integer  "line_id",            limit: 8 @@ -195,6 +208,20 @@ ActiveRecord::Schema.define(version: 20150922095511) do      t.integer "line_id",          limit: 8    end +  create_table "journey_frequencies", force: true do |t| +    t.integer  "vehicle_journey_id" +    t.time     "scheduled_headway_interval",                 null: false +    t.time     "first_departure_time",                       null: false +    t.time     "last_departure_time" +    t.boolean  "exact_time",                 default: false +    t.datetime "created_at" +    t.datetime "updated_at" +    t.integer  "timeband_id" +  end + +  add_index "journey_frequencies", ["timeband_id"], name: "index_journey_frequencies_on_timeband_id", using: :btree +  add_index "journey_frequencies", ["vehicle_journey_id"], name: "index_journey_frequencies_on_vehicle_journey_id", using: :btree +    create_table "journey_patterns", force: true do |t|      t.integer  "route_id",                limit: 8      t.string   "objectid",                          null: false @@ -452,6 +479,18 @@ ActiveRecord::Schema.define(version: 20150922095511) do    add_index "time_tables_vehicle_journeys", ["time_table_id"], name: "index_time_tables_vehicle_journeys_on_time_table_id", using: :btree    add_index "time_tables_vehicle_journeys", ["vehicle_journey_id"], name: "index_time_tables_vehicle_journeys_on_vehicle_journey_id", using: :btree +  create_table "timebands", force: true do |t| +    t.string   "objectid",       null: false +    t.integer  "object_version" +    t.datetime "creation_time" +    t.string   "creator_id" +    t.string   "name" +    t.time     "start_time",     null: false +    t.time     "end_time",       null: false +    t.datetime "created_at" +    t.datetime "updated_at" +  end +    create_table "users", force: true do |t|      t.string   "email",                  default: "", null: false      t.string   "encrypted_password",     default: "" @@ -510,7 +549,7 @@ ActiveRecord::Schema.define(version: 20150922095511) do      t.integer  "journey_pattern_id",              limit: 8      t.integer  "time_slot_id",                    limit: 8      t.integer  "company_id",                      limit: 8 -    t.string   "objectid",                                  null: false +    t.string   "objectid",                                              null: false      t.integer  "object_version"      t.datetime "creation_time"      t.string   "creator_id" @@ -524,6 +563,7 @@ ActiveRecord::Schema.define(version: 20150922095511) do      t.integer  "number",                          limit: 8      t.boolean  "mobility_restricted_suitability"      t.boolean  "flexible_service" +    t.integer  "journey_category",                          default: 0, null: false    end    add_index "vehicle_journeys", ["objectid"], name: "vehicle_journeys_objectid_key", unique: true, using: :btree diff --git a/spec/controllers/vehicle_journey_frequencies_controller_spec.rb b/spec/controllers/vehicle_journey_frequencies_controller_spec.rb new file mode 100644 index 000000000..61636e334 --- /dev/null +++ b/spec/controllers/vehicle_journey_frequencies_controller_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +RSpec.describe VehicleJourneyFrequenciesController, :type => :controller do + +end diff --git a/spec/features/timebands_spec.rb b/spec/features/timebands_spec.rb new file mode 100644 index 000000000..6f07fab4f --- /dev/null +++ b/spec/features/timebands_spec.rb @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +require 'spec_helper' + +describe "Timebands", :type => :feature do +  login_user + +  let!(:timebands) { Array.new(2) { create(:timeband) } } +  subject { timebands.first } + +  describe "list" do +    it "display timebands" do +      visit referential_timebands_path(referential) +      expect(page).to have_content(timebands.first.name) +      expect(page).to have_content(timebands.last.name) +    end + +  end + +  describe "show" do +    it "display timeband" do +      visit referential_timebands_path(referential) +      click_link "#{timebands.first.name}" +      expect(page).to have_content(timebands.first.name) +    end + +  end + +  describe "new" do +    it "creates timeband and return to show" do +      visit referential_timebands_path(referential) +      click_link "Ajouter une plage horaire" +      fill_in "Titre", :with => "Timeband 1" + +      select '10', from: 'timeband_start_time_4i' +      select '00', from: 'timeband_start_time_5i' +      select '11', from: 'timeband_end_time_4i' +      select '00', from: 'timeband_end_time_5i' + +      click_button("Créer plage horaire") +      expect(page).to have_content("Timeband 1") +    end +  end + +  describe "edit and return to show" do +    it "edit timeband" do +      visit referential_timeband_path(referential, subject) +      click_link "Modifier cette plage horaire" +      fill_in "Titre", :with => "Timeband Modified" +      click_button("Modifier plage horaire") +      expect(page).to have_content("Timeband Modified") +    end +  end + +  describe "delete and return to list" do +    it "delete timeband" do +      visit referential_timebands_path(referential) +      page.all('.remove')[0].click +      expect(page).to_not have_content("Timeband Modified") +    end +  end + +end diff --git a/spec/helpers/vehicle_journey_frequencies_helper_spec.rb b/spec/helpers/vehicle_journey_frequencies_helper_spec.rb new file mode 100644 index 000000000..97a1df052 --- /dev/null +++ b/spec/helpers/vehicle_journey_frequencies_helper_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +# Specs in this file have access to a helper object that includes +# the VehicleJourneyFrequenciesHelper. For example: +# +# describe VehicleJourneyFrequenciesHelper do +#   describe "string concat" do +#     it "concats two strings with spaces" do +#       expect(helper.concat_strings("this","that")).to eq("this that") +#     end +#   end +# end +RSpec.describe VehicleJourneyFrequenciesHelper, :type => :helper do +  pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/models/gtfs_export_spec.rb b/spec/models/gtfs_export_spec.rb index 6051497a7..ccc98e872 100644 --- a/spec/models/gtfs_export_spec.rb +++ b/spec/models/gtfs_export_spec.rb @@ -11,7 +11,7 @@ describe GtfsExport, :type => :model do        end        it "should be mandatory" do -        subject.should validate_presence_of(:time_zone) +        should validate_presence_of(:time_zone)        end      end @@ -23,7 +23,7 @@ describe GtfsExport, :type => :model do        end        it "should be mandatory" do -        subject.should_not validate_presence_of(:time_zone) +        should_not validate_presence_of(:time_zone)        end      end diff --git a/spec/views/timebands/edit.html.erb_spec.rb b/spec/views/timebands/edit.html.erb_spec.rb new file mode 100644 index 000000000..26c85c229 --- /dev/null +++ b/spec/views/timebands/edit.html.erb_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +describe "/timebands/edit", :type => :view do +  assign_referential +  let!(:timeband) { assign(:timeband, create(:timeband) ) } + +  describe "test" do +    it "should render h2 with the group name" do +      render +      expect(rendered).to have_selector("h2", text: Regexp.new(timeband.name)) +    end +  end + +  describe "form" do +    it "should render input for timeband" do +      render +      expect(rendered).to have_selector("form") do +        with_tag "input[type=text][name='timeband[name]'][value=?]", timeband.name +      end +    end + +  end +end diff --git a/spec/views/timebands/index.html.erb_spec.rb b/spec/views/timebands/index.html.erb_spec.rb new file mode 100644 index 000000000..0ce0c419c --- /dev/null +++ b/spec/views/timebands/index.html.erb_spec.rb @@ -0,0 +1,20 @@ +require 'spec_helper' + +describe "/timebands/index", :type => :view do + +  assign_referential +  let!(:timebands) { assign :timebands, Array.new(2){ create(:timeband) }.paginate } + +  it "should render a show link for each timeband" do +    render +    timebands.each do |timeband| +      expect(rendered).to have_selector("a[href='#{view.referential_timeband_path(referential, timeband)}']", :text => timeband.name) +    end +  end + +  it "should render a link to create a new timeband" do +    render +    expect(view.content_for(:sidebar)).to have_selector(".actions a[href='#{new_referential_timeband_path(referential)}']") +  end + +end diff --git a/spec/views/timebands/new.html.erb_spec.rb b/spec/views/timebands/new.html.erb_spec.rb new file mode 100644 index 000000000..73a99cad5 --- /dev/null +++ b/spec/views/timebands/new.html.erb_spec.rb @@ -0,0 +1,21 @@ +require 'spec_helper' + +describe "/timebands/new", :type => :view do +  assign_referential +  let!(:timeband) {  assign(:timeband, build(:timeband)) } + +  describe "form" do + +    it "should render inputs" do +      render +      expect(rendered).to have_selector("form") do +        with_selector "input[type=text][name=?]", timeband.name +        with_selector "select[start_time(4i)=?]", timeband.start_time +        with_selector "select[start_time(5i)=?]", timeband.start_time +        with_selector "select[end_time(4i)=?]", timeband.end_time +        with_selector "select[end_time(5i)=?]", timeband.end_time +      end +    end + +  end +end diff --git a/spec/views/timebands/show.html.erb_spec.rb b/spec/views/timebands/show.html.erb_spec.rb new file mode 100644 index 000000000..d43ba588c --- /dev/null +++ b/spec/views/timebands/show.html.erb_spec.rb @@ -0,0 +1,24 @@ +require 'spec_helper' + +describe "/timebands/show", :type => :view do + +  assign_referential +  let!(:timeband) { assign(:timeband, create(:timeband)) } + +  it "should render h2 with the timeband name" do +    render +    expect(rendered).to have_selector("h2", text: Regexp.new(timeband.name)) +  end + +  it "should render a link to edit the timeband" do +    render +    expect(view.content_for(:sidebar)).to have_selector(".actions a[href='#{view.edit_referential_timeband_path(referential, timeband)}']") +  end + +  it "should render a link to remove the timeband" do +    render +    expect(view.content_for(:sidebar)).to have_selector(".actions a[href='#{view.referential_timeband_path(referential, timeband)}'][class='remove']") +  end + +end + diff --git a/spec/views/vehicle_journeys/_form.html.erb_spec.rb b/spec/views/vehicle_journeys/_form.html.erb_spec.rb index ab1d946bf..05fa068d9 100644 --- a/spec/views/vehicle_journeys/_form.html.erb_spec.rb +++ b/spec/views/vehicle_journeys/_form.html.erb_spec.rb @@ -8,7 +8,11 @@ describe "/vehicle_journeys/_form", :type => :view do    let!(:vehicle_journey) { assign :vehicle_journey, create(:vehicle_journey, :route => route) }    it "should render an input for transport_mode" do -    render +    render partial: 'vehicle_journeys/form', +           locals: { vehicle_journey: vehicle_journey, form_url: referential_line_route_vehicle_journeys_path(referential, +                                                                                                              line, +                                                                                                              route, +                                                                                                              vehicle_journey) }      expect(rendered).to have_selector( "select#vehicle_journey_transport_mode_name") do |node|        Chouette::Line.transport_modes.each do |mode|          expect(node).to have_selector("option", :text => mode.text_code) @@ -17,14 +21,22 @@ describe "/vehicle_journeys/_form", :type => :view do    end    it "should render an input for comment" do -    render +    render partial: 'vehicle_journeys/form', +           locals: { vehicle_journey: vehicle_journey, form_url: referential_line_route_vehicle_journeys_path(referential, +                                                                                                              line, +                                                                                                              route, +                                                                                                              vehicle_journey) }      expect(rendered).to have_selector("form") do         with_selector "input[type=text][comment=]", vehicle_journey.comment      end    end    context "stop's time view part" do      it "should render stop's names" do -      render +      render partial: 'vehicle_journeys/form', +             locals: { vehicle_journey: vehicle_journey, form_url: referential_line_route_vehicle_journeys_path(referential, +                                                                                                                line, +                                                                                                                route, +                                                                                                                vehicle_journey) }        expect(rendered).to have_selector("form") do |form_node|           vehicle_journey.stop_points.each do |sp|            form_node.with_selector "label", :text => sp.stop_area.name @@ -32,12 +44,20 @@ describe "/vehicle_journeys/_form", :type => :view do        end      end      it "renders _vehicle_journey_at_stop_fields partial for each vehicle_journey_at_stop" do -      render +      render partial: 'vehicle_journeys/form', +             locals: { vehicle_journey: vehicle_journey, form_url: referential_line_route_vehicle_journeys_path(referential, +                                                                                                                line, +                                                                                                                route, +                                                                                                                vehicle_journey) }        expect(view).to render_template(:partial => "_vehicle_journey_at_stop_fields", :count => vehicle_journey.vehicle_journey_at_stops.count)      end      it "should render vehicle_journey_at_stop's departure time" do -      render +      render partial: 'vehicle_journeys/form', +             locals: { vehicle_journey: vehicle_journey, form_url: referential_line_route_vehicle_journeys_path(referential, +                                                                                                                line, +                                                                                                                route, +                                                                                                                vehicle_journey) }        expect(rendered).to have_selector("form") do |form_node|           vehicle_journey.stop_points.each_with_index do |sp, index|            form_node.with_selector "select", :name => "vehicle_journey[vehicle_journey_at_stops_attributes][#{index}][departure_time(4i)]" @@ -48,7 +68,11 @@ describe "/vehicle_journeys/_form", :type => :view do    end    context "when existing vehicle_journey" do      it "should display objectid not as an input" do -      render +      render partial: 'vehicle_journeys/form', +             locals: { vehicle_journey: vehicle_journey, form_url: referential_line_route_vehicle_journeys_path(referential, +                                                                                                                line, +                                                                                                                route, +                                                                                                                vehicle_journey) }        expect(rendered).to have_selector("form") do           with_selector "input[type=text][objectid=][disabled=true]", vehicle_journey.objectid        end @@ -57,7 +81,11 @@ describe "/vehicle_journeys/_form", :type => :view do    context "when new vehicle_journey" do      let!(:vehicle_journey) { assign :vehicle_journey, build(:vehicle_journey, :route => route) }      it "should render an input for objectid" do -      render +      render partial: 'vehicle_journeys/form', +             locals: { vehicle_journey: vehicle_journey, form_url: referential_line_route_vehicle_journeys_path(referential, +                                                                                                                line, +                                                                                                                route, +                                                                                                                vehicle_journey) }        expect(rendered).to have_selector("form") do           with_selector "input[type=text][objectid=][disabled=false]", vehicle_journey.objectid        end diff --git a/spec/views/vehicle_journeys/_vehicle_journey.html.erb_spec.rb b/spec/views/vehicle_journeys/_vehicle_journey.html.erb_spec.rb new file mode 100644 index 000000000..e1c61c4a7 --- /dev/null +++ b/spec/views/vehicle_journeys/_vehicle_journey.html.erb_spec.rb @@ -0,0 +1,6 @@ +require 'spec_helper' + +describe "/vehicle_journeys/_vehicle_journey", :type => :view do + +  assign_referential +end | 
