diff options
23 files changed, 192 insertions, 91 deletions
@@ -162,4 +162,6 @@ source 'https://rails-assets.org' do gem 'rails-assets-jquery-tokeninput', '~> 1.7.0' gem 'rails-assets-modernizr', '~> 2.0.6' + gem 'rails-assets-datatables' + gem 'rails-assets-datatables-fixedcolumns' end diff --git a/Gemfile.lock b/Gemfile.lock index 422745977..341091b5e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,8 +1,8 @@ GIT remote: git://github.com/afimb/ninoxe.git - revision: 97daab185c83e7c36f4b4b3400bb63c5d9d0f078 + revision: 78d573ca4989cb05f9ab462c7d4ca7c2dad3ae08 specs: - ninoxe (1.2.2) + ninoxe (1.2.3) activerecord (~> 4.1.1) acts-as-taggable-on (>= 3) acts_as_list (>= 0.1.6) @@ -309,6 +309,11 @@ GEM rails-assets-jquery (>= 1.9.0) rails-assets-bootstrap-sass-official (3.3.4) rails-assets-jquery (>= 1.9.0) + rails-assets-datatables (1.10.9) + rails-assets-jquery (>= 1.7.0) + rails-assets-datatables-fixedcolumns (3.1.0) + rails-assets-datatables (>= 1.8.0) + rails-assets-jquery (>= 1.7.0) rails-assets-eonasdan-bootstrap-datetimepicker (3.1.3) rails-assets-bootstrap (>= 3.0) rails-assets-jquery (>= 1.8.3) @@ -539,6 +544,8 @@ DEPENDENCIES rabl rails (~> 4.1.10) rails-assets-bootstrap-sass-official (~> 3.3.0)! + rails-assets-datatables! + rails-assets-datatables-fixedcolumns! rails-assets-eonasdan-bootstrap-datetimepicker (~> 3.1.3)! rails-assets-footable (~> 2.0.3)! rails-assets-jquery-tokeninput (~> 1.7.0)! diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 0862295a4..74e680a68 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -23,6 +23,8 @@ //= require footable/footable.paginate //= require footable/footable.sort //= require tools +//= require datatables +//= require datatables-fixedcolumns //= require_directory ./plugins //= require_directory . //= require_directory ./stop_areas diff --git a/app/assets/javascripts/vehicle_journey_frequencies.js.coffee b/app/assets/javascripts/vehicle_journey_frequencies.js.coffee index 24f83d18b..020283116 100644 --- a/app/assets/javascripts/vehicle_journey_frequencies.js.coffee +++ b/app/assets/javascripts/vehicle_journey_frequencies.js.coffee @@ -1,3 +1,13 @@ -# 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/ +(($) -> + $ -> + $('.ce-VehicleJourneyFrequencyTableBlock').dataTable + searching: false, + ordering: false, + paging: false, + scrollX: true, + fixedColumns: true, + bInfo: false + window.setTimeout('$( ".dataTables_scrollBody" ).animate({scrollLeft: 100}, 500).animate({scrollLeft: 0}, 500)', 1000) + return + return +) jQuery diff --git a/app/assets/javascripts/vehicle_journeys/index.js.coffee b/app/assets/javascripts/vehicle_journeys/index.js.coffee index e89c3f519..e21580f4e 100644 --- a/app/assets/javascripts/vehicle_journeys/index.js.coffee +++ b/app/assets/javascripts/vehicle_journeys/index.js.coffee @@ -1,7 +1,6 @@ -$(".vehicle_journeys.index").ready -> +$(".vehicle_journeys.index, .vehicle_journey_frequencies.index").ready -> $( 'body' ).popover({html: true, trigger: "focus", selector: 'thead th button'}) .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 770e3c82b..f29ca4738 100644 --- a/app/assets/stylesheets/application.css.scss.erb +++ b/app/assets/stylesheets/application.css.scss.erb @@ -30,6 +30,8 @@ $body-bg: #eee; @import "formtastic"; @import 'eonasdan-bootstrap-datetimepicker'; @import 'footable'; +@import 'datatables'; +@import 'datatables-fixedcolumns'; @import "vendor/openlayers_style"; @import "vendor/openlayers_ie6-style"; 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/vehicle_journey_frequencies.scss b/app/assets/stylesheets/main/vehicle_journey_frequencies.scss index 00b68f263..911a3f267 100644 --- a/app/assets/stylesheets/main/vehicle_journey_frequencies.scss +++ b/app/assets/stylesheets/main/vehicle_journey_frequencies.scss @@ -100,4 +100,7 @@ td.ce-VehicleJourneyBlock-frequency { background-color: rgba(95, 95, 95, 0.2); } + .ce-VehicleJourneyFrequencyTableBlock { + margin: 0 !important; + } } diff --git a/app/controllers/vehicle_journeys_controller.rb b/app/controllers/vehicle_journeys_controller.rb index 0c64f0b2c..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,16 +74,9 @@ 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 diff --git a/app/helpers/vehicle_journeys_helper.rb b/app/helpers/vehicle_journeys_helper.rb index 3b2649b34..9b4f055a1 100644 --- a/app/helpers/vehicle_journeys_helper.rb +++ b/app/helpers/vehicle_journeys_helper.rb @@ -16,18 +16,21 @@ 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) + def vehicle_title(vehicle, departure_time=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#{'_frequency' if vehicle.frequency?}.title", :stop => first_vjas.stop_point.stop_area.name, - :time => vehicle_departure(vehicle)) + :time => vehicle_departure(vehicle, departure_time)) end def edit_vehicle_title( vehicle) 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/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/vehicle_journey_frequencies/_show_journey_frequencies.html.erb b/app/views/vehicle_journey_frequencies/_show_journey_frequencies.html.erb index 5d3551503..328c702f9 100644 --- a/app/views/vehicle_journey_frequencies/_show_journey_frequencies.html.erb +++ b/app/views/vehicle_journey_frequencies/_show_journey_frequencies.html.erb @@ -15,7 +15,7 @@ <tr class="<%= cycle :odd, :even %>"> <td> <%= link_to journey_frequency.timeband.fullname, - referential_timeband_path(@referential, journey_frequency.timeband) %> + 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> 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..c915e4f54 --- /dev/null +++ b/app/views/vehicle_journey_frequencies/_vehicle_journeys_matrix.html.erb @@ -0,0 +1,41 @@ +<table class="table table-hover table-striped ce-VehicleJourneyFrequencyTableBlock"> + <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: "vehicle_journeys/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> + <% @matrix.each do |departure_time, vj| %> + <th class="vehicle_journey"> + <button data-style="primary" data-container="body" rel="popover" data-toggle="popover" + data-title='<%= link_to(vehicle_title(vj, departure_time), [@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: "vehicle_journeys/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> + <% @matrix_interval = Chouette::VehicleJourneyFrequency.matrix_interval(@matrix) %> + <% @route.stop_points.each do |sp| %> + <tr class="<%= cycle('odd', 'even') %>"> + <td class="stop_area"><%= sp.stop_area.name %></td> + <% @matrix.each do |departure_time, vj| %> + <% next unless @matrix_interval[sp.id] %> + <% vjas = @matrix_interval[sp.id][departure_time.to_i] %> + <td><%= (vjas && vjas.departure_time) ? l( vjas.departure_time, format: :hour) : '--' %></td> + <% end %> + </tr> + <% end %> + </tbody> +</table> diff --git a/app/views/vehicle_journey_frequencies/_vehicle_journeys_page_info.html.erb b/app/views/vehicle_journey_frequencies/_vehicle_journeys_page_info.html.erb new file mode 100644 index 000000000..fe3ae29e0 --- /dev/null +++ b/app/views/vehicle_journey_frequencies/_vehicle_journeys_page_info.html.erb @@ -0,0 +1 @@ +<span class="search"> <%= t("will_paginate.page_entries_info.search") %></span> <%= page_entries_info @vehicle_journeys %> <%= t('.with_matrix_size', matrix_size: @matrix.size) %> 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/_vehicle_journeys.html.erb b/app/views/vehicle_journeys/_vehicle_journeys.html.erb index b810ae71d..8dc2a74ef 100644 --- a/app/views/vehicle_journeys/_vehicle_journeys.html.erb +++ b/app/views/vehicle_journeys/_vehicle_journeys.html.erb @@ -1,48 +1,12 @@ <div class="page_info"> - <span class="search"> <%= t("will_paginate.page_entries_info.search") %></span> <%= page_entries_info @vehicle_journeys %> + <%= render 'vehicle_journeys_page_info' %> </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, - 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> + <%= 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/_vehicle_journeys_page_info.html.erb b/app/views/vehicle_journeys/_vehicle_journeys_page_info.html.erb new file mode 100644 index 000000000..30b389ee3 --- /dev/null +++ b/app/views/vehicle_journeys/_vehicle_journeys_page_info.html.erb @@ -0,0 +1 @@ +<span class="search"> <%= t("will_paginate.page_entries_info.search") %></span> <%= page_entries_info @vehicle_journeys %> diff --git a/config/locales/vehicle_journey_frequencies.en.yml b/config/locales/vehicle_journey_frequencies.en.yml new file mode 100644 index 000000000..13c6d4e03 --- /dev/null +++ b/config/locales/vehicle_journey_frequencies.en.yml @@ -0,0 +1,4 @@ +en: + vehicle_journey_frequencies: + vehicle_journeys_matrix: + line_routes: "Séquences d'arrêts de la ligne" diff --git a/config/locales/vehicle_journey_frequencies.fr.yml b/config/locales/vehicle_journey_frequencies.fr.yml new file mode 100644 index 000000000..cc1d003f3 --- /dev/null +++ b/config/locales/vehicle_journey_frequencies.fr.yml @@ -0,0 +1,6 @@ +fr: + vehicle_journey_frequencies: + vehicle_journeys_matrix: + line_routes: Séquences d'arrêts de la ligne + vehicle_journeys_page_info: + with_matrix_size: "générant %{matrix_size} courses à fréquences" diff --git a/config/locales/vehicle_journeys.en.yml b/config/locales/vehicle_journeys.en.yml index b0314105c..b70ddb025 100644 --- a/config/locales/vehicle_journeys.en.yml +++ b/config/locales/vehicle_journeys.en.yml @@ -1,6 +1,6 @@ en: vehicle_journeys: - vehicle_journeys: + vehicle_journeys_matrix: line_routes: "Line's routes" vehicle_journey: title_stopless: "Vehicle journey %{name}" diff --git a/config/locales/vehicle_journeys.fr.yml b/config/locales/vehicle_journeys.fr.yml index 984a3ce7a..eda76bde6 100644 --- a/config/locales/vehicle_journeys.fr.yml +++ b/config/locales/vehicle_journeys.fr.yml @@ -1,6 +1,6 @@ fr: vehicle_journeys: - vehicle_journeys: + vehicle_journeys_matrix: line_routes: "Séquences d'arrêts de la ligne" vehicle_journey: title_stopless: "Course %{name}" |
