aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md13
-rw-r--r--Gemfile6
-rw-r--r--Gemfile.lock19
-rw-r--r--README.md6
-rw-r--r--app/assets/images/afimb.pngbin0 -> 9254 bytes
-rw-r--r--app/assets/images/compliance_check_task-completed.pngbin3170 -> 1473 bytes
-rw-r--r--app/assets/images/compliance_check_task-failed.pngbin3144 -> 1460 bytes
-rw-r--r--app/assets/images/compliance_check_task-pending.pngbin3129 -> 1373 bytes
-rw-r--r--app/assets/images/compliance_check_task-processing.pngbin3129 -> 1373 bytes
-rw-r--r--app/assets/images/export-completed.pngbin3170 -> 1473 bytes
-rw-r--r--app/assets/images/export-failed.pngbin3144 -> 1460 bytes
-rw-r--r--app/assets/images/export-pending.pngbin3129 -> 1373 bytes
-rw-r--r--app/assets/images/import_task-completed.pngbin3170 -> 1473 bytes
-rw-r--r--app/assets/images/import_task-failed.pngbin3144 -> 1460 bytes
-rw-r--r--app/assets/images/import_task-pending.pngbin3129 -> 1373 bytes
-rw-r--r--app/assets/images/import_task-processing.pngbin3129 -> 1373 bytes
-rw-r--r--app/assets/images/logoCertu.gifbin2163 -> 0 bytes
-rw-r--r--app/assets/images/logoMEDDE.jpgbin9767 -> 0 bytes
-rw-r--r--app/assets/images/logoMedad.gifbin1568 -> 0 bytes
-rw-r--r--app/assets/images/logoPredim.gifbin2915 -> 0 bytes
-rw-r--r--app/assets/images/logo_chouette.pngbin7148 -> 5631 bytes
-rw-r--r--app/assets/javascripts/application.js2
-rw-r--r--app/assets/javascripts/plugins/jquery.ui.datepicker-i18n.js78
-rw-r--r--app/assets/javascripts/plugins/tooltip.js.coffee2
-rw-r--r--app/assets/javascripts/stop_area_imports.js.coffee0
-rw-r--r--app/assets/javascripts/time_tables.js.coffee7
-rw-r--r--app/assets/javascripts/vehicle_journey_import.js.coffee0
-rw-r--r--app/assets/stylesheets/application.css.scss.erb (renamed from app/assets/stylesheets/application.css.scss)11
-rw-r--r--app/assets/stylesheets/main/calendar.css.scss79
-rw-r--r--app/assets/stylesheets/main/companies.css.scss10
-rw-r--r--app/assets/stylesheets/main/compliance_check_tasks.css.scss26
-rw-r--r--app/assets/stylesheets/main/connection_links.css.scss10
-rw-r--r--app/assets/stylesheets/main/exports.css.scss36
-rw-r--r--app/assets/stylesheets/main/group_of_lines.css.scss10
-rw-r--r--app/assets/stylesheets/main/import_tasks.css.scss26
-rw-r--r--app/assets/stylesheets/main/layout.css.scss596
-rw-r--r--app/assets/stylesheets/main/networks.css.scss9
-rw-r--r--app/assets/stylesheets/main/referentials.css.scss21
-rw-r--r--app/assets/stylesheets/main/routes.css.scss45
-rw-r--r--app/assets/stylesheets/main/time_tables.css.scss80
-rw-r--r--app/assets/stylesheets/main/vehicle_journey_imports.css.scss4
-rw-r--r--app/assets/stylesheets/main/vehicle_journeys.css.scss14
-rw-r--r--app/assets/stylesheets/vendor/formtastic.css.scss41
-rw-r--r--app/assets/stylesheets/vendor/pagination.css.scss19
-rw-r--r--app/controllers/access_links_controller.rb1
-rw-r--r--app/controllers/access_points_controller.rb2
-rw-r--r--app/controllers/stop_area_exports_controller.rb25
-rw-r--r--app/controllers/stop_area_imports_controller.rb24
-rw-r--r--app/controllers/stop_areas_controller.rb2
-rw-r--r--app/controllers/users_controller.rb11
-rw-r--r--app/controllers/vehicle_journey_exports_controller.rb36
-rw-r--r--app/controllers/vehicle_journey_imports_controller.rb27
-rw-r--r--app/helpers/history_helper.rb4
-rw-r--r--app/helpers/pagination_helper.rb2
-rw-r--r--app/helpers/routes_helper.rb10
-rw-r--r--app/models/stop_area_export.rb28
-rw-r--r--app/models/stop_area_import.rb67
-rw-r--r--app/models/vehicle_journey_export.rb12
-rw-r--r--app/models/vehicle_journey_import.rb56
-rw-r--r--app/views/access_links/_form.html.erb2
-rw-r--r--app/views/access_points/_form.html.erb89
-rw-r--r--app/views/access_points/edit.html.erb2
-rw-r--r--app/views/companies/_form.erb2
-rw-r--r--app/views/compliance_check_tasks/_compliance_check_task.erb2
-rw-r--r--app/views/connection_links/_form.erb10
-rw-r--r--app/views/devise/mailer/invitation_instructions.html.erb8
-rw-r--r--app/views/exports/_export.erb27
-rw-r--r--app/views/group_of_lines/_form.erb2
-rw-r--r--app/views/help/access_links.textile5
-rw-r--r--app/views/help/access_points.textile2
-rw-r--r--app/views/help/companies.textile2
-rw-r--r--app/views/help/connection_links.textile2
-rw-r--r--app/views/help/csv.textile5
-rw-r--r--app/views/help/dataspaces.textile7
-rw-r--r--app/views/help/documentation.textile2
-rw-r--r--app/views/help/exports.textile10
-rw-r--r--app/views/help/faq.textile2
-rw-r--r--app/views/help/group_of_lines.textile2
-rw-r--r--app/views/help/imports.textile14
-rw-r--r--app/views/help/index.textile31
-rw-r--r--app/views/help/journey_patterns.textile (renamed from app/views/help/journeypatterns.textile)2
-rw-r--r--app/views/help/kml_exports.textile98
-rw-r--r--app/views/help/lines.textile2
-rw-r--r--app/views/help/networks.textile4
-rw-r--r--app/views/help/normalisation.textile3
-rw-r--r--app/views/help/parametersets.textile14
-rw-r--r--app/views/help/restapis.textile14
-rw-r--r--app/views/help/routes.textile4
-rw-r--r--app/views/help/stop_areas.textile11
-rw-r--r--app/views/help/time_tables.textile (renamed from app/views/help/timetables.textile)1
-rw-r--r--app/views/help/toc.textile6
-rw-r--r--app/views/help/tutorial.textile4
-rw-r--r--app/views/help/validations.textile12
-rw-r--r--app/views/help/vehicle_journeys.textile (renamed from app/views/help/vehiclejourneys.textile)2
-rw-r--r--app/views/import_tasks/_import_task.erb4
-rw-r--r--app/views/journey_patterns/_form.html.erb2
-rw-r--r--app/views/layouts/application.html.erb62
-rw-r--r--app/views/layouts/mailer.html.erb4
-rw-r--r--app/views/layouts/without_sidebar.html.erb37
-rw-r--r--app/views/lines/_form.erb2
-rw-r--r--app/views/lines/index.html.erb12
-rw-r--r--app/views/networks/_form.erb2
-rw-r--r--app/views/referentials/index.html.erb1
-rw-r--r--app/views/routes/_form.html.erb2
-rw-r--r--app/views/routes/_route.html.erb53
-rw-r--r--app/views/routes/show.html.erb8
-rw-r--r--app/views/shared/_footer.erb42
-rw-r--r--app/views/shared/_header.erb93
-rw-r--r--app/views/stop_area_exports/index.xls.erb33
-rw-r--r--app/views/stop_area_imports/new.html.erb24
-rw-r--r--app/views/stop_areas/_form.html.erb7
-rw-r--r--app/views/stop_areas/index.html.erb3
-rw-r--r--app/views/stop_areas/show.html.erb5
-rw-r--r--app/views/time_tables/_date_fields.erb3
-rw-r--r--app/views/time_tables/_dates.html.erb2
-rw-r--r--app/views/time_tables/_excluded_date_fields.erb5
-rw-r--r--app/views/time_tables/_excluded_dates.html.erb7
-rw-r--r--app/views/time_tables/_form.erb47
-rw-r--r--app/views/time_tables/_periods.html.erb35
-rw-r--r--app/views/time_tables/show.html.erb84
-rw-r--r--app/views/vehicle_journey_exports/index.xls.erb26
-rw-r--r--app/views/vehicle_journey_imports/new.html.erb28
-rw-r--r--app/views/vehicle_journeys/_form.html.erb64
-rw-r--r--app/views/vehicle_journeys/_vehicle_journey_at_stop_fields.html.erb24
-rw-r--r--app/views/vehicle_journeys/edit.html.erb4
-rw-r--r--app/views/vehicle_journeys/index.html.erb21
-rw-r--r--config/deploy/production.rb2
-rw-r--r--config/deploy/staging.rb2
-rw-r--r--config/environment.rb2
-rw-r--r--config/environments/development.rb16
-rw-r--r--config/environments/production.rb96
-rw-r--r--config/environments/test.rb14
-rw-r--r--config/initializers/devise.rb42
-rw-r--r--config/locales/compliance_check_results.yml8
-rw-r--r--config/locales/devise.en.yml92
-rw-r--r--config/locales/devise.fr.yml103
-rw-r--r--config/locales/import_tasks.yml1
-rw-r--r--config/locales/layouts.yml50
-rw-r--r--config/locales/lines.yml18
-rw-r--r--config/locales/referentials.yml6
-rw-r--r--config/locales/stop_area_imports.yml33
-rw-r--r--config/locales/time_tables.yml32
-rw-r--r--config/locales/vehicle_journey_imports.yml32
-rw-r--r--config/locales/will_paginate.yml4
-rw-r--r--config/routes.rb1
-rw-r--r--db/migrate/20140626081657_add_in_out_to_timetable_date.ninoxe_engine.rb6
-rw-r--r--db/migrate/20140626081658_set_in_out_to_timetable_date.ninoxe_engine.rb9
-rw-r--r--db/schema.rb5
-rw-r--r--lib/tasks/userdoc.rake132
-rw-r--r--spec/controllers/vehicle_journey_imports_controller_spec.rb7
-rw-r--r--spec/fixtures/stop_area_import_invalid.csv7
-rw-r--r--spec/fixtures/stop_area_import_valid.csv7
-rw-r--r--spec/fixtures/vehicle_journey_imports_valid.csv11
-rw-r--r--spec/fixtures/vehicle_journey_imports_with_vj_invalid.csv5
-rw-r--r--spec/fixtures/vehicle_journey_imports_with_vjas_bad_order.csv6
-rw-r--r--spec/fixtures/vehicle_journey_imports_with_vjas_invalid.csv5
-rw-r--r--spec/models/stop_area_import_spec.rb50
-rw-r--r--spec/models/vehicle_journey_import_spec.rb141
-rw-r--r--spec/models/vehicle_journey_importer_spec.rb99
-rw-r--r--spec/requests/stop_area_imports_spec.rb34
-rw-r--r--spec/requests/time_tables_spec.rb22
-rw-r--r--spec/requests/vehicle_journey_imports_spec.rb59
-rw-r--r--spec/views/layouts/application.html.erb_spec.rb8
-rw-r--r--spec/views/stop_areas/show.html.erb_spec.rb1
164 files changed, 2484 insertions, 1312 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9b72aed0d..b1fa3932e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,15 @@
-# Version 2.4.0 (en recette)
+# Version 2.4.1 (en développement)
+* Corrections d'anomalies
+ * L'export GTFS exige que l'indice de ligne soit renseigné (Mantis 26726)
+ * L'import GTFS ne tient pas compte des courses commençant après minuit (Mantis 25824)
+ * Mise en place d'un script produisant l'aide en ligne sous forme de docx (Mantis 26604)
+ * L'import GTFS plante sur une course qui dessert plus de 2 fois le même arrêt (Mantis 26755)
+ * L'export NeTEx produit un fichier invalide si le champ VersionDate du réseau est vide (Mantis 26434)
+ * Liens cassés dans les pages d'aide (Mantis 26690)
+ * La validation plante si un arrêt n'est pas géolocalisé (Mantis 26931)
+ * L'import plante si l'encodage du catalogue d'un ZIP n'est pas compatible UTF-8 (Mantis 27011)
+
+# Version 2.4.0 (27/05/14)
* Corrections d'anomalies
* L'Import GTFS n'importe pas les fichiers avec marqueurs BOM (Mantis 21260)
* L'Import GTFS n'accepte pas des routes sans colonne agencyId (Mantis 22665)
diff --git a/Gemfile b/Gemfile
index 9681e229a..dbac2f452 100644
--- a/Gemfile
+++ b/Gemfile
@@ -19,6 +19,7 @@ end
# Authentication
gem 'devise', '2.1.3'
+gem 'devise-i18n'
gem 'devise-encryptable'
gem 'devise_invitable'
@@ -60,8 +61,9 @@ gem 'google-analytics-rails'
gem 'will_paginate', '~> 3.0'
gem 'ransack'
gem 'squeel'
-gem 'ninoxe', :git => 'https://github.com/afimb/ninoxe.git', :branch => 'tad_pmr'
-#gem 'ninoxe',:path => '~/Projects/dryade/ninoxe'
+gem 'ninoxe', :git => 'https://github.com/afimb/ninoxe.git', :branch => :sismo
+#gem 'ninoxe',:path => '~/projects/ninoxe'
+#gem 'ninoxe',:path => '~/workspace/chouette/ninoxe'
#gem 'ninoxe', '~> 1.0.1'
gem 'acts_as_list', '0.1.6'
diff --git a/Gemfile.lock b/Gemfile.lock
index cab03b81b..277d100c6 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,11 +1,12 @@
GIT
remote: https://github.com/afimb/ninoxe.git
- revision: 74ebce7462c541521b554a7af2818d1055c404b8
- branch: tad_pmr
+ revision: ee6f1f77974f2b6912ab63c7e3239249cf6e235e
+ branch: sismo
specs:
- ninoxe (1.1.0)
+ ninoxe (1.0.1)
activerecord (>= 3.1.3, < 4.0)
- acts_as_list (~> 0.1.6)
+ acts_as_list (>= 0.1.6)
+ acts_as_tree (>= 1.1.0)
foreigner (= 1.6.0)
georuby-ext (= 0.0.5)
@@ -52,6 +53,8 @@ GEM
i18n (~> 0.6, >= 0.6.4)
multi_json (~> 1.0)
acts_as_list (0.1.6)
+ acts_as_tree (1.6.1)
+ activerecord (>= 3.0.0)
acts_as_tree-1.8 (1.1.0)
activerecord (>= 3.0.0)
addressable (2.3.5)
@@ -107,6 +110,7 @@ GEM
warden (~> 1.2.1)
devise-encryptable (0.1.2)
devise (>= 2.1.0)
+ devise-i18n (0.10.3)
devise_invitable (1.1.0)
actionmailer (~> 3.0)
devise (>= 2.1.0)
@@ -124,9 +128,9 @@ GEM
factory_girl (~> 2.6.0)
railties (>= 3.0.0)
fastercsv (1.5.5)
- ffi (1.0.11)
- ffi (1.0.11-java)
- ffi-geos (0.4.0)
+ ffi (1.9.3)
+ ffi (1.9.3-java)
+ ffi-geos (1.0.0)
ffi (>= 1.0.0)
font-awesome-sass (4.1.0)
sass (~> 3.2)
@@ -369,6 +373,7 @@ DEPENDENCIES
delayed_job_active_record
devise (= 2.1.3)
devise-encryptable
+ devise-i18n
devise_invitable
dr-apartment
factory_girl_rails (= 1.7)
diff --git a/README.md b/README.md
index 59bde48c2..1637d5bd0 100644
--- a/README.md
+++ b/README.md
@@ -63,9 +63,9 @@ Assume Linux user is myuser and its group mygroup (that user is the one who star
sudo mkdir -p /usr/local/opt/chouette-command/
sudo chown -R myuser:mygroup /usr/local/opt/chouette-command/
cd /usr/local/opt/chouette-command/
-wget http://maven.chouette.cityway.fr/fr/certu/chouette/chouette-gui-command/2.4.0/chouette-gui-command-2.4.0.zip
-unzip chouette-gui-command-2.4.0.zip
-cd chouette-cmd_2.4.0
+wget http://maven.chouette.cityway.fr/fr/certu/chouette/chouette-gui-command/2.4.1/chouette-gui-command-2.4.1.zip
+unzip chouette-gui-command-2.4.1.zip
+cd chouette-cmd_2.4.1
sudo chmod a+w .
```
diff --git a/app/assets/images/afimb.png b/app/assets/images/afimb.png
new file mode 100644
index 000000000..238c2b170
--- /dev/null
+++ b/app/assets/images/afimb.png
Binary files differ
diff --git a/app/assets/images/compliance_check_task-completed.png b/app/assets/images/compliance_check_task-completed.png
index a76d76b13..a95854e1b 100644
--- a/app/assets/images/compliance_check_task-completed.png
+++ b/app/assets/images/compliance_check_task-completed.png
Binary files differ
diff --git a/app/assets/images/compliance_check_task-failed.png b/app/assets/images/compliance_check_task-failed.png
index f13b19234..0fa230e65 100644
--- a/app/assets/images/compliance_check_task-failed.png
+++ b/app/assets/images/compliance_check_task-failed.png
Binary files differ
diff --git a/app/assets/images/compliance_check_task-pending.png b/app/assets/images/compliance_check_task-pending.png
index 1e50e36ac..21a702d4f 100644
--- a/app/assets/images/compliance_check_task-pending.png
+++ b/app/assets/images/compliance_check_task-pending.png
Binary files differ
diff --git a/app/assets/images/compliance_check_task-processing.png b/app/assets/images/compliance_check_task-processing.png
index 1e50e36ac..5e3da1382 100644
--- a/app/assets/images/compliance_check_task-processing.png
+++ b/app/assets/images/compliance_check_task-processing.png
Binary files differ
diff --git a/app/assets/images/export-completed.png b/app/assets/images/export-completed.png
index a76d76b13..b6adefb80 100644
--- a/app/assets/images/export-completed.png
+++ b/app/assets/images/export-completed.png
Binary files differ
diff --git a/app/assets/images/export-failed.png b/app/assets/images/export-failed.png
index f13b19234..5f2f3f724 100644
--- a/app/assets/images/export-failed.png
+++ b/app/assets/images/export-failed.png
Binary files differ
diff --git a/app/assets/images/export-pending.png b/app/assets/images/export-pending.png
index 1e50e36ac..7fc459926 100644
--- a/app/assets/images/export-pending.png
+++ b/app/assets/images/export-pending.png
Binary files differ
diff --git a/app/assets/images/import_task-completed.png b/app/assets/images/import_task-completed.png
index a76d76b13..cd047c5fc 100644
--- a/app/assets/images/import_task-completed.png
+++ b/app/assets/images/import_task-completed.png
Binary files differ
diff --git a/app/assets/images/import_task-failed.png b/app/assets/images/import_task-failed.png
index f13b19234..5d7b51646 100644
--- a/app/assets/images/import_task-failed.png
+++ b/app/assets/images/import_task-failed.png
Binary files differ
diff --git a/app/assets/images/import_task-pending.png b/app/assets/images/import_task-pending.png
index 1e50e36ac..cfdb7b421 100644
--- a/app/assets/images/import_task-pending.png
+++ b/app/assets/images/import_task-pending.png
Binary files differ
diff --git a/app/assets/images/import_task-processing.png b/app/assets/images/import_task-processing.png
index 1e50e36ac..88990027b 100644
--- a/app/assets/images/import_task-processing.png
+++ b/app/assets/images/import_task-processing.png
Binary files differ
diff --git a/app/assets/images/logoCertu.gif b/app/assets/images/logoCertu.gif
deleted file mode 100644
index 793f935a5..000000000
--- a/app/assets/images/logoCertu.gif
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/logoMEDDE.jpg b/app/assets/images/logoMEDDE.jpg
deleted file mode 100644
index 06d4a2a1f..000000000
--- a/app/assets/images/logoMEDDE.jpg
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/logoMedad.gif b/app/assets/images/logoMedad.gif
deleted file mode 100644
index b07fdce5f..000000000
--- a/app/assets/images/logoMedad.gif
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/logoPredim.gif b/app/assets/images/logoPredim.gif
deleted file mode 100644
index 22e2c43e0..000000000
--- a/app/assets/images/logoPredim.gif
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/logo_chouette.png b/app/assets/images/logo_chouette.png
index 9bdff022c..f5064d3cd 100644
--- a/app/assets/images/logo_chouette.png
+++ b/app/assets/images/logo_chouette.png
Binary files differ
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
index fa99d193c..748de2483 100644
--- a/app/assets/javascripts/application.js
+++ b/app/assets/javascripts/application.js
@@ -6,7 +6,7 @@
//
//= require jquery
//= require jquery_ujs
-//= require jquery-ui
+//= require jquery.ui.all
//= require modernizr
//= require cocoon
//= require raphael
diff --git a/app/assets/javascripts/plugins/jquery.ui.datepicker-i18n.js b/app/assets/javascripts/plugins/jquery.ui.datepicker-i18n.js
new file mode 100644
index 000000000..ef2bfb631
--- /dev/null
+++ b/app/assets/javascripts/plugins/jquery.ui.datepicker-i18n.js
@@ -0,0 +1,78 @@
+/* French initialisation for the jQuery UI date picker plugin. */
+/* Written by Keith Wood (kbwood{at}iinet.com.au) and Stéphane Nahmani (sholby@sholby.net). */
+jQuery(function($){
+
+ $.datepicker.regional['fr'] = {
+ closeText: 'Fermer',
+ prevText: '&#x3c;Préc',
+ nextText: 'Suiv&#x3e;',
+ currentText: 'Courant',
+ monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+ 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+ monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun',
+ 'Jul','Aoû','Sep','Oct','Nov','Déc'],
+ dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+ dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
+ dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+
+ $.datepicker.regional['en'] = {
+ closeText: 'Done',
+ prevText: 'Prev',
+ nextText: 'Next',
+ currentText: 'Today',
+ monthNames: ['January','February','March','April','May','June',
+ 'July','August','September','October','November','December'],
+ monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+ dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+ dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+
+ if(!(Modernizr.inputtypes && Modernizr.inputtypes.date))
+ {
+ $.datepicker.setDefaults($.datepicker.regional[ "" ]);
+ $("input[type='date']").each( function(index, element)
+ {
+ $(element).datepicker(
+ {
+ dateFormat: "dd/mm/yy",
+ dayNamesShort: $.datepicker.regional[ $('html').attr('lang') ].dayNamesShort,
+ dayNames: $.datepicker.regional[ $('html').attr('lang') ].dayNames,
+ monthNamesShort: $.datepicker.regional[ $('html').attr('lang') ].monthNamesShort,
+ monthNames: $.datepicker.regional[ $('html').attr('lang') ].monthNames
+ } );
+ if ($(element).val().indexOf('/') >= 0)
+ {
+ $(element).datepicker("setDate", $.datepicker.parseDate('dd/mm/yy', $(element).val() ) );
+ }
+ else
+ {
+ $(element).datepicker("setDate", $.datepicker.parseDate('yy-mm-dd', $(element).val() ) );
+ }
+ });
+
+ $("form").submit(function(event) {
+ var $this = $(event.target);
+ $this.find("input[type='date']").each(
+ function(index, element)
+ {
+ var date = $.datepicker.formatDate('yy-mm-dd', $.datepicker.parseDate('dd/mm/yy', $(element).val() ) );
+ $(element).val(date);
+ }
+ );
+ });
+ }
+
+});
diff --git a/app/assets/javascripts/plugins/tooltip.js.coffee b/app/assets/javascripts/plugins/tooltip.js.coffee
new file mode 100644
index 000000000..ca521279e
--- /dev/null
+++ b/app/assets/javascripts/plugins/tooltip.js.coffee
@@ -0,0 +1,2 @@
+jQuery ->
+ $('input').tooltip() \ No newline at end of file
diff --git a/app/assets/javascripts/stop_area_imports.js.coffee b/app/assets/javascripts/stop_area_imports.js.coffee
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/app/assets/javascripts/stop_area_imports.js.coffee
diff --git a/app/assets/javascripts/time_tables.js.coffee b/app/assets/javascripts/time_tables.js.coffee
index 27bcd39f4..972747ee4 100644
--- a/app/assets/javascripts/time_tables.js.coffee
+++ b/app/assets/javascripts/time_tables.js.coffee
@@ -14,6 +14,13 @@ jQuery ->
$('.time_tables a.dates').click(switch_dates)
+ switch_excluded_dates = (event) ->
+ event.preventDefault()
+ $('.time_tables .excluded_dates.content').toggle('slow')
+ $('a.excluded_dates .switcher').toggle()
+
+ $('.time_tables a.excluded_dates').click(switch_excluded_dates)
+
switch_periods = (event) ->
event.preventDefault()
$('.time_tables .periods.content').toggle('slow')
diff --git a/app/assets/javascripts/vehicle_journey_import.js.coffee b/app/assets/javascripts/vehicle_journey_import.js.coffee
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/app/assets/javascripts/vehicle_journey_import.js.coffee
diff --git a/app/assets/stylesheets/application.css.scss b/app/assets/stylesheets/application.css.scss.erb
index 872d621b3..bcea7ca92 100644
--- a/app/assets/stylesheets/application.css.scss
+++ b/app/assets/stylesheets/application.css.scss.erb
@@ -1,15 +1,15 @@
// First import journal variables
// @import "bootswatch/cerulean/variables";
-$brand-primary: #61970b;
+$brand-primary: <%= ChouetteIhm::Application.config.company_theme %>;
+$navbar-default-bg: $brand-primary;
+$navbar-default-link-color: white;
+$body-bg: #eee;
// Then bootstrap itself
@import "bootstrap";
-// Bootstrap body padding for fixed navbar
-// body { padding-top: 60px; }
-
// And finally bootswatch style itself
-@import "bootswatch/cerulean/bootswatch";
+// @import "bootswatch/cerulean/bootswatch";
// Whatever application styles you have go last
// Modules and Variables
@@ -32,6 +32,7 @@ $brand-primary: #61970b;
@import "vendor/jquery.qtip.min";
@import "vendor/tipsy";
@import "vendor/pagination";
+@import "vendor/map_layers";
// Main css
@import "main/*";
diff --git a/app/assets/stylesheets/main/calendar.css.scss b/app/assets/stylesheets/main/calendar.css.scss
index f9f5fd913..3d86dbfa1 100644
--- a/app/assets/stylesheets/main/calendar.css.scss
+++ b/app/assets/stylesheets/main/calendar.css.scss
@@ -31,49 +31,52 @@
}
.calendar {
- color: white;
- text-align: center;
- margin-left: 30px;
- display: inline-table;
+ font-size: 10px;
+ color: white;
+ text-align: center;
+ margin-left: 15px;
+ display: inline-table;
}
thead tr {
- color: black;
+ color: black;
}
- th.monthName {
- font-weight: bold;
- text-align: center;
- padding-top: 1em;
- padding-bottom: 0.7em;
- color: black;
+th.monthName {
+ font-size: 12px;
+ font-weight: bold;
+ text-align: center;
+ padding-top: 1em;
+ padding-bottom: 0.7em;
+ color: black;
}
.dayName th {
- font-size: 0.7em;
- text-align: center;
- padding-top: 0.6em;
- padding-bottom: 0.3em;
- background-color: #303030;
- color: white;
- border-bottom: 1px solid white;
+ text-align: center;
+ padding-top: 0.6em;
+ padding-bottom: 0.3em;
+ background-color: #303030;
+ color: white;
+ border-bottom: 1px solid white;
}
.otherMonth {
- color: #999999;
- background-color: #4f4f5b;
- padding: 0.7em;
- border-right: 1px solid #111111;
- border-bottom: 1px solid #111111;
+ color: #999999;
+ background-color: #4f4f5b;
+ padding: 0.7em;
+ border-right: 1px solid #111111;
+ border-bottom: 1px solid #111111;
}
-.day { background-color: #333333; }
+.day {
+ background-color: #333333;
+}
.day, .specialDay, .selected_period, .selected_date, .overlap_date {
- border-bottom: 1px solid #111111;
- padding: 0.7em;
- border-right: 1px solid #111111;
- border-bottom: 1px solid #111111;
+ border-bottom: 1px solid #111111;
+ padding: 0.7em;
+ border-right: 1px solid #111111;
+ border-bottom: 1px solid #111111;
}
.specialDay { background-color: #a8a8a8 !important; }
@@ -82,23 +85,25 @@ thead tr {
.selected_date { background-color: #8fc861 !important; }
-.overlap_date { background-color: #ffbd2b !important; }
+.excluded_date { background-color: #ff8f85 !important; }
+
+.overlap_date { background-color: #c082f4 !important; }
-.specialDay, .selected_period, .selected_date, .overlap_date {
+.specialDay, .selected_period, .selected_date, .overlap_date, .excluded_date {
a, a:visited, a:hover {
- color: white;
- text-decoration: none;
- }
+ color: white;
+ text-decoration: none;
+ }
}
-.specialDay a:hover, selected_period a:hover, selected_date a:hover, overlap_date a:hover {
+.specialDay a:hover, selected_period a:hover, selected_date a:hover, excluded_date a:hover, overlap_date a:hover {
color: black;
}
.weekendDay {
- background-color: #787888;
+ background-color: #787888;
}
.today {
- background-color: white;
- color: black;
+ background-color: white;
+ color: black;
} \ No newline at end of file
diff --git a/app/assets/stylesheets/main/companies.css.scss b/app/assets/stylesheets/main/companies.css.scss
index 7f058d643..daf4da488 100644
--- a/app/assets/stylesheets/main/companies.css.scss
+++ b/app/assets/stylesheets/main/companies.css.scss
@@ -7,15 +7,7 @@
.companies {
margin-top: 20px;
- }
-
- .company {
- /* to create multi-column index */
- width: 350px;
- float: left;
- padding-right: 10px;
-
- }
+ }
}
#workspace.companies.show
diff --git a/app/assets/stylesheets/main/compliance_check_tasks.css.scss b/app/assets/stylesheets/main/compliance_check_tasks.css.scss
index e9f141758..c81153848 100644
--- a/app/assets/stylesheets/main/compliance_check_tasks.css.scss
+++ b/app/assets/stylesheets/main/compliance_check_tasks.css.scss
@@ -18,23 +18,16 @@
.compliance_check_task {
div.icon{
- display: inline-block;
- vertical-align: top;
- width: 74px;
- padding-right: 5px;
-
- img{
- width: 64px;
- height: 64px;
- }
+ float: left;
}
div.resume{
- display: inline-block;
+ float: right;
+ width: 70%;
ul.header{
font-size: 14px;
- width: 209px;
+ padding-left: 0px;
.title{ float: left; }
.remove{
@@ -46,12 +39,15 @@
.links {
font-size: 10px;
- height: 38px;
-
- p { margin: 3px 0px 0px 0px !important; }
-
+ p { margin: 3px 0px 0px 0px !important; }
img { margin-right: 10px;}
}
+
+ .history {
+ color: $gray-light;
+ margin-top: 5px;
+ font-size: 10px;
+ }
}
}
}
diff --git a/app/assets/stylesheets/main/connection_links.css.scss b/app/assets/stylesheets/main/connection_links.css.scss
index b1691ccf1..d4672cd31 100644
--- a/app/assets/stylesheets/main/connection_links.css.scss
+++ b/app/assets/stylesheets/main/connection_links.css.scss
@@ -7,15 +7,7 @@
.connection_links {
margin-top: 20px;
- }
-
- .connection_link {
-
- /* to create multi-column index */
- width: 350px;
- float: left;
- padding-right: 10px;
- }
+ }
}
diff --git a/app/assets/stylesheets/main/exports.css.scss b/app/assets/stylesheets/main/exports.css.scss
index 59273ecfc..10d39db19 100644
--- a/app/assets/stylesheets/main/exports.css.scss
+++ b/app/assets/stylesheets/main/exports.css.scss
@@ -7,6 +7,42 @@
.exports {
margin-top: 20px;
+ }
+
+ .export {
+
+ div.icon{
+ float: left;
+ }
+
+ div.resume{
+ float: right;
+ width: 70%;
+
+ ul.header{
+ font-size: 14px;
+ padding-left: 0px;
+
+ .title{ float: left; }
+ .remove{
+ float: right;
+ padding-right: 10px;
+ color: #494949;
+ }
+ }
+
+ .links {
+ font-size: 10px;
+ p { margin: 3px 0px 0px 0px !important; }
+ img { margin-right: 10px;}
+ }
+
+ .history {
+ color: $gray-light;
+ margin-top: 5px;
+ font-size: 10px;
+ }
+ }
}
}
diff --git a/app/assets/stylesheets/main/group_of_lines.css.scss b/app/assets/stylesheets/main/group_of_lines.css.scss
index ea943eb0f..f56f76e44 100644
--- a/app/assets/stylesheets/main/group_of_lines.css.scss
+++ b/app/assets/stylesheets/main/group_of_lines.css.scss
@@ -7,15 +7,7 @@
.group_of_lines {
margin-top: 20px;
- }
-
- .group_of_line {
- /* to create multi-column index */
- width: 350px;
- float: left;
- padding-right: 10px;
-
- }
+ }
}
#workspace.group_of_lines.show
diff --git a/app/assets/stylesheets/main/import_tasks.css.scss b/app/assets/stylesheets/main/import_tasks.css.scss
index 3e82e5c5d..dabd84ae6 100644
--- a/app/assets/stylesheets/main/import_tasks.css.scss
+++ b/app/assets/stylesheets/main/import_tasks.css.scss
@@ -17,23 +17,16 @@
.import_task {
div.icon{
- display: inline-block;
- vertical-align: top;
- width: 74px;
- padding-right: 5px;
-
- img{
- width: 64px;
- height: 64px;
- }
+ float: left;
}
div.resume{
- display: inline-block;
+ float: right;
+ width: 70%;
ul.header{
font-size: 14px;
- width: 209px;
+ padding-left: 0px;
.title{ float: left; }
.remove{
@@ -44,12 +37,15 @@
.links {
font-size: 10px;
- height: 38px;
-
- p { margin: 3px 0px 0px 0px !important; }
-
+ p { margin: 3px 0px 0px 0px !important; }
img { margin-right: 10px;}
}
+
+ .history {
+ color: $gray-light;
+ margin-top: 5px;
+ font-size: 10px;
+ }
}
}
}
diff --git a/app/assets/stylesheets/main/layout.css.scss b/app/assets/stylesheets/main/layout.css.scss
index ae761934d..faf5c1e7d 100644
--- a/app/assets/stylesheets/main/layout.css.scss
+++ b/app/assets/stylesheets/main/layout.css.scss
@@ -1,320 +1,351 @@
-/* Green theme */
-$header_background: #61970b;
-$header_color: white;
-$tabs_background: #86b41d;
-$tabs_color: white;
-$text_color: #222;
-
-/* Old layout */
-
body {
- background: #E5E5E5;
+ padding-top: 55px;
}
+h1{ color: white;}
+
h1, .h1, h2, .h2, h3, .h3 {
margin-bottom: 20px;
}
+label.label{
+ color: black;
+ font-size: 100%;
+}
+
+ol.breadcrumb{
+ margin-top: 10px;
+}
+
#header {
- background: $brand_primary url(image-path('header.png')) no-repeat;
+
+ .navbar-brand{
+ padding-top: 5px;
+ padding-bottom: 5px;
+ line-height: 40px;
+
+ img {
+ height: 40px;
+ }
- div.logo {
- padding: 15px 0 0 30px;
-
.version
- {
+ {
margin-left: 10px;
- vertical-align: bottom;
- font-weight: bold;
+ vertical-align: text-top;
color: white;
+ font-size: 13px;
}
}
- div.title
- {
- h1 {
- text-align: center
- }
- }
-
- div.interaction{
- text-align: right;
- margin: 0 20px 0 0;
-
- ul.user {
- color: $tabs_color;
-
- li {
- font-size: 13px;
- display: inline;
- margin: 0 3px;
- }
-
- a {
- color: $tabs_color;
- text-decoration: underline;
- line-height: 55px;
- }
-
- li.language, li.home {
- margin: 0 1px;
- text-decoration: none;
- }
-
- li.language.selected
- {
- border-bottom: 2px solid black;
- }
-
- span.help {
- color: $header_background;
- font-size: 11px;
- border-radius:6px;
- -moz-border-radius: 6px;
- background-color: white;
- padding: 3px 5px;
- }
- }
- }
-
- .tabs {
- margin: 10px 30px 0 30px;
-
- // Override bootsrap default
-
- .nav-tabs {
- border: none;
-
- li { margin-bottom: 0px;}
- }
-
- li {
-
- a:link, a:visited {
- background-color: $tabs_background;
- color: $tabs_color;
- }
-
- a.current {
- color: $text_color;
- font-weight: bold;
- background: -webkit-gradient(linear, left top, left bottom, from(#E5E5E5), to(white));
- background: -moz-linear-gradient(top, #E5E5E5, white);
- }
- }
+ background: $brand_primary url(image-path('header.png')) no-repeat;
- li.admin {
- float: right;
+ .gravatar {
+ margin-right: 5px;
+ img{
+ width: 25px;
+ height: 25px;
}
}
-}
-
-.actions {
- a {
- padding-left: 20px;
- text-decoration: underline;
- }
-
- a.visit_site{
- background: url(image-path('icons/site.png')) no-repeat;
- }
- a.visit_event{
- background: url(image-path('icons/event.png')) no-repeat;
- }
-
- a.visit_page{
- background: url(image-path('icons/page.png')) no-repeat;
+ .language{
+ width: 40px;
}
- a.add {
- background: url(image-path('icons/add.png')) no-repeat;
- }
- a.edit {
- background: url(image-path('icons/edit.png')) no-repeat;
- }
- a.remove {
- background: url(image-path('icons/remove.png')) no-repeat;
- }
- a.export {
- background: url(image-path('icons/export.png')) no-repeat;
- }
- li {
- margin: 10px 0;
+ .language.selected
+ {
+ border-bottom: 1px solid white;
}
+
+ .dropdown-menu{
+ min-width: 230px;
+
+ .badge{
+ background-color: #DADADA
+ }
+ }
}
-#body {
- min-width: 1000px;
+#footer{
+ padding: 20px;
+ background-color: $gray-darker;
+ color: $gray-light;
+ font-size: 12px;
+ min-height: 200px;
- a{ text-decoration: underline;}
+ a { color: $gray-light; }
+
+ h4 { color: $gray-lighter; }
- #workspace, #sidebar {
- float: left;
+ .logo > img {
+ margin-left: 20px;
}
}
-#body #workspace {
- width: 70%;
+#middle{
+ min-height: 500px;
+ -webkit-box-shadow: 0 0 5px 2px rgba(0, 0, 0, .2);
+ box-shadow: 0 0 5px 2px rgba(0, 0, 0, .2);
+ padding-bottom: 10px;
+ margin-top: 20px;
+ margin-bottom: 20px;
background: white;
- margin: 15px 30px;
- padding: 0 15px 10px 15px;
-
- -moz-box-shadow: 3px 3px 4px #BBB;
- -webkit-box-shadow: 3px 3px 4px #BBB;
- box-shadow: 3px 3px 4px #BBB;
- border-right: 1px solid #BBB;
- border-bottom: 1px solid #BBB;
-
- li span.author {
- float: right;
- font-size: 12px;
- }
- .site_summary {
- float: left;
- margin-bottom: 20px;
- width: 100%;
-
- img {
- float: left;
- margin-right: 20px;
- }
- a {
- display: block;
- margin: 25px 0 0;
- }
- }
- .site_summary:after {
- content: " ";
- display: block;
- height: 0;
- clear: both;
- visibility: hidden;
- }
-
- fieldset.buttons{
- margin: 10px;
+ .main_actions{
+ text-align: right;
}
-
- form {
+
+ .alert{ margin-top: 15px ; }
+
+ #sidebar{
+ height: 100%;
+ padding-top: 20px;
+ border-left: 1px solid $gray-lighter;
+
label {
color: #555555;
- font-size: 100%;
- text-align: right;
+ font-weight: normal;
+ font-size: 12px;
}
-
-
- }
-}
-
-#body #flash {
- width: 72%;
- margin: 15px 0 0 30px;
-
- div {
- padding: 10px 10px 10px 50px;
- }
- .alert {
- color: #c01100;
- background: #ffbdbd url(image-path('icons/alert.png')) no-repeat 15px;
- }
- .notice {
- background: #EDF3FE url(image-path('icons/notice.png')) no-repeat 15px;
- }
-}
-
-#body #sidebar {
- width: 20%;
- padding-top: 20px;
+ a {
+ color: #666;
+ }
+
+ .actions {
+ margin-bottom: 20px;
+ }
+
+ p {
+ font-size: 12px;
+ }
- label {
- color: #555555;
- font-weight: normal;
- font-size: 100%;
- }
-
- a {
- color: #666;
- }
-
- .actions {
- margin-bottom: 20px;
- }
+ fieldset.history_tag{
- p {
- font-size: 12px;
- }
+ legend{
+ font-size: 14px;
+ margin-bottom: 10px;
+ }
- fieldset
- {
- border-color: white;
+ font-size: 12px;
+ color: $gray-light;
+ }
- p{
- margin-top: 5px;
- label{ font-size: 12px;}
- span{
- font-style: oblique;
- font-size:12px;
+ fieldset
+ {
+ border-color: white;
+
+ p{
+ margin-top: 5px;
+ label{ font-size: 12px;}
+ span{
+ font-style: oblique;
+ font-size:12px;
+ }
}
}
- }
-
- ol {
- padding: 0px;
- li {
- list-style: none;
+ ol {
+ padding: 0px;
+
+ li {
+ list-style: none;
+ }
}
- }
-
- ul {
- padding: 0px;
- li {
- list-style: none;
- }
- }
-
- ul.selection li {
- a {
- padding-left: 20px;
- }
- a.current {
- text-decoration: none;
- color: black !important;
- background: url(image-path('icons/accept.png')) no-repeat;
+ ul {
+ padding: 0px;
+
+ li {
+ list-style: none;
+ }
}
- a.all {
- background-image: none;
+
+ ul.selection li {
+ a {
+ padding-left: 20px;
+ }
+ a.current {
+ text-decoration: none;
+ color: black !important;
+ background: url(image-path('icons/accept.png')) no-repeat;
+ }
+ a.all {
+ background-image: none;
+ }
}
- }
-
- div#compact_form {
- form {
- border-bottom: 1px solid #BBB;
- fieldset {
- padding: 0;
- border: 0;
- li {
+
+ div#compact_form {
+ form {
+ border-bottom: 1px solid #BBB;
+ fieldset {
padding: 0;
- label { padding-left: 20px;
- width: 70%;}
- input { width: 20px; }
+ border: 0;
+ li {
+ padding: 0;
+ label { padding-left: 20px;
+ width: 70%;}
+ input { width: 20px; }
+ }
+ }
+ fieldset.actions {
+ margin-bottom: 0;
+ padding-left: 20px;
+ }
+ fieldset.inputs {
+ padding-top: 16px;
}
- }
- fieldset.actions {
- margin-bottom: 0;
- padding-left: 20px;
- }
- fieldset.inputs {
- padding-top: 16px;
}
}
- }
+ }
}
+/* #body #workspace { */
+/* width: 70%; */
+/* background: white; */
+/* margin: 0px 30px; */
+/* padding: 0 15px 10px 15px; */
+
+/* -moz-box-shadow: 3px 3px 4px #BBB; */
+/* -webkit-box-shadow: 3px 3px 4px #BBB; */
+/* box-shadow: 3px 3px 4px #BBB; */
+/* border-right: 1px solid #BBB; */
+/* border-bottom: 1px solid #BBB; */
+
+/* li span.author { */
+/* float: right; */
+/* font-size: 12px; */
+/* } */
+
+/* .site_summary { */
+/* float: left; */
+/* margin-bottom: 20px; */
+/* width: 100%; */
+
+/* img { */
+/* float: left; */
+/* margin-right: 20px; */
+/* } */
+/* a { */
+/* display: block; */
+/* margin: 25px 0 0; */
+/* } */
+/* } */
+/* .site_summary:after { */
+/* content: " "; */
+/* display: block; */
+/* height: 0; */
+/* clear: both; */
+/* visibility: hidden; */
+/* } */
+
+/* fieldset.buttons{ */
+/* margin: 10px; */
+/* } */
+
+/* form { */
+/* label { */
+/* color: #555555; */
+/* font-size: 100%; */
+/* text-align: right; */
+/* } */
+
+
+/* } */
+
+/* } */
+
+/* #body
+
+/* #body #sidebar { */
+/* width: 20%; */
+/* padding-top: 20px; */
+
+/* label { */
+/* color: #555555; */
+/* font-weight: normal; */
+/* font-size: 100%; */
+/* } */
+
+/* a { */
+/* color: #666; */
+/* } */
+
+/* .actions { */
+/* margin-bottom: 20px; */
+/* } */
+
+/* p { */
+/* font-size: 12px; */
+/* } */
+
+/* fieldset */
+/* { */
+/* border-color: white; */
+
+/* p{ */
+/* margin-top: 5px; */
+/* label{ font-size: 12px;} */
+/* span{ */
+/* font-style: oblique; */
+/* font-size:12px; */
+/* } */
+/* } */
+/* } */
+
+/* ol { */
+/* padding: 0px; */
+
+/* li { */
+/* list-style: none; */
+/* } */
+/* } */
+
+/* ul { */
+/* padding: 0px; */
+
+/* li { */
+/* list-style: none; */
+/* } */
+/* } */
+
+/* ul.selection li { */
+/* a { */
+/* padding-left: 20px; */
+/* } */
+/* a.current { */
+/* text-decoration: none; */
+/* color: black !important; */
+/* background: url(image-path('icons/accept.png')) no-repeat; */
+/* } */
+/* a.all { */
+/* background-image: none; */
+/* } */
+/* } */
+
+/* div#compact_form { */
+/* form { */
+/* border-bottom: 1px solid #BBB; */
+/* fieldset { */
+/* padding: 0; */
+/* border: 0; */
+/* li { */
+/* padding: 0; */
+/* label { padding-left: 20px; */
+/* width: 70%;} */
+/* input { width: 20px; } */
+/* } */
+/* } */
+/* fieldset.actions { */
+/* margin-bottom: 0; */
+/* padding-left: 20px; */
+/* } */
+/* fieldset.inputs { */
+/* padding-top: 16px; */
+/* } */
+/* } */
+/* } */
+/* } */
+
.info {
font-size: 10px;
color: #777;
@@ -350,6 +381,43 @@ h1, .h1, h2, .h2, h3, .h3 {
}
.actions {
+ a {
+ padding-left: 20px;
+ }
+
+ /* Hack with font icon */
+ a.vehicle_journeys{
+ padding-left: 4px;
+ }
+
+ a.visit_site{
+ background: url(image-path('icons/site.png')) no-repeat;
+ }
+
+ a.visit_event{
+ background: url(image-path('icons/event.png')) no-repeat;
+ }
+
+ a.visit_page{
+ background: url(image-path('icons/page.png')) no-repeat;
+ }
+
+ a.add {
+ background: url(image-path('icons/add.png')) no-repeat;
+ }
+ a.edit {
+ background: url(image-path('icons/edit.png')) no-repeat;
+ }
+ a.remove {
+ background: url(image-path('icons/remove.png')) no-repeat;
+ }
+ a.export {
+ background: url(image-path('icons/export.png')) no-repeat;
+ }
+ li {
+ margin: 10px 0;
+ }
+
a.add_children {
background: url(image-path('icons/add.png')) no-repeat;
}
diff --git a/app/assets/stylesheets/main/networks.css.scss b/app/assets/stylesheets/main/networks.css.scss
index df5665f36..3730d6668 100644
--- a/app/assets/stylesheets/main/networks.css.scss
+++ b/app/assets/stylesheets/main/networks.css.scss
@@ -7,14 +7,7 @@
.networks {
margin-top: 20px;
}
-
- .network {
- /* to create multi-column index */
- width: 350px;
- float: left;
- padding-right: 10px;
-
- }
+
}
#workspace.networks.show
diff --git a/app/assets/stylesheets/main/referentials.css.scss b/app/assets/stylesheets/main/referentials.css.scss
index 715b152e8..f5c2fa030 100644
--- a/app/assets/stylesheets/main/referentials.css.scss
+++ b/app/assets/stylesheets/main/referentials.css.scss
@@ -7,17 +7,7 @@
.referentials {
margin-top: 20px;
- }
-
- .referential {
-
- /* to create multi-column index */
- width: 350px;
- float: left;
- padding-right: 10px;
- position: relative;
-
- }
+ }
}
#workspace.referentials.show
{
@@ -64,12 +54,3 @@
}
}
}
-
-ul.logos {
- margin: 30px 30px 0 0;
-
- li {
- display: inline;
- margin: 0 3px;
- }
-}
diff --git a/app/assets/stylesheets/main/routes.css.scss b/app/assets/stylesheets/main/routes.css.scss
index 027cde222..83ff13547 100644
--- a/app/assets/stylesheets/main/routes.css.scss
+++ b/app/assets/stylesheets/main/routes.css.scss
@@ -5,30 +5,37 @@
#workspace.lines.show
{
- .routes {
+ .routes{
margin-top: 20px;
- }
-
- .route {
- /* to create multi-column index */
- width: 350px;
- padding-right: 10px;
- .wayback {
- width: 16px;
- height: 16px;
- float: left;
- margin-right: 10px;
+ .route{
+
+ .header{
+ font-weight: bold;
+
+ .wayback{
+ float: right;
+ }
+ }
- a{ margin:0px;}
- }
-
- .name {
- line-height: 16px;
- float: left;
+ .body {
+ margin: 10px;
+ font-size: 11px;
+
+ p{ margin: 0 0 5px;}
+
+ i{
+ margin-right: 10px;
+ font-size: 12px;
+ }
+
+ img{
+ margin-right: 10px;
+ }
+ }
}
-
}
+
}
#workspace.routes.edit, #workspace.routes.new, #workspace.routes.create, #workspace.routes.update
diff --git a/app/assets/stylesheets/main/time_tables.css.scss b/app/assets/stylesheets/main/time_tables.css.scss
index 071b16b52..09ab50283 100644
--- a/app/assets/stylesheets/main/time_tables.css.scss
+++ b/app/assets/stylesheets/main/time_tables.css.scss
@@ -11,12 +11,6 @@
.time_table {
- /* to create multi-column index */
- width: 350px;
- float: left;
- padding-right: 10px;
- position: relative;
-
.state-code {
width: 25px;
height: 64px;
@@ -101,32 +95,12 @@
.periods {
cursor: pointer;
}
+ .excluded_dates {
+ cursor: pointer;
+ }
}
- .day_type ol {
- float: left;
- margin: 0;
- padding: 0 0 0 0;
- width: 100%;
- list_style: none outside none;
- margin-top: 0.5em;
- margin-bottom: 1em;
- }
- .day_type ol li {
- float: left;
- margin: 0 O 0 0;
- width: auto;
- padding: 0;
- }
- .day_type_label {
- float: left;
- margin-top: 0;
- width: 25%;
- }
- .day_type ol li label {
- padding-left: 10%;
- }
.dates ol {
margin-top: -0.3em;
@@ -145,6 +119,23 @@
.dates ol li.fl1 label {width: 40%; margin-top: -0.3em; }
.dates ol li.fl1 input { width: 50%; }
+ .excluded_dates ol {
+ margin-top: -0.3em;
+ margin-bottom: 1em;
+ margin-left: 25%;
+ padding: 0;
+ width: 75%;
+ }
+ .excluded_dates ol li { padding : 0.3em 0; }
+
+ .excluded_dates ol li label {
+ width: 40%;
+ margin-top: -0.3em;
+ }
+ .excluded_dates ol li.fl1 {float: left; width: 30% ;}
+ .excluded_dates ol li.fl1 label {width: 40%; margin-top: -0.3em; }
+ .excluded_dates ol li.fl1 input { width: 50%; }
+
.periods ol {
margin-top: -0.3em;
@@ -166,16 +157,43 @@
.periods ol li.fl2 {float: left; width: 30% ;}
.periods ol li.fl2 label {width: 40%; margin-top: -0.3em;}
.periods ol li.fl2 input { width: 50%; }
+
+ .day_type ol {
+ float: left;
+ margin: 0;
+ padding: 0 0 0 0;
+ width: 100%;
+ list_style: none outside none;
+ margin-top: 1em;
+ margin-bottom: 1em;
+ }
+ .day_type ol li {
+ float: left;
+ margin: 0 O 0 0;
+ width: auto;
+ padding: 0;
+ }
+ .day_type_label {
+ float: left;
+ margin-top: 0;
+ width: 25%;
+ }
+ .day_type ol li label {
+ padding-left: 10%;
+ margin-top: 0;
+ }
+
+
a.add_fields {
margin-left: 25%;
color: #666;
padding-left: 18px;
- background: url(image-path('user_interface/ui/add.png')) no-repeat 0% 50%;
+ background: url(image-path('icons/add.png')) no-repeat 0% 50%;
}
a.remove_fields {
color: #666;
padding-left: 18px;
- background: url(image-path('user_interface/ui/remove.png')) no-repeat 0% 50%;
+ background: url(image-path('icons/remove.png')) no-repeat 0% 50%;
}
}
diff --git a/app/assets/stylesheets/main/vehicle_journey_imports.css.scss b/app/assets/stylesheets/main/vehicle_journey_imports.css.scss
index ece81080b..529182443 100644
--- a/app/assets/stylesheets/main/vehicle_journey_imports.css.scss
+++ b/app/assets/stylesheets/main/vehicle_journey_imports.css.scss
@@ -1,8 +1,4 @@
#workspace.vehicle_journey_imports.new
{
- .export{
- margin: 5px 0 15px 0 !important;
- .file{ margin-left: 5px; }
- }
} \ No newline at end of file
diff --git a/app/assets/stylesheets/main/vehicle_journeys.css.scss b/app/assets/stylesheets/main/vehicle_journeys.css.scss
index 143feada2..0a2fce05a 100644
--- a/app/assets/stylesheets/main/vehicle_journeys.css.scss
+++ b/app/assets/stylesheets/main/vehicle_journeys.css.scss
@@ -16,9 +16,16 @@
#workspace.vehicle_journeys.index
{
- table{ margin: 20px 0 0 0; }
-
+ table{
+
+ margin: 20px 0 0 0;
+
+ .calendars{
+ font-size: 12px;
+ }
+ .stop_area{ width: 200px; }
+ }
}
@@ -30,8 +37,7 @@
.to_arrivals {
cursor: pointer;
- }
-
+ }
}
#workspace.vehicle_journeys.show
diff --git a/app/assets/stylesheets/vendor/formtastic.css.scss b/app/assets/stylesheets/vendor/formtastic.css.scss
index e852e65e4..078cf41ab 100644
--- a/app/assets/stylesheets/vendor/formtastic.css.scss
+++ b/app/assets/stylesheets/vendor/formtastic.css.scss
@@ -1,29 +1,20 @@
fieldset.inputs {
-
- li.string input { width: 500px; }
-
- fieldset.inputs{
- /* border: 2px groove threedface; */
- /* margin-bottom: 20px; */
- /* padding: 10px; */
- /* legend span{ */
- /* font-weight: bold; */
- /* padding: 5px; */
- /* } */
+ a.action { float: right; }
+}
- /* li.special { */
- /* display: inline-block; */
- /* width: 40%; */
-
- /* label.label { */
- /* width: 60%; */
- /* margin-right: 10px; */
- /* } */
-
- /* } */
-
- a.action { float: right; }
-
+.formtastic .choices .label, .formtastic .fragments .label {
+ width: 25%;
+ border: 0px;
+
+ label {
+ position: relative;
+ font-size: 14px;
}
-} \ No newline at end of file
+}
+
+/* Hack to remove!!!! */
+.formtastic .inputs input[type="file"] {
+ display: initial;
+}
+/* Hack to remove!!!! */ \ No newline at end of file
diff --git a/app/assets/stylesheets/vendor/pagination.css.scss b/app/assets/stylesheets/vendor/pagination.css.scss
index b0c524084..87eb905e8 100644
--- a/app/assets/stylesheets/vendor/pagination.css.scss
+++ b/app/assets/stylesheets/vendor/pagination.css.scss
@@ -19,4 +19,23 @@
@include border-left-radius(5px);
@include border-bottom-radius(5px);
}
+}
+
+.page_info {
+ margin: 20px 0 0 0;
+ height: 30px;
+ line-height: 30px;
+ color: $gray;
+ border-bottom: solid 1px #cdc9c0;
+ border-top: solid 1px #cdc9c0;
+
+ .search{
+ margin: 0 20px 0 10px;
+ color: $brand_primary;
+ font-weight:bold;
+ }
+
+ b {
+ padding: 0.1em 0.25em;
+ }
} \ No newline at end of file
diff --git a/app/controllers/access_links_controller.rb b/app/controllers/access_links_controller.rb
index a8c4a3ba3..8c6172a7c 100644
--- a/app/controllers/access_links_controller.rb
+++ b/app/controllers/access_links_controller.rb
@@ -9,7 +9,6 @@ class AccessLinksController < ChouetteController
respond_to :html, :xml, :json
respond_to :kml, :only => :show
-
def index
request.format.kml? ? @per_page = nil : @per_page = 12
index!
diff --git a/app/controllers/access_points_controller.rb b/app/controllers/access_points_controller.rb
index 6203cefab..309550148 100644
--- a/app/controllers/access_points_controller.rb
+++ b/app/controllers/access_points_controller.rb
@@ -6,7 +6,7 @@ class AccessPointsController < ChouetteController
end
respond_to :html, :kml, :xml, :json
-
+ layout "without_sidebar", :only => [:edit, :update]
def index
request.format.kml? ? @per_page = nil : @per_page = 12
diff --git a/app/controllers/stop_area_exports_controller.rb b/app/controllers/stop_area_exports_controller.rb
new file mode 100644
index 000000000..e675a9826
--- /dev/null
+++ b/app/controllers/stop_area_exports_controller.rb
@@ -0,0 +1,25 @@
+class StopAreaExportsController < ChouetteController
+ belongs_to :referential
+
+ respond_to :csv, :only => [:index]
+ respond_to :xls, :only => [:index]
+
+ def index
+ @column_names = column_names
+ index! do |format|
+ format.csv { send_data StopAreaExport.new( {:column_names => column_names, :stop_areas => collection} ).to_csv }
+ format.xls
+ end
+ end
+
+ protected
+
+ def column_names
+ ["id","name","longitude","latitude","area_type","parent_id", "comment","country_code","street_name","mobility_restricted_suitability","stairs_availability","lift_availability","int_user_needs"]
+ end
+
+ def collection
+ @stop_areas ||= Chouette::StopArea.order(:country_code, :name)
+ end
+
+end
diff --git a/app/controllers/stop_area_imports_controller.rb b/app/controllers/stop_area_imports_controller.rb
new file mode 100644
index 000000000..ff93dc40e
--- /dev/null
+++ b/app/controllers/stop_area_imports_controller.rb
@@ -0,0 +1,24 @@
+class StopAreaImportsController < ChouetteController
+ belongs_to :referential
+
+ actions :new, :create
+ respond_to :html, :only => :new
+
+ def new
+ @stop_area_import = StopAreaImport.new
+ new!
+ end
+
+ def create
+ @stop_area_import = StopAreaImport.new(params[:stop_area_import])
+ if @stop_area_import.save
+ redirect_to referential_stop_areas_path( @referential ), notice: I18n.t("stop_area_imports.new.success")
+ else
+ flash[:error] = I18n.t("stop_area_imports.errors.import_aborted") + "<br>" + @stop_area_import.errors.full_messages.join("<br>")
+ render :new
+ end
+ end
+
+ protected
+
+end
diff --git a/app/controllers/stop_areas_controller.rb b/app/controllers/stop_areas_controller.rb
index d54d888e4..c433546b9 100644
--- a/app/controllers/stop_areas_controller.rb
+++ b/app/controllers/stop_areas_controller.rb
@@ -10,6 +10,8 @@ class StopAreasController < ChouetteController
respond_to :html, :kml, :xml, :json
+ layout "without_sidebar", :only => [:edit, :update]
+
# def complete
# @stop_areas = line.stop_areas
# render :layout => false
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 3b4775fc7..b57b9d54a 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -2,8 +2,13 @@ class UsersController < InheritedResources::Base
def create
@user = current_organisation.users.build(params[:user])
- @user.invite!
- respond_with @user, :location => organisation_user_path(@user)
+
+ if @user.valid?
+ @user.invite!
+ respond_with @user, :location => organisation_user_path(@user)
+ else
+ render :action => 'new'
+ end
end
def update
@@ -19,7 +24,7 @@ class UsersController < InheritedResources::Base
end
protected
-
+
def begin_of_association_chain
current_organisation
end
diff --git a/app/controllers/vehicle_journey_exports_controller.rb b/app/controllers/vehicle_journey_exports_controller.rb
index f29cd01aa..ed1cd61a6 100644
--- a/app/controllers/vehicle_journey_exports_controller.rb
+++ b/app/controllers/vehicle_journey_exports_controller.rb
@@ -5,32 +5,28 @@ class VehicleJourneyExportsController < ChouetteController
end
end
- respond_to :csv, :only => [:new, :index]
- respond_to :xls, :only => [:new, :index]
-
- def new
- new! do |format|
- @vehicle_journey_export = VehicleJourneyExport.new(:route => @route)
-
- format.csv { render text: @vehicle_journey_export.to_csv }
- format.xls { render text: @vehicle_journey_export.to_csv(col_sep: "\t") }
- end
- end
+ respond_to :csv, :only => [:index]
+ respond_to :xls, :only => [:index]
- def index
- index! do |format|
- @vehicle_journey_export = VehicleJourneyExport.new(:route => @route)
-
- format.csv { render text: @vehicle_journey_export.to_csv }
- format.xls { render text: @vehicle_journey_export.to_csv(col_sep: "\t") }
+ def index
+ @column_names = column_names
+ index! do |format|
+ format.csv { send_data VehicleJourneyExport.new(:route => route, :vehicle_journeys => vehicle_journeys, :column_names => column_names).to_csv }
+ format.xls
end
end
- protected
+ protected
+
+ def column_names
+ ["stop_point_id", "stop_area_name"] + vehicle_journeys.collect(&:objectid)
+ end
+
alias_method :route, :parent
-
+
def collection
- @vehicle_journey_exports = []
+ @vehicle_journeys ||= route.vehicle_journeys.includes(:vehicle_journey_at_stops).order("vehicle_journey_at_stops.departure_time")
end
+ alias_method :vehicle_journeys, :collection
end
diff --git a/app/controllers/vehicle_journey_imports_controller.rb b/app/controllers/vehicle_journey_imports_controller.rb
index e3a6dde77..d58b3c2b0 100644
--- a/app/controllers/vehicle_journey_imports_controller.rb
+++ b/app/controllers/vehicle_journey_imports_controller.rb
@@ -10,36 +10,15 @@ class VehicleJourneyImportsController < ChouetteController
def new
@vehicle_journey_import = VehicleJourneyImport.new(:route => route)
- flash[:notice] = "A CSV or Excel file can be used to import records. The first row should be the column name.
-<p>
-The following columns are allowed :
-<ul>
- <li>
- <strong>stop_point_id</strong> -
- Integer type
- </li>
- <li>
- <strong>stop_area_name</strong> -
- String type
- </li>
- <li>
- <strong>published_journey_name </strong> -
- String type
- </li>
- <li>
- <strong>published_journey_name </strong> -
- String type ....
- </li>
-</ul>
-</p>"
new!
end
def create
- @vehicle_journey_import = VehicleJourneyImport.new(params[:vehicle_journey_import].merge({:route => route}))
+ @vehicle_journey_import = VehicleJourneyImport.new( params[:vehicle_journey_import].present? ? params[:vehicle_journey_import].merge({:route => route}) : {:route => route} )
if @vehicle_journey_import.save
- redirect_to referential_line_route_path( @referential, @line, @route ), notice: "Import successful"
+ redirect_to referential_line_route_path( @referential, @line, @route ), notice: I18n.t("vehicle_journey_imports.new.success")
else
+ flash[:error] = I18n.t("stop_area_imports.errors.import_aborted") + "<br>" + @vehicle_journey_import.errors.full_messages.join("<br>")
render :new
end
end
diff --git a/app/helpers/history_helper.rb b/app/helpers/history_helper.rb
index a4f2df05c..88c6b8da3 100644
--- a/app/helpers/history_helper.rb
+++ b/app/helpers/history_helper.rb
@@ -1,7 +1,7 @@
module HistoryHelper
def creation_tag(object)
- field_set_tag t("layouts.creation_tag.title") do
+ field_set_tag t("layouts.creation_tag.title"), :class => "history_tag" do
content_tag :ul do
[(content_tag :li do
if object.has_attribute?(:creation_time)
@@ -20,7 +20,7 @@ module HistoryHelper
end
def history_tag(object)
- field_set_tag t("layouts.history_tag.title") do
+ field_set_tag t("layouts.history_tag.title"), :class => "history_tag" do
content_tag :ul do
[(content_tag :li do
if object.has_attribute?(:created_at)
diff --git a/app/helpers/pagination_helper.rb b/app/helpers/pagination_helper.rb
index 0ad70f26e..b85137b85 100644
--- a/app/helpers/pagination_helper.rb
+++ b/app/helpers/pagination_helper.rb
@@ -1,5 +1,7 @@
module PaginationHelper
def paginated_content(models, default_partial_name = nil)
+ return "" if models.blank?
+
html = ""
models.each_slice(3) do |row_models|
html += '<div class="row">'
diff --git a/app/helpers/routes_helper.rb b/app/helpers/routes_helper.rb
index ab91800ae..bbb611506 100644
--- a/app/helpers/routes_helper.rb
+++ b/app/helpers/routes_helper.rb
@@ -1,7 +1,17 @@
module RoutesHelper
+
def line_formatted_name( line)
return line.published_name if line.number.blank?
"#{line.published_name} [#{line.number}]"
end
+
+ def fonticon_wayback(wayback)
+ if wayback == "A"
+ return '<i class="fa fa-arrow-right"></i>'.html_safe
+ else
+ return '<i class="fa fa-arrow-left"></i>'.html_safe
+ end
+ end
+
end
diff --git a/app/models/stop_area_export.rb b/app/models/stop_area_export.rb
new file mode 100644
index 000000000..1b9cc36a7
--- /dev/null
+++ b/app/models/stop_area_export.rb
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+require "csv"
+
+class StopAreaExport
+ include ActiveModel::Validations
+ include ActiveModel::Conversion
+ extend ActiveModel::Naming
+
+ attr_accessor :column_names, :stop_areas
+
+ def initialize(attributes = {})
+ attributes.each { |name, value| send("#{name}=", value) }
+ end
+
+ def persisted?
+ false
+ end
+
+ def to_csv(options = {})
+ CSV.generate(options) do |csv|
+ csv << column_names
+ stop_areas.each do |stop_area|
+ csv << stop_area.attributes.values_at(*column_names)
+ end
+ end
+ end
+
+end
diff --git a/app/models/stop_area_import.rb b/app/models/stop_area_import.rb
new file mode 100644
index 000000000..52d8a94bb
--- /dev/null
+++ b/app/models/stop_area_import.rb
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+
+class StopAreaImport
+ include ActiveModel::Validations
+ include ActiveModel::Conversion
+ extend ActiveModel::Naming
+
+ attr_accessor :file
+
+ validates_presence_of :file
+
+ def initialize(attributes = {})
+ attributes.each { |name, value| send("#{name}=", value) } if attributes
+ end
+
+ def persisted?
+ false
+ end
+
+ def save
+ begin
+ Chouette::StopArea.transaction do
+ if imported_stop_areas.map(&:valid?).all?
+ imported_stop_areas.each(&:save!)
+ true
+ else
+ imported_stop_areas.each_with_index do |imported_stop_area, index|
+ imported_stop_area.errors.full_messages.each do |message|
+ errors.add :base, I18n.t("stop_area_imports.errors.invalid_stop_area", :column => index+2, :message => message)
+ end
+ end
+ false
+ end
+ end
+ rescue Exception => exception
+ Rails.logger.error(exception.message)
+ errors.add :base, I18n.t("stop_area_imports.errors.exception")
+ false
+ end
+ end
+
+ def imported_stop_areas
+ @imported_stop_areas ||= load_imported_stop_areas
+ end
+
+ def load_imported_stop_areas
+ spreadsheet = open_spreadsheet(file)
+ header = spreadsheet.row(1)
+ (2..spreadsheet.last_row).map do |i|
+ row = Hash[[header, spreadsheet.row(i)].transpose]
+ stop_area = Chouette::StopArea.find_by_id(row["id"]) || Chouette::StopArea.new
+ stop_area.attributes = row.to_hash.slice(*Chouette::StopArea.accessible_attributes)
+ stop_area
+ end
+ end
+
+ def open_spreadsheet(file)
+ case File.extname(file.original_filename)
+ when '.csv' then Roo::CSV.new(file.path)
+ when '.xls' then Roo::Excel.new(file.path)
+ when '.xlsx' then Roo::Excelx.new(file.path)
+ else
+ raise "Unknown file type: #{file.original_filename}"
+ end
+ end
+
+end
diff --git a/app/models/vehicle_journey_export.rb b/app/models/vehicle_journey_export.rb
index 8fe7869f1..653e339d9 100644
--- a/app/models/vehicle_journey_export.rb
+++ b/app/models/vehicle_journey_export.rb
@@ -6,9 +6,7 @@ class VehicleJourneyExport
include ActiveModel::Conversion
extend ActiveModel::Naming
- attr_accessor :route
-
- validates_presence_of :route
+ attr_accessor :vehicle_journeys, :column_names, :route
def initialize(attributes = {})
attributes.each { |name, value| send("#{name}=", value) }
@@ -19,11 +17,9 @@ class VehicleJourneyExport
end
def to_csv(options = {})
- CSV.generate(options) do |csv|
- vehicle_journeys_sorted = route.vehicle_journeys.includes(:vehicle_journey_at_stops).order("vehicle_journey_at_stops.departure_time")
-
- vehicle_journey_at_stops_matrix = (vehicle_journeys_sorted.collect{ |vj| vj.vehicle_journey_at_stops.collect(&:departure_time).collect{|time| time.strftime("%H:%M")} }).transpose
- csv << ["stop_point_id", "stop_area_name"] + vehicle_journeys_sorted.collect(&:objectid)
+ CSV.generate(options) do |csv|
+ vehicle_journey_at_stops_matrix = (vehicle_journeys.collect{ |vj| vj.vehicle_journey_at_stops.collect(&:departure_time).collect{|time| time.strftime("%H:%M")} }).transpose
+ csv << column_names
route.stop_points.each_with_index do |stop_point, index|
csv << [stop_point.id, stop_point.stop_area.name] + vehicle_journey_at_stops_matrix[index]
end
diff --git a/app/models/vehicle_journey_import.rb b/app/models/vehicle_journey_import.rb
index d637c9e5f..15569c3d4 100644
--- a/app/models/vehicle_journey_import.rb
+++ b/app/models/vehicle_journey_import.rb
@@ -11,7 +11,7 @@ class VehicleJourneyImport
validates_presence_of :route
def initialize(attributes = {})
- attributes.each { |name, value| send("#{name}=", value) }
+ attributes.each { |name, value| send("#{name}=", value) } if attributes
end
def persisted?
@@ -20,8 +20,8 @@ class VehicleJourneyImport
def save
begin
- Chouette::VehicleJourney.transaction do
- if imported_vehicle_journeys.map(&:valid?).all?
+ Chouette::VehicleJourney.transaction do
+ if imported_vehicle_journeys.map(&:valid?).all?
imported_vehicle_journeys.each(&:save!)
true
else
@@ -34,7 +34,8 @@ class VehicleJourneyImport
end
end
rescue Exception => exception
- errors.add :base, I18n.t("vehicle_journey_imports.errors.exception", :message => exception.message)
+ Rails.logger.error(exception.message)
+ errors.add :base, I18n.t("vehicle_journey_imports.errors.exception")
false
end
end
@@ -56,41 +57,44 @@ class VehicleJourneyImport
spreadsheet = open_spreadsheet(file)
vehicle_journeys = []
+
first_column = spreadsheet.column(1)
stop_point_ids = first_column[1..spreadsheet.last_row].map(&:to_i)
same_stop_points = route.stop_points.collect(&:id) == stop_point_ids
unless same_stop_points
errors.add :base, I18n.t("vehicle_journey_imports.errors.not_same_stop_points", :route => route.id)
- return vehicle_journeys
+ raise
end
-
- Chouette::VehicleJourney.transaction do
- (3..spreadsheet.last_column).each do |i|
- vehicle_journey_objectid = spreadsheet.column(i)[0]
- hours_by_stop_point_ids = Hash[[stop_point_ids, spreadsheet.column(i)[1..spreadsheet.last_row]].transpose]
+
+ (3..spreadsheet.last_column).each do |i|
+ vehicle_journey_at_stops = []
+ vehicle_journey_objectid = spreadsheet.column(i)[0]
+ hours_by_stop_point_ids = Hash[[stop_point_ids, spreadsheet.column(i)[1..spreadsheet.last_row]].transpose]
+
+ journey_pattern = find_journey_pattern_schedule(hours_by_stop_point_ids)
+ vehicle_journey = journey_pattern.vehicle_journeys.where(:objectid => vehicle_journey_objectid, :route_id => route.id, :journey_pattern_id => journey_pattern.id).first_or_initialize
- journey_pattern = find_journey_pattern_schedule(hours_by_stop_point_ids)
- vehicle_journey = journey_pattern.vehicle_journeys.where(:objectid => vehicle_journey_objectid, :route_id => route.id, :journey_pattern_id => journey_pattern.id).first_or_create
-
- line = 0
- hours_by_stop_point_ids.each_pair do |key, value|
- line += 1
- if value.present? # Create a vehicle journey at stop when time is present
+ line = 0
+ hours_by_stop_point_ids.each_pair do |key, value|
+ line += 1
+ if value.present? # Create a vehicle journey at stop when time is present
+ begin
main_time = Time.parse(value)
-
if main_time.present?
- vjas = Chouette::VehicleJourneyAtStop.where(:vehicle_journey_id => vehicle_journey.id, :stop_point_id => key).first_or_create(:departure_time => main_time, :arrival_time => main_time)
- else
- errors.add :base, I18n.t("vehicle_journey_imports.errors.invalid_vehicle_journey", :column => i, :line => line, :time => value)
+ vjas = { :stop_point_id => key, :vehicle_journey_id => vehicle_journey.id, :departure_time => main_time, :arrival_time => main_time }
+ vehicle_journey_at_stops << vjas
end
- end
- end
-
- vehicle_journeys << vehicle_journey
+ rescue Exception => exception
+ errors.add :base, I18n.t("vehicle_journey_imports.errors.invalid_vehicle_journey_at_stop", :column => i, :line => line, :time => value)
+ raise exception
+ end
+ end
end
+ vehicle_journey.vehicle_journey_at_stops_attributes = vehicle_journey_at_stops
+ vehicle_journeys << vehicle_journey
end
-
+
vehicle_journeys
end
diff --git a/app/views/access_links/_form.html.erb b/app/views/access_links/_form.html.erb
index 147686930..a5145adc7 100644
--- a/app/views/access_links/_form.html.erb
+++ b/app/views/access_links/_form.html.erb
@@ -28,7 +28,7 @@
<%= form.input :mobility_restricted_suitability,:as => :boolean %>
<%= form.input :stairs_availability,:as => :boolean %>
<%= form.input :lift_availability,:as => :boolean %>
- <%= form.input :objectid, :required => !@access_link.new_record?, :input_html => { :disabled => !@access_link.new_record? } %>
+ <%= form.input :objectid, :required => !@access_link.new_record? %>
<% end %>
<%= form.actions do %>
<%= form.action :submit, :as => :button %>
diff --git a/app/views/access_points/_form.html.erb b/app/views/access_points/_form.html.erb
index 8e546a878..f70b03ac3 100644
--- a/app/views/access_points/_form.html.erb
+++ b/app/views/access_points/_form.html.erb
@@ -1,44 +1,51 @@
-<%= semantic_form_for [@referential, @stop_area, @access_point] do |form| %>
- <%= form.inputs do %>
- <%= form.input :id, :as => :hidden %>
- <%= form.input :name %>
- <%= form.input :access_point_type, :as => :select, :input_html => { :disabled => !@access_point.new_record? },
- :collection => Chouette::AccessPoint.access_point_types, :include_blank => false, :member_label => Proc.new { |access_point_type| t("access_types.label.#{access_point_type}") } %>
- <%= form.input :street_name %>
- <%= form.input :country_code %>
- <%= form.input :comment %>
- <%= form.inputs do %>
- <%= form.input "openning_time(1i)", :as => :hidden ,:input_html => { :value => "2000" } %>
- <%= form.input "openning_time(2i)", :as => :hidden ,:input_html => { :value => "1" } %>
- <%= form.input "openning_time(3i)", :as => :hidden ,:input_html => { :value => "1" } %>
- <%= form.input "openning_time(6i)", :as => :hidden ,:input_html => { :value => "0" } %>
- <%= form.input :openning_time, :ignore_date=>true, :label => @access_point.human_attribute_name("openning_time")%>
- <%= form.input "closing_time(1i)", :as => :hidden ,:input_html => { :value => "2000" } %>
- <%= form.input "closing_time(2i)", :as => :hidden ,:input_html => { :value => "1" } %>
- <%= form.input "closing_time(3i)", :as => :hidden ,:input_html => { :value => "1" } %>
- <%= form.input "closing_time(6i)", :as => :hidden ,:input_html => { :value => "0" } %>
- <%= form.input :closing_time, :ignore_date=>true, :label => @access_point.human_attribute_name("closing_time")%>
- <% end %>
- <%= form.input :mobility_restricted_suitability,:as => :boolean %>
- <%= form.input :stairs_availability,:as => :boolean %>
- <%= form.input :lift_availability,:as => :boolean %>
- <%= form.input :objectid, :required => !@access_point.new_record?, :input_html => { :disabled => !@access_point.new_record? } %>
- <%= form.inputs :name => t('access_points.show.geographic_data') do %>
- <% if ! @referential.projection_type_label.empty? %>
- <%= form.inputs :name => @referential.projection_type_label do %>
- <%= form.input :projection_x %>
- <%= form.input :projection_y %>
+<div class="container-fluid">
+ <div class="col-md-7">
+
+ <%= semantic_form_for [@referential, @stop_area, @access_point] do |form| %>
+ <%= form.inputs do %>
+ <%= form.input :id, :as => :hidden %>
+ <%= form.input :name %>
+ <%= form.input :access_point_type, :as => :select, :input_html => { :disabled => !@access_point.new_record? },
+ :collection => Chouette::AccessPoint.access_point_types, :include_blank => false, :member_label => Proc.new { |access_point_type| t("access_types.label.#{access_point_type}") } %>
+ <%= form.input :street_name %>
+ <%= form.input :country_code %>
+ <%= form.input :comment %>
+ <%= form.input :openning_time, :as => :time_select %>
+ <%= form.input :closing_time, :as => :time_select %>
+ <%= form.input :mobility_restricted_suitability,:as => :boolean %>
+ <%= form.input :stairs_availability,:as => :boolean %>
+ <%= form.input :lift_availability,:as => :boolean %>
+ <%= form.input :objectid, :required => !@access_point.new_record? %>
+
+ <%= form.inputs :name => t('access_points.show.geographic_data') do %>
+ <% if ! @referential.projection_type_label.empty? %>
+ <div class="panel panel-default">
+ <div class="panel-heading">@referential.projection_type_label</div>
+ <div class="panel-body">
+ <%= form.input :projection_x %>
+ <%= form.input :projection_y %>
+ </div>
+ </div>
+ <% end %>
+ <div class="panel panel-default">
+ <div class="panel-heading">WGS84</div>
+ <div class="panel-body">
+ <%= form.input :longitude %>
+ <%= form.input :latitude %>
+ </div>
+ </div>
<% end %>
- <% end %>
- <%= form.inputs :name => "WGS84" do %>
- <%= form.input :longitude %>
- <%= form.input :latitude %>
- <% end %>
<% end %>
- <% end %>
- <%= form.actions do %>
- <%= form.action :submit, :as => :button %>
- <%= form.action :cancel, :as => :link %>
- <% end %>
-<% end %>
+ <%= form.actions do %>
+ <%= form.action :submit, :as => :button %>
+ <%= form.action :cancel, :as => :link %>
+ <% end %>
+ <% end %>
+ </div>
+ <div class="col-md-5">
+ <% if @map %>
+ <%= @map.to_html %>
+ <% end %>
+ </div>
+</div>
diff --git a/app/views/access_points/edit.html.erb b/app/views/access_points/edit.html.erb
index e2e8636b3..cc5dc217f 100644
--- a/app/views/access_points/edit.html.erb
+++ b/app/views/access_points/edit.html.erb
@@ -1,5 +1,3 @@
<%= title_tag t('access_points.edit.title', :access_point => @access_point.name ) %>
-<%= @map.to_html %>
-
<%= render "form" %>
diff --git a/app/views/companies/_form.erb b/app/views/companies/_form.erb
index 9b605a6a2..c4fb90ee1 100644
--- a/app/views/companies/_form.erb
+++ b/app/views/companies/_form.erb
@@ -9,7 +9,7 @@
<%= form.input :fax, :as => :phone %>
<%= form.input :email, :as => :email %>
<%= form.input :registration_number %>
- <%= form.input :objectid, :required => !@company.new_record?, :input_html => { :disabled => !@company.new_record? } %>
+ <%= form.input :objectid, :required => !@company.new_record? %>
<% end %>
<%= form.actions do %>
diff --git a/app/views/compliance_check_tasks/_compliance_check_task.erb b/app/views/compliance_check_tasks/_compliance_check_task.erb
index 3c5388b00..b3b62e1f5 100644
--- a/app/views/compliance_check_tasks/_compliance_check_task.erb
+++ b/app/views/compliance_check_tasks/_compliance_check_task.erb
@@ -1,4 +1,4 @@
-<%= div_for(compliance_check_task, :class => :compliance_check_task) do %>
+<%= div_for(compliance_check_task, :class => "compliance_check_task clearfix") do %>
<div class="icon">
<%= link_to image_tag("compliance_check_task-#{compliance_check_task.status}.png"), referential_compliance_check_task_path(@referential, compliance_check_task) %>
</div>
diff --git a/app/views/connection_links/_form.erb b/app/views/connection_links/_form.erb
index 72d3b2046..52f49d852 100644
--- a/app/views/connection_links/_form.erb
+++ b/app/views/connection_links/_form.erb
@@ -9,13 +9,13 @@
<%= form.input :stairs_availability,:as => :boolean %>
<%= form.input :lift_availability,:as => :boolean %>
- <%= form.input :objectid, :required => !@connection_link.new_record?, :input_html => { :disabled => !@connection_link.new_record? } %>
+ <%= form.input :objectid, :required => !@connection_link.new_record? %>
<% end %>
<%= form.inputs :name => t('connection_links.show.durations') do %>
- <%= form.input :default_duration, :as => :time_picker, :ignore_date=>true,:include_seconds=>true, :label => @connection_link.human_attribute_name("default_duration"), :input_html => { :placeholder => "HH:MM" } %>
- <%= form.input :frequent_traveller_duration, :as => :time_picker, :ignore_date=>true,:include_seconds=>true, :label => @connection_link.human_attribute_name("frequent_traveller_duration"), :input_html => { :placeholder => "HH:MM" } %>
- <%= form.input :occasional_traveller_duration, :as => :time_picker, :ignore_date=>true,:include_seconds=>true, :label => @connection_link.human_attribute_name("occasional_traveller_duration"), :input_html => { :placeholder => "HH:MM" } %>
- <%= form.input :mobility_restricted_traveller_duration, :as => :time_picker, :ignore_date=>true,:include_seconds=>true, :label => @connection_link.human_attribute_name("mobility_restricted_traveller_duration"), :input_html => { :placeholder => "HH:MM" } %>
+ <%= form.input :default_duration, :as => :time_select, :size => 8, :include_seconds=>true, :label => @connection_link.human_attribute_name("default_duration"), :input_html => { :placeholder => "HH:MM" } %>
+ <%= form.input :frequent_traveller_duration, :as => :time_select, :size => 8, :include_seconds=>true, :label => @connection_link.human_attribute_name("frequent_traveller_duration"), :input_html => { :placeholder => "HH:MM:SS" } %>
+ <%= form.input :occasional_traveller_duration, :as => :time_select, :size => 8, :include_seconds=>true, :label => @connection_link.human_attribute_name("occasional_traveller_duration"), :input_html => { :placeholder => "HH:MM:SS" } %>
+ <%= form.input :mobility_restricted_traveller_duration, :as => :time_select, :include_seconds=>true, :label => @connection_link.human_attribute_name("mobility_restricted_traveller_duration"), :input_html => { :placeholder => "HH:MM:SS" } %>
<% end %>
<%= form.actions do %>
diff --git a/app/views/devise/mailer/invitation_instructions.html.erb b/app/views/devise/mailer/invitation_instructions.html.erb
deleted file mode 100644
index a3fa4e314..000000000
--- a/app/views/devise/mailer/invitation_instructions.html.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-<p>Hello <%= @resource.email %>!</p>
-
-<p>Someone has invited you to <%= root_url %>, you can accept it through the link below.</p>
-
-<p><%= link_to 'Accept invitation', accept_invitation_url(@resource, :invitation_token => @resource.invitation_token) %></p>
-
-<p>If you don't want to accept the invitation, please ignore this email.<br />
-Your account won't be created until you access the link above and set your password.</p>
diff --git a/app/views/exports/_export.erb b/app/views/exports/_export.erb
index e8e5d4656..3d312c266 100644
--- a/app/views/exports/_export.erb
+++ b/app/views/exports/_export.erb
@@ -1,16 +1,21 @@
-<%= div_for(export, :class => :export) do %>
- <%= link_to(referential_export_path(@referential, export), :class => "preview") do %>
- <%= image_tag "export-#{export.status}.png" %>
- <% end %>
- <%= link_to(export.name, referential_export_path(@referential, export)) %>
- <div class="info">
- <%= l export.created_at %>
-
- <div class="actions">
+<%= div_for(export, :class => "export clearfix") do %>
+ <div class="icon">
+ <%= link_to image_tag("export-#{export.status}.png"), referential_export_path(@referential, export) %>
+ </div>
+ <div class="resume">
+ <ul class="header clearfix">
+ <li class="title">
+ <%= link_to(export.name, referential_export_path(@referential, export)) %>
+ </li>
+ <li class="remove"><%= link_to "<i class='fa fa-trash-o'></i>".html_safe, referential_export_path(@referential, export), :method => :delete, :data => {:confirm => t('exports.actions.destroy_confirm')}, :class => "remove" %></li>
+ </ul>
+ <div class="links">
<% if export.status == 'completed' %>
- <%= link_to t("exports.actions.download"), referential_export_path(@referential, export, :format => :zip), :class => "download" %>
+ <%= link_to t("exports.actions.download"), referential_export_path(@referential, export, :format => :zip), :class => "download" %>
<% end %>
- <%= link_to t("actions.destroy"), referential_export_path(@referential, export), :method => :delete, :data => {:confirm => t('exports.actions.destroy_confirm')}, :class => "remove" %>
+ </div>
+ <div class="history">
+ <%= l export.created_at, :format => "%d/%m/%Y %H:%M" %>
</div>
</div>
<% end %>
diff --git a/app/views/group_of_lines/_form.erb b/app/views/group_of_lines/_form.erb
index 329d3c619..b92fa1ea1 100644
--- a/app/views/group_of_lines/_form.erb
+++ b/app/views/group_of_lines/_form.erb
@@ -2,7 +2,7 @@
<%= form.inputs do %>
<%= form.input :name %>
<%= form.input :comment %>
- <%= form.input :objectid, :required => !@group_of_line.new_record?, :input_html => { :disabled => !@group_of_line.new_record? } %>
+ <%= form.input :objectid, :required => !@group_of_line.new_record? %>
<% end %>
<%= form.inputs do %>
diff --git a/app/views/help/access_links.textile b/app/views/help/access_links.textile
index 960f3484b..1ae69e050 100644
--- a/app/views/help/access_links.textile
+++ b/app/views/help/access_links.textile
@@ -38,9 +38,11 @@ p(attr_data). Données de gestion :
- Identifiant Neptune :=
clé unique pérenne identifiant la correspondance pour les échanges Neptune
cet identifiant est composé de 3 parties : préfixe:type:id_technique
+
* préfixe : clé identifiant un producteur de données unique
* type = AccessLink : clé identifiant le type d'objet (valeur imposée)
* id_technique : valeur identifiant un seul objet d'un type donné pour un même producteur
+
ce champ obligatoire est automatiquement généré s'il n'est pas renseigné
il est possible aussi de ne renseigner que l'identifiant technique, auquel cas la valeur sera complétée automatiquement.
=:
@@ -54,10 +56,11 @@ h4. Création/consultation
Lors de la consultation d'une zone d'arrêts possédant au moins un accès,
l'action <<Gérer les liens arrêt-accès>> affiche deux matrices :
+
* _Liens génériques_ : les différentes combinaisons de liens entre les accès et la zone;
* _Liens détaillés_ : les différentes combinaisons de liens entre les accès et les arrêts inclus dans la zone.
-Chaque lien est représenté par une flêche orientée représentant l'existance ou non de ce lien:
+Chaque lien est représenté par une flèche orientée représentant l'existence ou non de ce lien:
* !gray_left_arrow.png! ou !gray_right_arrow.png! lien non défini; la flèche est un lien vers l'écran de création de ce lien
* !green_left_arrow.png! ou !green_right_arrow.png! lien existant; la flèche est un lien vers l'écran de consultation/modification/suppression de ce lien
diff --git a/app/views/help/access_points.textile b/app/views/help/access_points.textile
index b32e0ae8e..f8d38f085 100644
--- a/app/views/help/access_points.textile
+++ b/app/views/help/access_points.textile
@@ -47,9 +47,11 @@ p(attr_data). Données de gestion :
- Identifiant Neptune :=
clé unique pérenne identifiant la ligne pour les échanges Neptune
cet identifiant est composé de 3 parties : préfixe:type:id_technique
+
* préfixe : clé identifiant un producteur de données unique
* type = AccessPoint : clé identifiant le type d'objet (valeur imposée)
* id_technique : valeur identifiant un seul objet d'un type donné pour un même producteur
+
ce champ obligatoire est automatiquement généré s'il n'est pas renseigné
il est possible aussi de ne renseigner que l'identifiant technique, auquel cas la valeur sera complétée automatiquement.
=:
diff --git a/app/views/help/companies.textile b/app/views/help/companies.textile
index 704c3554a..e991ae67c 100644
--- a/app/views/help/companies.textile
+++ b/app/views/help/companies.textile
@@ -28,9 +28,11 @@ p(attr_data). Données de gestion :
- Identifiant Neptune :=
clé unique pérenne identifiant le transporteur pour les échanges Neptune
cet identifiant est composé de 3 parties : préfixe:type:id_technique
+
* préfixe : clé identifiant un producteur de données unique
* type = Company : clé identifiant le type d'objet (valeur imposée)
* id_technique : valeur identifiant un seul objet d'un type donné pour un même producteur
+
ce champ obligatoire est automatiquement généré s'il n'est pas renseigné
il est possible aussi de ne renseigner que l'identifiant technique, auquel cas la valeur sera complétée automatiquement.
=:
diff --git a/app/views/help/connection_links.textile b/app/views/help/connection_links.textile
index 129b9c6d5..a4865465f 100644
--- a/app/views/help/connection_links.textile
+++ b/app/views/help/connection_links.textile
@@ -30,9 +30,11 @@ p(attr_data). Données de gestion :
- Identifiant Neptune :=
clé unique pérenne identifiant la correspondance pour les échanges Neptune
cet identifiant est composé de 3 parties : préfixe:type:id_technique
+
* préfixe : clé identifiant un producteur de données unique
* type = ConnectionLink : clé identifiant le type d'objet (valeur imposée)
* id_technique : valeur identifiant un seul objet d'un type donné pour un même producteur
+
ce champ obligatoire est automatiquement généré s'il n'est pas renseigné
il est possible aussi de ne renseigner que l'identifiant technique, auquel cas la valeur sera complétée automatiquement.
=:
diff --git a/app/views/help/csv.textile b/app/views/help/csv.textile
index 9852b96b6..e1c0f6708 100644
--- a/app/views/help/csv.textile
+++ b/app/views/help/csv.textile
@@ -7,9 +7,8 @@ Le format CSV utilise un caractère comme séparateur de champs, c'est le caract
Ce séparateur est configurable sur l'application WEB. Il est donc possible de le changer et le nouveau séparateur est pris en compte après redémarrage.
Le format CSV est décrit par l'exemple ci-dessous (attention, le format est 'strict' ! et l'encodage attendu est en UTF-8)
-<notextile>
<pre width="100%">
-
+<code>
;;;;;;;"Nom du réseau";"RER";;;;;
;;;;;;;"Code Réseau";500;;;;;
;;;;;;;"Description du réseau";"Réseau Express Régional ,exploités par la RATP et la SNCF";;;;;
@@ -95,5 +94,5 @@ Le format CSV est décrit par l'exemple ci-dessous (attention, le format est 'st
;;;;;;;"Cergy-le Haut";09:54:00;09:54:00;;;;
;;;;;;;"Achères-Grand Cormier";;;10:35:00;10:35:00;06:31:00;06:31:00
;;;;;;;"Poissy";;;10:36:00;10:36:00;06:30:00;06:30:00
+</code>
</pre>
- </notextile> \ No newline at end of file
diff --git a/app/views/help/dataspaces.textile b/app/views/help/dataspaces.textile
index 21f846b04..d138f26d7 100644
--- a/app/views/help/dataspaces.textile
+++ b/app/views/help/dataspaces.textile
@@ -20,12 +20,13 @@ h3. Implémentation
p. L'espace de données est concrétisé dans la base de données par un schéma au sens SQL portant le nom défini par l'attribut code.
-p. Les attributs de l'espace de données sont enregistrés dans la table REFERENTIALS du schema 'public'
+p. Les attributs de l'espace de données sont enregistrés dans la table REFERENTIALS du schéma 'public'
p. Le préfixe Neptune est utilisé dans la génération des identifiants de l'ensemble des objets du modèle; sa modification n'a d'effet que sur les objets créés après.
-p. La projection géographique permet un affichae et l'export des coordonnées selon un système géographique secondaires; les coordonnées de ce système ne sont pas conservés dans la base.
+p. La projection géographique permet un affichage et l'export des coordonnées selon un système géographique secondaires; les coordonnées de ce système ne sont pas conservés dans la base.
-p. Les limitations de PosgreSQL imposent qu'un nom de schéma soit en minuscule et commence par une lettre; les préfixes 'pg_' ainsi que 'public' sont réservés.
+p. Les limitations de PosgreSQL imposent qu'un nom de schéma soit en minuscule et commence par une lettre; les préfixes *pg&#95;* ainsi que *public* sont réservés.
p. Les noms et codes des espaces de données sont uniques quelque soit l'organisation; une erreur de doublon peut donc arriver si une autre organisation a déjà utilisé le même terme.
+
diff --git a/app/views/help/documentation.textile b/app/views/help/documentation.textile
index 722b6c277..5896ed7a0 100644
--- a/app/views/help/documentation.textile
+++ b/app/views/help/documentation.textile
@@ -3,6 +3,6 @@ layout: default
title: Documentation
---
-La documentation de Chouette (y compris le présent manuel utilisateur) est disponible sur le site "Chouette.mobi":http://www.chouette.mobi/spip.php?rubrique15
+La documentation de Chouette (y compris le présent manuel utilisateur) est disponible sur le site "Chouette.mobi":http://www.chouette.mobi/docs
Le présent manuel Utilisateur est par ailleurs livré sous forme d'aide en ligne avec l'application web. \ No newline at end of file
diff --git a/app/views/help/exports.textile b/app/views/help/exports.textile
index 2e569a9ae..c82f8cea2 100644
--- a/app/views/help/exports.textile
+++ b/app/views/help/exports.textile
@@ -10,9 +10,9 @@ p. L'export permet d'extraire de la base un ensemble de données selon un format
h3. Formats disponibles
- Neptune := format normalisé des échanges de données de transport en commun pour la France (cf "Normalisation":normalisation)
-- NeTEx := format d'échanges de données de transport en commun expérimental sur la norme européenne ["NeTEx":http://normes-donnees-tc.org/spip.php?article66] mais limité aux données définies dans la norme Neptune
+- NeTEx := format d'échanges de données de transport en commun expérimental sur la norme européenne ["NeTEx":http://www.normes-donnees-tc.org/format-dechange/donnees-theoriques/] mais limité aux données définies dans la norme Neptune
- CSV := format tabulaire spécifique à Chouette (cf "CSV":csv)
-- GTFS := format destiné à ["Google Transit":https://developers.google.com/transit/gtfs/?hl=fr] ; les données exportées en GTFS sont explicités ["ICI":http://normes-donnees-tc.org/spip.php?article64]
+- GTFS := format destiné à ["Google Transit":https://developers.google.com/transit/gtfs/?hl=fr] ; les données exportées en GTFS sont explicités ["ICI":http://www.normes-donnees-tc.org/format-dechange/autres-normes/]
- KML := format contenant l'ensemble des données cartographiées pouvant ainsi être importée dans un SIG
- HUB := format tabulaire interne CityWay
@@ -58,9 +58,9 @@ h3. Consultation des résultats
p. L'export est lancé en différé; son état d'avancement est affiché sous la forme d'une icône donc la couleur dépend de l'état:
-- bleu : en cours
-- vert : terminé correctement; un lien de téléchargement est alors disponible
-- rouge : terminé en échec
+* bleu : en cours
+* vert : terminé correctement; un lien de téléchargement est alors disponible
+* rouge : terminé en échec
p. La consultation du résultat de l'export donnera la liste des éléments exportés ou les motifs de l'échec.
diff --git a/app/views/help/faq.textile b/app/views/help/faq.textile
index 74bf2c8ff..e438d4bd2 100644
--- a/app/views/help/faq.textile
+++ b/app/views/help/faq.textile
@@ -5,4 +5,4 @@ title: Foire aux questions
N'hésitez pas à nous solliciter pour toute question, nous compléterons la FAQ progressivement !
-"FAQ de chouette.mobi":http://www.chouette.mobi/spip.php?rubrique38 \ No newline at end of file
+"Forum de chouette.mobi":http://forum.chouette.mobi \ No newline at end of file
diff --git a/app/views/help/group_of_lines.textile b/app/views/help/group_of_lines.textile
index efef28bb8..05121ff46 100644
--- a/app/views/help/group_of_lines.textile
+++ b/app/views/help/group_of_lines.textile
@@ -21,9 +21,11 @@ p(attr_data). Données de gestion :
- Identifiant Neptune :=
clé unique pérenne identifiant le groupe de lignes pour les échanges Neptune
cet identifiant est composé de 3 parties : préfixe:type:id_technique
+
* préfixe : clé identifiant un producteur de données unique
* type = GroupOfLine : clé identifiant le type d'objet (valeur imposée)
* id_technique : valeur identifiant un seul objet d'un type donné pour un même producteur
+
ce champ obligatoire est automatiquement généré s'il n'est pas renseigné
il est possible aussi de ne renseigner que l'identifiant technique auquel cas la valeur sera complétée automatiquement.
=:
diff --git a/app/views/help/imports.textile b/app/views/help/imports.textile
index f8610134f..88b780b7f 100644
--- a/app/views/help/imports.textile
+++ b/app/views/help/imports.textile
@@ -34,20 +34,20 @@ p(note). Les tests de niveau 1 et 2 ne sont actuellement implémentés que pour
h3(#fmt). Formats disponibles
- Neptune := format normalisé des échanges de données de transport en commun pour la France (cf "Normalisation":normalisation)
-- NeTEx := format d'échange de données de transport en commun expérimental sur la norme européenne ["NeTEx":http://normes-donnees-tc.org/spip.php?article66] mais limité au sous-ensemble des données définies dans la norme Neptune
+- NeTEx := format d'échange de données de transport en commun expérimental sur la norme européenne ["NeTEx":http://www.normes-donnees-tc.org/format-dechange/donnees-theoriques/] mais limité au sous-ensemble des données définies dans la norme Neptune
- CSV := format tabulaire spécifique à Chouette (cf "CSV":csv)
- GTFS :=
format originaire de ["Google Transit":https://support.google.com/transitpartners/], à condition que le fichier soit préalablement validé avec l'outil Feed Validator =:
-p(olnext). - les données exportées en GTFS sont explicités ["ICI":http://normes-donnees-tc.org/spip.php?article64]
+p(olnext). - les données exportées en GTFS sont explicités ["ICI":http://www.normes-donnees-tc.org/format-dechange/autres-normes/]
h3(#com). Paramètres communs
-- Pas de sauvegarde := permet d'effecter une simulation de l'import sans enregistrer les données
+- Pas de sauvegarde := permet d'effectuer une simulation de l'import sans enregistrer les données
p(ddnext). - active donc les tests de validation de niveau 1 et 2
-- Jeu de paramètres pour validation := paramètres définisant les seuils des tests de niveau 3 (indisponible si l'option 'pas de sauvegarde' est cochée)
+- Jeu de paramètres pour validation := paramètres définissant les seuils des tests de niveau 3 (indisponible si l'option 'pas de sauvegarde' est cochée)
p(ddnext). - les jeux de paramètres sont créés via le lien ["Jeux de paramètres":parametersets] disponible sur les vues des listes d'imports et de validations
@@ -105,7 +105,7 @@ h3(#new). Nouvel Import
p. Il est possible de modifier le jeu de paramètres par défaut ou de créer un nouveau Jeu de paramètres. Il est possible de ne choisir aucun jeu de paramètres.
-p. L’import est lancé en différé, son résultat n'est pas immédiat. Le résultat est conservé tant que l’import n’est pas supprimé. L'import lance également la validation (avec ou sans jeu de paramètres associés), ce qui crée un objet Validation associé. La suppression d’un import également l'objet Validation associé à cet import ; néanmoins si les données ont été sauvergardées en base, elles seront conservées.
+p. L’import est lancé en différé, son résultat n'est pas immédiat. Le résultat est conservé tant que l’import n’est pas supprimé. L'import lance également la validation (avec ou sans jeu de paramètres associés), ce qui crée un objet Validation associé. La suppression d’un import également l'objet Validation associé à cet import ; néanmoins si les données ont été sauvegardées en base, elles seront conservées.
p. Si les données ne sont pas sauvées en base, il faut relancer un import avec sauvegarde si on souhaite effectivement importer ces données en base après une première validation « à blanc ».
@@ -130,11 +130,11 @@ p. _1 - La synthèse des fichiers analysés affiche 3 secteurs_
p(border_image). !import_file_result.png!
-* en vert les fichiers correctements traités
+* en vert les fichiers correctement traités
* en rouge les fichiers comportant des erreurs qui empêche leur traitement
* en gris les fichiers ignorés
-p. En passant la souris sur chaque partie, le nombre de fchiers correspondant est affiché.
+p. En passant la souris sur chaque partie, le nombre de fichiers correspondant est affiché.
p. La sélection (clic souris) d'un des secteurs affiche la liste des fichiers concernés :
diff --git a/app/views/help/index.textile b/app/views/help/index.textile
index 83a3bc8c9..8907abe4d 100644
--- a/app/views/help/index.textile
+++ b/app/views/help/index.textile
@@ -3,7 +3,7 @@ layout: default
title: Chouette v2
---
-Version 2.4.0
+Version 2.4.1
h3. Logiciel libre propriété de :
@@ -24,7 +24,16 @@ A cet égard l'attention de l'utilisateur est attirée sur les risques associé
h3. Notes de version
-h4. V2.4.0
+h4. Version 2.4.1
+
+* Corrections des anomalies suivantes :
+** L'export GTFS exige que l'indice de ligne soit renseigné (Mantis 26726)
+** L'import GTFS ne tient pas compte des courses commençant après minuit (Mantis 25824)
+** Mise en place d'un script produisant l'aide en ligne sous forme de docx (Mantis 26604)
+** L'import GTFS plante sur une course qui dessert plus de 2 fois le même arrêt (Mantis 26755)
+** L'export NeTEx produit un fichier invalide si le champ VersionDate du réseau est vide (Mantis 26434)
+
+h4. Version 2.4.0
* Corrections des anomalies suivantes :
** L'Import GTFS n'importe pas les fichiers avec marqueurs BOM (Mantis 21260)
@@ -41,25 +50,27 @@ h4. V2.4.0
** Protection des listes avec filtre si la page courante est au delà du nombre de pages (Mantis 20954)
** L'export n'accepte plus une liste de réseaux (Mantis 26438)
** L'insertion d'un arrêt dans une séquence perturbe les courses existantes (Mantis 23800)
+** Import Neptune : erreur de sauvegarde si le mode de transport est manquant (Mantis 26702)
+** Edition Calendrier : problème de saisie des dates sous Chrome (Mantis 26746)
-h4. V2.3.0
+h4. Version 2.3.0
* Migration technique des frameworks JAVA
** Spring 4
** Hibernate 4
-h4. V2.2.0
+h4. Version 2.2.0
* Refonte de la validation
** La validation se fait soit lors d'un import, soit sur les données déjà en base.
** Les tests ont été redéfinis.
-h4. V2.1.1
+h4. Version 2.1.1
* Clonage de courses
** les calendiers de la course initiale sont reportés dans les copies
-h4. V2.1.0
+h4. Version 2.1.0
* suppression des coordonnées projetées en base
** les données sont produites à la volée pour l'export et l'affichage à partir de la projection fixée dans le référentiel
@@ -75,19 +86,19 @@ h4. V2.1.0
** ajout des fonds niveau cadastre et orthophoto
** affichage de l'orthophoto IGN par défaut lorsque la clé IGN est présente
-h4. V2.0.3
+h4. Version 2.0.3
* Ajout des imports/export NeTex
* Fonctionnement sous windows
* Prise en compte de grandes quantités de calendriers.
* Reprise des logs d'import Neptune
-h4. V2.0.2
+h4. Version 2.0.2
* Ajout de l'import GTFS (expérimental, ne traite pas les stations)
* Ajout d'API Rest pour accéder aux données depuis une autre application
-h4. V2.0.1
+h4. Version 2.0.1
* Ajout de la gestion des groupes de lignes
* Ajout de la gestion des accès et des relations arrêts-accès
@@ -95,7 +106,7 @@ h4. V2.0.1
* Améliorations ergonomiques et cartographiques
* L'import Neptune accepte les principaux formats d'encodage : ISO-8859-1, UTF-8, ...
-h4. V2.0.0
+h4. Version 2.0.0
* refonte de l'interface graphique
* ajout d'une gestion simplifiée d'utilisateurs :
diff --git a/app/views/help/journeypatterns.textile b/app/views/help/journey_patterns.textile
index f9278ad75..b6a67e0e1 100644
--- a/app/views/help/journeypatterns.textile
+++ b/app/views/help/journey_patterns.textile
@@ -19,9 +19,11 @@ p(attr_data). Données de gestion :
- Identifiant Neptune :=
clé unique pérenne identifiant la mission pour les échanges Neptune
cet identifiant est composé de 3 parties : préfixe:type:id_technique
+
* préfixe : clé identifiant un producteur de données unique
* type = JourneyPattern : clé identifiant le type d'objet (valeur imposée)
* id_technique : valeur identifiant un seul objet d'un type donné pour un même producteur
+
ce champ obligatoire est automatiquement généré s'il n'est pas renseigné
il est possible aussi de ne renseigner que l'identifiant technique, auquel cas la valeur sera complétée automatiquement.
=:
diff --git a/app/views/help/kml_exports.textile b/app/views/help/kml_exports.textile
index 75180acbc..ddd1961d2 100644
--- a/app/views/help/kml_exports.textile
+++ b/app/views/help/kml_exports.textile
@@ -14,6 +14,7 @@ h3. Sélection des données à exporter
L'écran d'export propose un formulaire de sélection de données d'un référentiel.
Voici les choix possibles :
+
* Tout
* des réseaux
* des transporteurs
@@ -22,13 +23,13 @@ Voici les choix possibles :
Selon le type de données, les lignes sont sélectionnées en suivant les règles ci-dessous :
* Si le type de données à exporter est « Tout »
- - toutes les lignes du référentiel sont sélectionnées.
+** toutes les lignes du référentiel sont sélectionnées.
* Si le type de données à exporter est le réseau,
- - les lignes sélectionnées sont celles appartenant à l'un des réseaux.
+** les lignes sélectionnées sont celles appartenant à l'un des réseaux.
* Si le type de données à exporter est le transporteur,
- - les lignes sélectionnées sont celles appartenant à l'un des transporteurs.
+** les lignes sélectionnées sont celles appartenant à l'un des transporteurs.
* Si le type de données à exporter est la ligne,
- - les lignes sont explicitement sélectionnées
+** les lignes sont explicitement sélectionnées
h3. Format et nom du fichier exporté
@@ -39,31 +40,32 @@ h3. Contenu de l'archive d'export
h4. Pour un export de lignes, réseaux, transporteurs
L'archive ZIP contient les fichiers KML suivants :
+
* un fichier de tracé de ligne pour chacune des lignes sélectionnées des réseaux sélectionnés ou des transporteurs sélectionnés
- - le type de géométrie est MultiLineString
- - les attributs de ligne figurent dans l'élément KML ExtendedData
- - l'attribut « name » du Document KML porte le nom « Ligne : nom de la ligne »
- - le nom de ce fichier KML est de la forme : line_identifiant de ligne.kml, l'identifiant de ligne étant un entier
+** le type de géométrie est MultiLineString
+** les attributs de ligne figurent dans l'élément KML ExtendedData
+** l'attribut « name » du Document KML porte le nom « Ligne : nom de la ligne »
+** le nom de ce fichier KML est de la forme : line_identifiant de ligne.kml, l'identifiant de ligne étant un entier
* un fichier de tracé de chacune des séquences d'arrêts des lignes
- - le type de géométrie est LineString
- - les attributs de la séquence d'arrêts figurent dans l'élément KML ExtendedData
- - l'attribut « name » du Document KML porte le nom « Séquence d'arrêts : nom de la séquence d'arrêts »
- - le nom de ce fichier KML est de la forme : line_identifiant de ligne_route_identifiant de séquence d'arrêts.kml, l'identifiant de ligne et de séquence étant des entiers
+** le type de géométrie est LineString
+** les attributs de la séquence d'arrêts figurent dans l'élément KML ExtendedData
+** l'attribut « name » du Document KML porte le nom « Séquence d'arrêts : nom de la séquence d'arrêts »
+** le nom de ce fichier KML est de la forme : line_identifiant de ligne_route_identifiant de séquence d'arrêts.kml, l'identifiant de ligne et de séquence étant des entiers
* un fichier KML pour chaque mission de chaque séquence d'arrêts
- - le type de géométrie est Point
- - les attributs de la séquence d'arrêts figurent dans l'élément KML ExtendedData
- - l'attribut « name » du Document KML porte le nom «Mission : nom de la mission »
- - le nom de ce fichier KML est de la forme : line_identifiant de ligne_route_identifiant de séquence d'arrêts_journey_pattern_id_mission.kml, les identifiants étant des entiers
+** le type de géométrie est Point
+** les attributs de la séquence d'arrêts figurent dans l'élément KML ExtendedData
+** l'attribut « name » du Document KML porte le nom «Mission : nom de la mission »
+** le nom de ce fichier KML est de la forme : line_identifiant de ligne_route_identifiant de séquence d'arrêts_journey_pattern_id_mission.kml, les identifiants étant des entiers
* un fichier des arrêts commerciaux appartenant à au moins une des lignes sélectionnées
- - le type de géométrie est Point
- - les attributs d'arrêt commercial figurent dans l'élément KML ExtendedData
- - l'attribut « name » du Document KML porte le nom « arrêts commerciaux»
- - le nom de ce fichier KML est : commercial_stop_areas.kml
+** le type de géométrie est Point
+** les attributs d'arrêt commercial figurent dans l'élément KML ExtendedData
+** l'attribut « name » du Document KML porte le nom « arrêts commerciaux»
+** le nom de ce fichier KML est : commercial_stop_areas.kml
* un fichier des arrêts physiques appartenant à au moins une des lignes sélectionnées
- - le type de géométrie est Point
- - les attributs d'arrêt physique figurent dans l'élément KML ExtendedData
- - l'attribut « name » du Document KML porte le nom « arrêts physiques»
- - le nom de ce fichier KML est : stop_areas.kml
+** le type de géométrie est Point
+** les attributs d'arrêt physique figurent dans l'élément KML ExtendedData
+** l'attribut « name » du Document KML porte le nom « arrêts physiques»
+** le nom de ce fichier KML est : stop_areas.kml
h5. Remarque sur le nom des fichiers
@@ -77,6 +79,7 @@ h5. Géométrie associée au KML de tracé de ligne :
Ce fichier KML rassemble en une seule géométrie la totalité des tronçons reliant les arrêts commerciaux entre eux.
Ce tracé ne porte pas d'information sur les sens de parcours. Un tronçon qui relie des arrêts commerciaux A et B peut correspondre :
+
* à un seul itinéraire dans le sens A vers B
* à un seul itinéraire dans le sens B vers A
* à 2 itinéraires dans les sens A vers B et B vers A
@@ -88,9 +91,9 @@ Ce tracé relie les arrêts physiques en suivant l'ordre de parcours de la séqu
h5. Limitations de volumétrie
-1. La fonction d'export KML autorise un export de plusieurs lignes dans la limite de 150 au maximum. Au-delà, les fichiers KML des lignes ne sont pas produits, ni les fichiers des arrêts physiques, des commerciaux, des séquences d'arrêt et des missions. Seuls seront présents les fichiers des pôles d'échange, des ITL, des correspondances, des accès et des liens accès-arrêt si l'utilisateur a choisi de tout exporter (comme indiqué au paragraphe 4.2). Le rapport d'export mentionne dans ce cas une alerte pour prévenir que le quota de lignes autorisées est dépassé.
-2. Si il y a plus de 150 séquences d'arrêt, elles ne sont pas exportées, un message d'alerte est affiché dans le résultat de l'export. Dans ce cas les fichiers des missions ne sont pas produits non plus.
-3. De même, s'il y a plus de 150 missions elles ne sont pas exportées, un message d'alerte est affiché dans le résultat de l'export.
+# La fonction d'export KML autorise un export de plusieurs lignes dans la limite de 150 au maximum. Au-delà, les fichiers KML des lignes ne sont pas produits, ni les fichiers des arrêts physiques, des commerciaux, des séquences d'arrêt et des missions. Seuls seront présents les fichiers des pôles d'échange, des ITL, des correspondances, des accès et des liens accès-arrêt si l'utilisateur a choisi de tout exporter (comme indiqué au paragraphe 4.2). Le rapport d'export mentionne dans ce cas une alerte pour prévenir que le quota de lignes autorisées est dépassé.
+# Si il y a plus de 150 séquences d'arrêt, elles ne sont pas exportées, un message d'alerte est affiché dans le résultat de l'export. Dans ce cas les fichiers des missions ne sont pas produits non plus.
+# De même, s'il y a plus de 150 missions elles ne sont pas exportées, un message d'alerte est affiché dans le résultat de l'export.
Par conséquent, dans le cas des référentiels qui comptent plus de 150 lignes, il est nécessaire de procéder en plusieurs opérations d'export.
Cependant, il faut garder à l'esprit que les outils SIG ont aussi leurs propres limites quant au nombre de couches qui peuvent être gérées en même temps.
@@ -100,28 +103,29 @@ h4. Pour un export de « Tout »
L'archive ZIP contient tous les fichiers KML produits par un export de tous les réseaux (ou tous les transporteurs).
L'archive ZIP contient également d'autres fichiers KML listés ci-dessous :
+
* un fichier des pôles d'échange
- - le type de géométrie est Point
- - les attributs de pole d'échange figurent dans l'élément KML ExtendedData
- - l'attribut « name » du Document KML porte le nom « poles d'échange »
- - le nom de ce fichier KML est : stop_places.kml
+** le type de géométrie est Point
+** les attributs de pôle d'échange figurent dans l'élément KML ExtendedData
+** l'attribut « name » du Document KML porte le nom « pôles d'échange »
+** le nom de ce fichier KML est : stop_places.kml
* un fichier des correspondances
- - le type de géométrie est LineString
- - les attributs de correspondance figurent dans l'élément KML ExtendedData
- - l'attribut « name » du Document KML porte le nom « correspondances »
- - le nom de ce fichier KML est : connection_links.kml
+** le type de géométrie est LineString
+** les attributs de correspondance figurent dans l'élément KML ExtendedData
+** l'attribut « name » du Document KML porte le nom « correspondances »
+** le nom de ce fichier KML est : connection_links.kml
* un fichier des accès
- - le type de géométrie est Point
- - les attributs d'accès figurent dans l'élément KML ExtendedData
- - l'attribut « name » du Document KML porte le nom « accès »
- - le nom de ce fichier KML est : access.kml
+** le type de géométrie est Point
+** les attributs d'accès figurent dans l'élément KML ExtendedData
+** l'attribut « name » du Document KML porte le nom « accès »
+** le nom de ce fichier KML est : access.kml
* un fichier des liens accès-arrêt
- - le type de géométrie est LineString
- - les attributs de lien accès-arrêt figurent dans l'élément KML ExtendedData
- - l'attribut « name » du Document KML porte le nom «liens d'accès »
- - le nom de ce fichier KML est : access_links.kml
+** le type de géométrie est LineString
+** les attributs de lien accès-arrêt figurent dans l'élément KML ExtendedData
+** l'attribut « name » du Document KML porte le nom «liens d'accès »
+** le nom de ce fichier KML est : access_links.kml
* un fichier des ITL
- - le type de géométrie est MultiPoint
- - les attributs d'ITL figurent dans l'élément KML ExtendedData
- - l'attribut « name » du Document KML porte le nom «ITL »
- - le nom de ce fichier KML est : itls.kml
+** le type de géométrie est MultiPoint
+** les attributs d'ITL figurent dans l'élément KML ExtendedData
+** l'attribut « name » du Document KML porte le nom «ITL »
+** le nom de ce fichier KML est : itls.kml
diff --git a/app/views/help/lines.textile b/app/views/help/lines.textile
index b75aca883..4b35d2b61 100644
--- a/app/views/help/lines.textile
+++ b/app/views/help/lines.textile
@@ -31,9 +31,11 @@ p(attr_data). Données de gestion :
- Identifiant Neptune :=
clé unique pérenne identifiant la ligne pour les échanges Neptune
cet identifiant est composé de 3 parties : préfixe:type:id_technique
+
* préfixe : clé identifiant un producteur de données unique
* type = Line : clé identifiant le type d'objet (valeur imposée)
* id_technique : valeur identifiant un seul objet d'un type donné pour un même producteur
+
ce champ obligatoire est automatiquement généré s'il n'est pas renseigné
il est possible aussi de ne renseigner que l'identifiant technique, auquel cas la valeur sera complétée automatiquement.
=:
diff --git a/app/views/help/networks.textile b/app/views/help/networks.textile
index aabd3cab8..cd21ddda9 100644
--- a/app/views/help/networks.textile
+++ b/app/views/help/networks.textile
@@ -5,7 +5,7 @@ title: Réseaux
h3. Définition
-Un *réseau* est constitué par les "lignes":lines, les "séquences d'arrêts":routes, les "Interdictions de Trafic Local":stop_areas (ITL), les "horaires":vehiclejourneys, et les "courses":vehiclejourneys qui le définissent.
+Un *réseau* est constitué par les "lignes":lines, les "séquences d'arrêts":routes, les "Interdictions de Trafic Local":stop_areas (ITL), les "horaires":vehicle_journeys, et les "courses":vehicle_journeys qui le définissent.
Chaque réseau dispose d'un identifiant fonctionnel (<< numéro d'enregistrement >>) qui est utilisé dans les échanges XML pour identifier le réseau et le mettre à jour. Il est très important que le gestionnaire le renseigne d'une manière bien définie et pérenne.
@@ -25,9 +25,11 @@ p(attr_data). Données de gestion :
- Identifiant Neptune :=
clé unique pérenne identifiant le réseau pour les échanges Neptune
cet identifiant est composé de 3 parties : préfixe:type:id_technique
+
* préfixe : clé identifiant un producteur de données unique
* type = GroupOfLine : clé identifiant le type d'objet (valeur imposée)
* id_technique : valeur identifiant un seul objet d'un type donné pour un même producteur
+
ce champ obligatoire est automatiquement généré s'il n'est pas renseigné
il est possible aussi de ne renseigner que l'identifiant technique, auquel cas la valeur sera complétée automatiquement.
=:
diff --git a/app/views/help/normalisation.textile b/app/views/help/normalisation.textile
index fb8f7d6e3..97f69419d 100644
--- a/app/views/help/normalisation.textile
+++ b/app/views/help/normalisation.textile
@@ -11,7 +11,7 @@ h3. TRANSMODEL (EN12896)
La norme européenne TRANSMODEL constitue le modèle conceptuel de données sur lequel s'appuie l'ensemble des travaux normatifs (Neptune, SIRI, IFOPT, NETEX) . Elle est actuellement validée dans sa version 5.1.
-Elle a pour objectif de décrire les différents concepts utilisés au sein des multiples métiers du transport public (aussi bien dans le domaine de l'exploitation, de la régulation que dans celui de l'information voyageur) en usant de la modélisation UML. Cette description a abouti à la constitution d'un "dictionnaire" dans lequel chacun peut venir piocher la terminologie adéquate pour pouvoir désigner, quels que soient la structure et le métier de l'intéressé, de façon homogène et non ambiguëe les concepts qu'il va décliner dans son application.
+Elle a pour objectif de décrire les différents concepts utilisés au sein des multiples métiers du transport public (aussi bien dans le domaine de l'exploitation, de la régulation que dans celui de l'information voyageur) en usant de la modélisation UML. Cette description a abouti à la constitution d'un "dictionnaire" dans lequel chacun peut venir piocher la terminologie adéquate pour pouvoir désigner, quels que soient la structure et le métier de l'intéressé, de façon homogène et non ambiguë les concepts qu'il va décliner dans son application.
h3. de TRIDENT à NEPTUNE (PR NF P99-506)
@@ -19,6 +19,7 @@ Dans le cadre de la "commission de normalisation CN03 pour les applications tél
Après examen des travaux en cours au niveau européen, il est apparu au groupe que les spécifications d'échange élaborées dans le cadre du projet européen TRIDENT étaient la meilleure base de travail sur laquelle s'appuyer pour la normalisation.
Ces spécifications d'échange couvrent l'information VP et TC, théorique et en situation perturbée; elles s'appuient sur :
+
* un modèle d'échange pair à pair entre fournisseur et client, avec possibilité d'abonnement ;
* un modèle de données orienté objets décrit en UML, reprenant pour ce qui concerne les transports publics, le modèle conceptuel de données Transmodel V4.0, normalisé au niveau européen ;
* un format d'échange XML spécifié sous forme de schémas XSD.
diff --git a/app/views/help/parametersets.textile b/app/views/help/parametersets.textile
index 8884c5ca7..e5a9c0045 100644
--- a/app/views/help/parametersets.textile
+++ b/app/views/help/parametersets.textile
@@ -7,7 +7,7 @@ h3. Définition
La phase 3 de la validation nécessite de définir des paramètres afin d'adapter les tests au plus proche de la réalité du terrain.
-Afin de rejouer facilement les tests dans différent contextes, il est possible de définir plusieurs jeux qui sont conservés indépendament des validations.
+Afin de rejouer facilement les tests dans différent contextes, il est possible de définir plusieurs jeux qui sont conservés indépendamment des validations.
Un jeu de paramètre est proposé par défaut à la création du référentiel; celui-ci peut être modifié ou détruit; il n'est alors pas possible de le recréer.
@@ -16,7 +16,7 @@ h3. Paramètres généraux
- Nom := Nom du jeu de données (nom utilisé pour sa sélection dans les imports et validations)
- Délimitation géographique des arrêts :=
Emprise géographique du réseau (tous les arrêts testés devront être inclus dans cette zone)
-Le format de ce champs est un ensembe de points formant une polyligne fermée:
+Le format de ce champs est un ensemble de points formant une polyligne fermée:
[[longitude1,latitude1],[longitude2,latitude2],,,[longitudeN,latitudeN],[longitude1,latitude1]]
Les longitudes et latitudes sont exprimées en degré, décimaux positifs à l'est et au nord
=:
@@ -24,8 +24,8 @@ Les longitudes et latitudes sont exprimées en degré, décimaux positifs à l'e
p. *Distance minimum entre :* (en mètres)
-- 2 arrêts n'ayant pas le même parent := distance en deça de laquelle 2 arrêts devraient être regroupés dans la même zone
-- 2 accès de noms différents pour un même arrêt := distance en deça de laquelle 2 accès d'un même arrêt devraient en être qu'un
+- 2 arrêts n'ayant pas le même parent := distance en deçà de laquelle 2 arrêts devraient être regroupés dans la même zone
+- 2 accès de noms différents pour un même arrêt := distance en deçà de laquelle 2 accès d'un même arrêt devraient en être qu'un
p. *Distance maximum entre :* (en mètres)
@@ -38,8 +38,8 @@ p. *Vitesse de marche maximum d'un voyageur :* (en kilomètres/heure)
vitesse maximale admise dans les correspondances et les liaisons arrêt - accès pour :
- un voyageur ordinaire := qui a un connaissance théorique du réseau
-- un voyageur occasionnel := qui ne connait pas le réseau
-- un voyageur habituel := qui connait bien le réseau
+- un voyageur occasionnel := qui ne connaît pas le réseau
+- un voyageur habituel := qui connaît bien le réseau
- un voyageur à mobilité réduite := qui a des difficultés de déplacement
@@ -51,7 +51,7 @@ p. les paramètres suivants sont à définir pour chaque mode de transport dispo
- Distance maximum entre 2 arrêts (en mètres) := distance maximale de parcours d'un véhicule entre 2 arrêts.
- Vitesse minimum (en kilomètres/heure) := vitesse minimale attendue entre 2 arrêts d'une course
- Vitesse maximum (en kilomètres/heure) := vitesse maximale attendue entre 2 arrêts d'une course
-- Ecart maximum de durée de trajet entre 2 arrêts successifs pour les différentes courses (en secondes) :=
+- Écart maximum de durée de trajet entre 2 arrêts successifs pour les différentes courses (en secondes) :=
la différence de temps de trajet entre 2 arrêts successifs de 2 courses d'une même mission ne doit pas dépasser ce seuil =:
h3. Remarques
diff --git a/app/views/help/restapis.textile b/app/views/help/restapis.textile
index 2bd3d2d2d..4a2d097b6 100644
--- a/app/views/help/restapis.textile
+++ b/app/views/help/restapis.textile
@@ -18,12 +18,15 @@ h4. Principe
Ces interfaces externes REST (notées API) sont des Web Service (noté WS) qui donnent un accès en consultation à la topologie d’un référentiel.
Les WS proposent 2 sortes de requêtes REST
+
* la requête « index » qui liste des éléments de topologie avec éventuellement un paramètre de filtre
* la requête « show » qui donne le détail d’un élément de topologie
Pour garantir la sécurité, ces API nécessitent une clé d'authentification créée à partir du tableau de bord du référentiel.
La clé doit être positionnée dans la propriété HTTP_AUTHORIZATION de l'entête de la requête.
+
* Token token = [clé]
+
Cette clé permet de garantir la sécurité et de diriger l'API rest sur le bon référentiel.
Ces API sont plus amplement décrites dans le document SFT-Chouette Définition des API REST V1 disponible sur "chouette.mobi":http://chouette.mobi
@@ -31,10 +34,11 @@ Ces API sont plus amplement décrites dans le document SFT-Chouette Définition
h4. Syntaxe
Les différents objets Neptune sont accessibles dans Chouette par l'URL Rest:
-??[URL_server]/api/v1/[Objects]/[objectId].[format]??
+?? [URL_server]/api/v1/[Objects]/[objectId].[format] ??
la liste des objets d'un même type peut être obtenue par l'URL REST :
-??[URL_server]/api/v1/[Objects].[format][?q filtre]??
+?? [URL_server]/api/v1/[Objects].[format][?q filtre] ??
où :
+
* URL_server : l'adresse web d'installation du serveur Chouette
* Objects: le type d'objet demandé (au pluriel)
** networks
@@ -49,11 +53,13 @@ où :
h4. exemples
-* http://chouette.mobi/chouette2/api/v1/lines.xml?q%5Bname_or_number_cont%5D=34
-Dans cet exemple le critère porte sur les champs « name » et « number » dont l'un des 2 doit contenir la chaine « 34 ».
+* http://appli.chouette.mobi/chouette2/api/v1/lines.xml?q%5Bname_or_number_cont%5D=34
+
+Dans cet exemple le critère porte sur les champs « name » et « number » dont l'un des 2 doit contenir la chaîne « 34 ».
(note: 5B et 5D sont les codes ascii des crochets ouvrants [ et fermants ] )
* http://localhost:3000/api/v1/lines/Tatrobus:Line:3.json
+
Cet exemple retourne les attributs de la ligne 3 du réseau Tatrobus au format json
diff --git a/app/views/help/routes.textile b/app/views/help/routes.textile
index 6edc24ce6..c422be1ad 100644
--- a/app/views/help/routes.textile
+++ b/app/views/help/routes.textile
@@ -5,7 +5,7 @@ title: Séquence d'arrêts
h3. Définition
-La *séquence d'arrêts* est une sélection ordonnée de références aux "points d'arrêt":stop_areas (exemple: itinéraires aller et retour d'une ligne). Une séquence d'arrêts est spécifique à une "ligne":line; les séquences d'arrêts peuvent référencer des arrêts communs.
+La *séquence d'arrêts* est une sélection ordonnée de références aux "points d'arrêt":stop_areas (exemple: itinéraires aller et retour d'une ligne). Une séquence d'arrêts est spécifique à une "ligne":lines; les séquences d'arrêts peuvent référencer des arrêts communs.
(Dans les versions antérieures de Chouette jusqu'à la 1.6, la séquence d'arrêts était intitulée 'itinéraire')
@@ -24,9 +24,11 @@ p(attr_data). Données de gestion :
- Identifiant Neptune :=
clé unique pérenne identifiant la séquence d'arrêts pour les échanges Neptune
cet identifiant est composé de 3 parties : préfixe:type:id_technique
+
* préfixe : clé identifiant un producteur de données unique
* type = Route : clé identifiant le type d'objet (valeur imposée)
* id_technique : valeur identifiant un seul objet d'un type donné pour un même producteur
+
ce champ obligatoire est automatiquement généré s'il n'est pas renseigné
il est possible aussi de ne renseigner que l'identifiant technique, auquel cas la valeur sera complétée automatiquement.
=:
diff --git a/app/views/help/stop_areas.textile b/app/views/help/stop_areas.textile
index 8bed87b65..43b7be200 100644
--- a/app/views/help/stop_areas.textile
+++ b/app/views/help/stop_areas.textile
@@ -22,18 +22,22 @@ Par la suite, on peut regrouper deux (ou plus) arrêts physiques au sein d'un *a
Enfin, CHOUETTE offre la possibilité de regrouper les lieux d'arrêt agglomérés ainsi créés au sein d'une *zone d'arrêt de troisième niveau* pour constituer des *pôles d'échange*.
Ainsi on obtient les possibilités de regroupements suivants:
+
* un arrêt physique regroupe plusieurs arrêts sur itinéraire (ou séquence d'arrêts).
* un arrêt commercial regroupe plusieurs arrêts physiques (quai, embarquement).
* un pôle d'échange regroupe plusieurs arrêts commerciaux.
Pour ne pas aboutir à un système trop complexe, les règles suivantes sont posées:
+
* un pôle d'échange peut contenir des arrêts commerciaux et/ou des pôles d'échanges (qui ne peuvent pas en contenir d'autres).
* un arrêt commercial ne peut contenir que des arrêts physiques.
Un dernier regroupement est *l'ITL* :
-*L'interdiction de trafic local* est l'interdiction faite à un service routier de prendre et de laisser un même voyageur à l'intérieur du périmètre des transports urbains _(cf. Décret n°49-1473 du 14 novembre 1949)_ .
+*L'interdiction de trafic local* est l'interdiction faite à un service routier de prendre et de laisser un même voyageur à l'intérieur du périmètre des transports urbains (cf. Décret n°49-1473 du 14 novembre 1949) .
+
Ainsi dans CHOUETTE:
+
* Une ITL est un regroupement d'arrêts représentant le périmètre d'interdiction.
* Une ITL est associée à une ou plusieurs lignes
@@ -47,7 +51,6 @@ h3(#attr). Attributs
* !stopplace.png! pôle d'échange
* !itl.png! ITL
-
- Nom := nom de l'arrêt
- Commentaire := zone de texte libre
- Point d'intérêt le plus proche := nom du lieu desservi par l'arrêt
@@ -68,9 +71,11 @@ p(attr_data). Données de gestion :
- Identifiant Neptune :=
clé unique pérenne identifiant la ligne pour les échanges Neptune
cet identifiant est composé de 3 parties : préfixe:type:id_technique
+
* préfixe : clé identifiant un producteur de données unique
* type = StopArea : clé identifiant le type d'objet (valeur imposée)
* id_technique : valeur identifiant un seul objet d'un type donné pour un même producteur
+
ce champ obligatoire est automatiquement généré s'il n'est pas renseigné
il est possible aussi de ne renseigner que l'identifiant technique, auquel cas la valeur sera complétée automatiquement.
=:
@@ -83,7 +88,7 @@ h3(#ope). Mode opératoire
h4. Déplacement sur la carte
* activer le déplacement en cliquant sur l'arrêt -> le curseur prend la forme d'une quadruple flèche
-* appuyer sur le bouton gauche de la souris et maintenir appuyer lors du déplacement -> l'arrêt suit la souris
+* appuyer sur le bouton gauche de la souris et maintenir appuyé lors du déplacement -> l'arrêt suit la souris
* relâcher le bouton -> l'arrêt a une nouvelle position fixe
* cliquer sur la carte -> sortie du mode déplacement; les coordonnées sont actualisées dans le formulaire
diff --git a/app/views/help/timetables.textile b/app/views/help/time_tables.textile
index e3d56eed9..87e04b37f 100644
--- a/app/views/help/timetables.textile
+++ b/app/views/help/time_tables.textile
@@ -42,6 +42,7 @@ cet identifiant est composé de 3 parties : préfixe:type:id_technique
* préfixe : clé identifiant un producteur de données unique
* type = Timetable : clé identifiant le type d'objet (valeur imposée)
* id_technique : valeur identifiant un seul objet d'un type donné pour un même producteur
+
ce champ obligatoire est automatiquement généré s'il n'est pas renseigné
il est possible aussi de ne renseigner que l'identifiant technique, auquel cas la valeur sera complétée automatiquement.
=:
diff --git a/app/views/help/toc.textile b/app/views/help/toc.textile
index c19bf164e..a88d73afd 100644
--- a/app/views/help/toc.textile
+++ b/app/views/help/toc.textile
@@ -17,13 +17,13 @@ h3. Sommaire
# "Transporteurs":companies
# "Lignes":lines
## "Séquences d'arrêts":routes
-## "Missions":journeypatterns
-## "Courses/Horaires":vehiclejourneys
+## "Missions":journey_patterns
+## "Courses/Horaires":vehicle_journeys
# "Arrêts":stop_areas
## "Correspondances":connection_links
## "Accès":access_points
## "Liens Arrêts-Accès":access_links
-# "Calendriers d'application":timetables
+# "Calendriers d'application":time_tables
# Outils
## "Imports":imports
## "Exports":exports
diff --git a/app/views/help/tutorial.textile b/app/views/help/tutorial.textile
index 8cf0f6a7a..ff1567272 100644
--- a/app/views/help/tutorial.textile
+++ b/app/views/help/tutorial.textile
@@ -11,5 +11,5 @@ Des courses, horaires, missions, Interdictions de Trafic Local et calendriers d'
L'utilisateur a alors la possibilité de découvrir et de modifier à souhait ces éléments afin d'expérimenter les différentes fonctions et possibilités de l'outil CHOUETTE.
La démonstration est disponible en ligne sur "www.chouette.mobi":www.chouette.mobi
-Les données 'Tatrobus' sont disponibles ["ici":http://www.chouette.mobi/spip.php?rubrique46]
-A noter également que des données Neptune sont disponibles au format Neptune sous licence open data, cf. par exemple ["ici":http://www.chouette.mobi/spip.php?rubrique84] \ No newline at end of file
+Les données 'Tatrobus' sont disponibles ["ici":http://www.chouette.mobi/docs/]
+A noter également que des données Neptune sont disponibles au format Neptune sous licence open data, cf. par exemple ["ici":http://www.chouette.mobi/docs/] \ No newline at end of file
diff --git a/app/views/help/validations.textile b/app/views/help/validations.textile
index 7101739fb..c2927cdbf 100644
--- a/app/views/help/validations.textile
+++ b/app/views/help/validations.textile
@@ -18,7 +18,7 @@ p. La validation effectue un ensemble de contrôles syntaxiques, sémantiques et
** les données d’offre sont analysées (structure, contrôles de complétude et de connexité des données) ;
* le 3ème niveau d'analyse concerne plutôt des contrôles du « réalisme » des données ; il peut être effectué en base de données, donc y compris sur des données importées depuis un autre format que Neptune (GTFS, CSV, etc.). A ces points de contrôle est associé un jeu de paramètres modifiable par l'utilisateur.
-p. Les tests (« points de contrôle ») de validation Neptune sont décrits sur le site "chouette.mobi":http://www.chouette.mobi/spip.php?rubrique108
+p. Les tests (« points de contrôle ») de validation Neptune sont décrits sur le site "chouette.mobi":http://www.chouette.mobi/docs/
h3(#fmt). Formats disponibles
@@ -49,9 +49,9 @@ h3(#res). Consultation des résultats : détail de l'objet Validation
p. La validation est lancée en différé; son état d'avancement est affiché sous la forme d'une icône donc la couleur dépend de l'état:
-- bleu : en cours
-- vert : terminé correctement
-- rouge : terminé en échec (la validation n'a pas pu aboutir, contacter l'administrateur système pour plus de détails)
+* bleu : en cours
+* vert : terminé correctement
+* rouge : terminé en échec (la validation n'a pas pu aboutir, contacter l'administrateur système pour plus de détails)
p. La consultation du résultat de la validation donne le bilan des contrôles ou les motifs de l’échec. Le résultat est conservé tant que la validation n’est pas supprimée.
@@ -93,11 +93,11 @@ p. Dans les 2 cas, la sélection d'un des secteurs affiche la liste des tests co
p(border_image). !validation_mandatory_detail.png!
-Une bulle d'information s'affiche en sélectionnant une icone bleue !notice.png! :
+Une bulle d'information s'affiche en sélectionnant une icône bleue !notice.png! :
p(border_image). !validation_bulle.png!
-p. La spécificaation du test s'affiche par le lien sur le code
+p. La spécification du test s'affiche par le lien sur le code
p. En cas d'erreur, la localisation est fournie dans la colonne 'Détail':
diff --git a/app/views/help/vehiclejourneys.textile b/app/views/help/vehicle_journeys.textile
index 74322ea88..d5186cf57 100644
--- a/app/views/help/vehiclejourneys.textile
+++ b/app/views/help/vehicle_journeys.textile
@@ -21,9 +21,11 @@ p(attr_data). Données de gestion :
- Identifiant Neptune :=
clé unique pérenne identifiant la course pour les échanges Neptune
cet identifiant est composé de 3 parties : préfixe:type:id_technique
+
* préfixe : clé identifiant un producteur de données unique
* type = VehicleJourney : clé identifiant le type d'objet (valeur imposée)
* id_technique : valeur identifiant un seul objet d'un type donné pour un même producteur
+
ce champ obligatoire est automatiquement généré s'il n'est pas renseigné
il est possible aussi de ne renseigner que l'identifiant technique, auquel cas la valeur sera complétée automatiquement.
=:
diff --git a/app/views/import_tasks/_import_task.erb b/app/views/import_tasks/_import_task.erb
index 5f2326209..c65ee591c 100644
--- a/app/views/import_tasks/_import_task.erb
+++ b/app/views/import_tasks/_import_task.erb
@@ -1,4 +1,4 @@
-<%= div_for import_task do %>
+<%= div_for import_task, :class => "clearfix" do %>
<div class="icon">
<%= link_to image_tag("import_task-#{import_task.status}.png"), referential_import_task_path(@referential, import_task) %>
</div>
@@ -8,7 +8,7 @@
<li class="remove"><%= link_to "<i class='fa fa-trash-o'></i>".html_safe, referential_import_task_path(@referential, import_task), :method => :delete, :class => "delete", :data => {:confirm => t('import_tasks.actions.destroy_confirm')} %></li>
</ul>
<div class="links">
- <p><%= link_to image_tag("icons/file_#{import_task.file_path_extension}.png") + t("import_tasks.index.imported_file"), file_to_import_referential_import_task_path(@referential, import_task) %></p>
+ <p><%= link_to image_tag("icons/file_#{import_task.file_path_extension}.png") + t("import_tasks.show.imported_file"), file_to_import_referential_import_task_path(@referential, import_task) %></p>
<% if import_task.compliance_check_task.present? %>
<p><%= link_to image_tag( compliance_icon( import_task)) + t("import_tasks.compliance_check_task"), referential_compliance_check_task_path(@referential, import_task.compliance_check_task) %></p>
<% end %>
diff --git a/app/views/journey_patterns/_form.html.erb b/app/views/journey_patterns/_form.html.erb
index 9577edd2c..771283885 100644
--- a/app/views/journey_patterns/_form.html.erb
+++ b/app/views/journey_patterns/_form.html.erb
@@ -5,7 +5,7 @@
<%= form.input :registration_number %>
<%= form.input :comment %>
<%= form.input :stop_point_ids, :label => stop_point_ids_label(@journey_pattern), :as => :check_boxes, :collection => @route.stop_points.map { |s| [s.stop_area.name, s.id.to_s]}, :input_html => (@journey_pattern.new_record? ? { :checked => 'checked' }:{}) %>
- <%= form.input :objectid, :required => !@journey_pattern.new_record?, :input_html => { :disabled => !@journey_pattern.new_record? } %>
+ <%= form.input :objectid, :required => !@journey_pattern.new_record? %>
<% end %>
<%= form.actions do %>
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index d0428dd9f..5ff860a54 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -18,60 +18,24 @@
</head>
<body>
<div id="header">
+ <%= render partial: "shared/header" %>
+ </div>
+ <div id="middle" class="container">
<div class="row">
- <div class="col-md-4">
- <div class="logo">
- <%= link_to image_tag("logo_chouette.png"), referentials_path %>
- <span class="version"><%= APP_VERSION %></span>
- </div>
- </div>
- <div class="col-md-4">
- <div class="title">
- <% if selected_referential? %>
- <h1><%= @referential.name %></h1>
- <% elsif help_page? %>
- <h1>Guide d'utilisation</h1>
- <% end %>
+ <div class="col-md-9">
+ <div id="workspace" class="<%= controller_name %> <%= action_name %>">
+ <%= render partial: "shared/flash_messages", flash: flash %>
+ <%= yield %>
</div>
</div>
- <div class="col-md-4">
- <div class="interaction">
- <%= render "layouts/user_links" %>
- </div>
- </div>
+ <div id="sidebar" class="col-md-3">
+ <%= yield :sidebar %>
+ </div>
</div>
- <div class="tabs">
- <ul class="nav nav-tabs">
- <% if help_page? %>
- <li><%= link_to "Aide", help_path, :class =>("current" if help_page?) %></li>
- <% elsif ! selected_referential? %>
- <% if user_signed_in? %>
- <li><%= link_to Referential.model_name.human(:count=>2), referentials_path, :class => ("current" if current_page?(referentials_path) || current_page?(root_url)) %></li>
- <li class="admin"><%= tab_link_to Organisation.model_name.human, organisation_path %></li>
- <% end %>
- <% else %>
- <li><%= link_to t("layouts.tabs.dashboard").capitalize, referential_path(@referential), :class => ("current" if current_page?(referential_path(@referential)) || request.path.start_with?(referential_rule_parameter_sets_path(@referential))) %></li>
- <li><%= tab_link_to Chouette::Network, referential_networks_path(@referential) %></li>
- <li><%= tab_link_to Chouette::Company, referential_companies_path(@referential) %></li>
- <li><%= tab_link_to Chouette::GroupOfLine, referential_group_of_lines_path(@referential) %></li>
- <li><%= tab_link_to Chouette::Line, referential_lines_path(@referential) %></li>
- <li><%= tab_link_to Chouette::StopArea, referential_stop_areas_path(@referential) %></li>
- <li><%= tab_link_to Chouette::ConnectionLink, referential_connection_links_path(@referential) %></li>
- <li><%= tab_link_to Chouette::TimeTable, referential_time_tables_path(@referential) %></li>
- <li><%= tab_link_to ImportTask, referential_import_tasks_path(@referential) %></li>
- <li><%= tab_link_to Export, referential_exports_path(@referential) %></li>
- <li><%= tab_link_to ComplianceCheckTask, referential_compliance_check_tasks_path(@referential) %></li>
- <% end %>
- </ul>
</div>
- <div id="body">
- <div id="workspace" class="<%= controller_name %> <%= action_name %>">
- <%= render partial: "shared/flash_messages", flash: flash %>
- <%= yield %>
- </div>
- <div id="sidebar">
- <%= yield :sidebar %>
- </div>
+ <div class="clearfix"></div>
+ <div id="footer">
+ <%= render partial: "shared/footer" %>
</div>
</body>
</html>
diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb
index 86f141428..387221103 100644
--- a/app/views/layouts/mailer.html.erb
+++ b/app/views/layouts/mailer.html.erb
@@ -12,13 +12,13 @@
</style>
<h1 style="background: #61970B; height: 75px; font-size: 24px; font-weight: normal; color: white; padding: 20px 0 0 30px;">Chouette</h1>
-
+
<div style="background: white; margin-bottom: 10px; padding: 15px; -moz-box-shadow: 3px 3px 4px #bbbbbb; -webkit-box-shadow: 3px 3px 4px #BBB; box-shadow: 3px 3px 4px #BBB; border-right: 1px solid #BBB; border-bottom: 1px solid #BBB;">
<%= yield %>
</div>
<div style="color: #333333; text-align:center; font-size: 10px;">
- Envoyé par <a href="/">Chouette</a>
+ Envoyé par <%= link_to root_url, "Chouette" %>
</div>
</body>
</html>
diff --git a/app/views/layouts/without_sidebar.html.erb b/app/views/layouts/without_sidebar.html.erb
new file mode 100644
index 000000000..d07139c2f
--- /dev/null
+++ b/app/views/layouts/without_sidebar.html.erb
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="<%= I18n.locale %>">
+ <head>
+ <title>Chouette V2 - <%= title %></title>
+ <%= stylesheet_link_tag :application %>
+ <%= javascript_include_tag :application %>
+ <% if defined?( @map) %>
+ <script src="http://maps.google.com/maps/api/js?v=3.2&sensor=false"></script>
+ <script src="http://openlayers.org/api/OpenLayers.js"></script>
+ <script type="text/JavaScript">
+ OpenLayers.ImgPath = "<%= polymorphic_path_patch("/assets/openlayers/") %>";
+ </script>
+ <% end %>
+ <%= analytics_init if Rails.env.production? %>
+ <%= csrf_meta_tag %>
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
+ </head>
+ <body>
+ <div id="header">
+ <%= render partial: "shared/header" %>
+ </div>
+ <div id="middle" class="container">
+ <div class="row">
+ <div class="col-md-12">
+ <div id="workspace" class="<%= controller_name %> <%= action_name %>">
+ <%= render partial: "shared/flash_messages", flash: flash %>
+ <%= yield %>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div id="footer">
+ <%= render partial: "shared/footer" %>
+ </div>
+ </body>
+</html>
diff --git a/app/views/lines/_form.erb b/app/views/lines/_form.erb
index ccf0a2f65..554de3319 100644
--- a/app/views/lines/_form.erb
+++ b/app/views/lines/_form.erb
@@ -11,7 +11,7 @@
<%= form.input :mobility_restricted_suitability, :as => :select, :collection => [[@line.human_attribute_name("accessible"), true], [@line.human_attribute_name("not_accessible"), false]], :include_blank => true %>
<%= form.input :flexible_service, :as => :select, :collection => [[@line.human_attribute_name("on_demaond_fs"), true], [@line.human_attribute_name("regular_fs"), false]], :include_blank => true %>
<%= form.input :comment %>
- <%= form.input :objectid, :required => !@line.new_record?, :input_html => { :disabled => !@line.new_record? } %>
+ <%= form.input :objectid, :required => !@line.new_record? %>
<% end %>
<%= form.inputs do %>
diff --git a/app/views/lines/index.html.erb b/app/views/lines/index.html.erb
index 5a910d6e2..5f8f756d8 100644
--- a/app/views/lines/index.html.erb
+++ b/app/views/lines/index.html.erb
@@ -1,4 +1,4 @@
-<%= title_tag t('lines.index.title') %>
+<%= title_tag t('lines.index.title') %>
<%= search_form_for @q, :url => referential_lines_path(@referential), :html => {:method => :get} do |f| %>
<%= f.label :name_or_number_cont, "#{t('.name_or_number')} :" %>
@@ -42,7 +42,7 @@
<% content_for :sidebar do %>
<ul class="actions">
- <li><%= link_to t('lines.actions.new'), new_referential_line_path(@referential), :class => "add" %></li>
+ <li><%= link_to t('lines.actions.new'), new_referential_line_path(@referential), :class => "add" %></li>
</ul>
<h4><%= t(".selection") %></h4>
@@ -67,7 +67,6 @@
<% if @referential.group_of_lines.count > 0 %>
<h5><%= Chouette::GroupOfLine.model_name.human.pluralize %></h5>
-
<ul class="selection">
<% @referential.group_of_lines.each do |group_of_line| %>
<li><%= link_with_search group_of_line.name, "group_of_lines_id_eq" => group_of_line.id %></li>
@@ -84,14 +83,13 @@
<div class="enabled" style="display: none;">
<a class="disable" href="#"><%= t(".multi_selection_disable") %></a>
-
+
<ul class="actions">
- <%= link_to t(".delete_selected"), referential_lines_path(@referential), "data-multiple-method" => "delete", :class => "remove" %>
- <li><a href="#" class="export"><%= t(".export_selected") %></a></li>
+ <%= link_to t(".delete_selected"), referential_lines_path(@referential), "data-multiple-method" => "delete", :class => "remove", :confirm => t("lines.actions.destroy_selection_confirm") %>
</ul>
<a class="select_all" href="#"><%= t(".select_all") %></a> | <a class="deselect_all" href="#"><%= t(".deselect_all") %></a>
- </div>
+ </div>
</div>
<% end %>
diff --git a/app/views/networks/_form.erb b/app/views/networks/_form.erb
index 935a61efc..61b52a6a4 100644
--- a/app/views/networks/_form.erb
+++ b/app/views/networks/_form.erb
@@ -7,7 +7,7 @@
<%= form.input :description %>
<%= form.input :source_name %>
<%= form.input :source_identifier %>
- <%= form.input :objectid, :required => !@network.new_record?, :input_html => { :disabled => !@network.new_record? } %>
+ <%= form.input :objectid, :required => !@network.new_record? %>
<% end %>
<%= form.actions do %>
diff --git a/app/views/referentials/index.html.erb b/app/views/referentials/index.html.erb
index 5111856d9..220fc17ba 100644
--- a/app/views/referentials/index.html.erb
+++ b/app/views/referentials/index.html.erb
@@ -8,5 +8,4 @@
<ul class="actions">
<li><%= link_to t('referentials.actions.new'), new_referential_path, :class => "add" %></li>
</ul>
-<%= render "layouts/logos" %>
<% end %>
diff --git a/app/views/routes/_form.html.erb b/app/views/routes/_form.html.erb
index b11e94f2c..508593d07 100644
--- a/app/views/routes/_form.html.erb
+++ b/app/views/routes/_form.html.erb
@@ -7,7 +7,7 @@
<%= form.input :opposite_route, :as => :select, :collection => @line.routes.select { |r| r.id != @route.id } %>
<%= form.input :direction_code, :as => :select, :collection => Chouette::Route.directions, :include_blank => false, :member_label => Proc.new { |mode| t("directions.label.#{mode}") } %>
<%= form.input :wayback_code, :as => :select, :collection => Chouette::Route.waybacks, :include_blank => false, :member_label => Proc.new { |mode| t("waybacks.label.#{mode}") } %>
- <%= form.input :objectid, :required => !@route.new_record?, :input_html => { :disabled => !@route.new_record? } %>
+ <%= form.input :objectid, :required => !@route.new_record?%>
<% end %>
<div id="stop_points">
<%= form.semantic_fields_for :stop_points, :include_id => false, :label => "TOTO" do |p| %>
diff --git a/app/views/routes/_route.html.erb b/app/views/routes/_route.html.erb
index be5bbeb2b..79064ed97 100644
--- a/app/views/routes/_route.html.erb
+++ b/app/views/routes/_route.html.erb
@@ -1,37 +1,36 @@
<%= div_for(route) do %>
- <% if ( route.wayback_code ) %>
- <%= link_to image_tag("icons/#{route.wayback}.png"), referential_line_route_path( @referential, @line, route) %>
- <% end %>
- <div>
- <%= link_to route.name, referential_line_route_path( @referential, @line, route) %>
- </div>
- <div class="info">
- <% if ! route.number.blank? %>
- <%= route.human_attribute_name('number') %> <%= route.number %> -
- <% end %>
- <% if ! route.direction.blank? %>
- <%= route.human_attribute_name('direction_code') %> <%= t('directions.label.'+route.direction_code) %> -
+<div class="header">
+ <% if ( route.wayback_code ) %>
+ <%= fonticon_wayback(route.wayback) %>
<% end %>
+ <%= link_to route.name, referential_line_route_path( @referential, @line, route) %>
<% if route.wayback_code %>
- <%= route.human_attribute_name('wayback_code') %> <%= (route.wayback=="A") ? t('.wayback.positive') : t('.wayback.negative') %>
- <% end %>
- <% if route.wayback_code || (not route.direction.blank?) || ( not route.number.blank?) %>
- <br/>
+ <span class="wayback"><%= route.human_attribute_name('wayback_code') %> <%= (route.wayback=="A") ? t('.wayback.positive') : t('.wayback.negative') %></span>
<% end %>
+</div>
+<div class="clearfix"></div>
+<div class="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 %>
- <%= t('.opposite') %> <%= link_to route.opposite_route.name, referential_line_route_path( @referential, @line, route.opposite_route) %>
+ <%= fonticon_wayback(route.opposite_route.wayback) %><%= link_to route.opposite_route.name, referential_line_route_path( @referential, @line, route.opposite_route) %> [<%= t('.opposite') %>]
<% else %>
- <%= t('.no_opposite') %>
+ <%= t('.no_opposite') %>
<% end %>
- <% if route.journey_patterns.size > 0 %>
- <div class="actions">
- <%= link_to t("vehicle_journeys.actions.index"), referential_line_route_vehicle_journeys_path(@referential, @line, route), :class => "link" %>
- </div>
+ </p>
+ <p>
+ <% if ! route.direction.blank? %>
+ <%= route.human_attribute_name('direction_code') %> : <%= t('directions.label.'+route.direction_code) %>
<% else %>
- <div class="actions">
- <%= t('.no_journey_pattern')%>
- </div>
- <% end%>
- </div>
+ <br>
+ <% end %>
+ </p>
+</div>
<% end %>
diff --git a/app/views/routes/show.html.erb b/app/views/routes/show.html.erb
index 9c1913e51..63f52974c 100644
--- a/app/views/routes/show.html.erb
+++ b/app/views/routes/show.html.erb
@@ -101,14 +101,14 @@
<%= link_to t('journey_patterns.actions.new'), new_referential_line_route_journey_pattern_path(@referential, @line, @route), :class => "add" %>
</li>
<% end %>
-<% if @route.journey_patterns.size > 0 %>
<li>
- <%= link_to t('vehicle_journeys.actions.index'), [@referential, @line, @route, :vehicle_journeys], :class => "link" %>
+ <%= link_to t('vehicle_journey_imports.new.title'), new_referential_line_route_vehicle_journey_import_path( @referential, @line, @route ), :class => "import" %>
</li>
- <% end %>
+ <% if @route.journey_patterns.size > 0 %>
<li>
- <%= link_to t('vehicle_journey_imports.new.title'), new_referential_line_route_vehicle_journey_import_path( @referential, @line, @route ), :class => "import" %>
+ <i class="fa fa-clock-o"></i><%= link_to t('vehicle_journeys.actions.index'), [@referential, @line, @route, :vehicle_journeys], :class => "vehicle_journeys" %>
</li>
+<% end %>
</ul>
<%= creation_tag(@route) %>
diff --git a/app/views/shared/_footer.erb b/app/views/shared/_footer.erb
new file mode 100644
index 000000000..3ad00df77
--- /dev/null
+++ b/app/views/shared/_footer.erb
@@ -0,0 +1,42 @@
+<div class="container">
+ <div class="row">
+ <div class="col-md-3 logo">
+ <%= image_tag "#{ChouetteIhm::Application.config.company_name}.png" %>
+ </div>
+ <div class="col-md-3">
+ <ul>
+ <li><h4><%= t("layouts.footer.product.title") %></h4></li>
+ <li><%= link_to t("layouts.footer.product.licence"), "http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html" %></li>
+ <li><%= link_to t("layouts.footer.product.source_code"), "https://github.com/afimb/chouette2" %></li>
+ <li><%= link_to t("layouts.footer.product.user_group"), "http://www.chouette.mobi/les-utilisateurs/club-utilisateur-des-outils-chouette-et-irys/" %></li>
+ </ul>
+ </div>
+ <div class="col-md-3">
+ <ul>
+ <li><h4><%= t("layouts.footer.support.title") %></h4></li>
+ <li>
+ <% if ChouetteIhm::Application.config.company_contact.include?("@") %>
+ <%= mail_to "#{ChouetteIhm::Application.config.company_contact}", t("layouts.footer.contact.mail") %>
+ <% else %>
+ <%= link_to t("layouts.footer.contact.mail"), "#{ChouetteIhm::Application.config.company_contact}" %>
+ <% end %>
+ </li>
+ <li><%= link_to t("layouts.footer.support.help"), "/help" %></li>
+ </ul>
+ </div>
+ <div class="col-md-3">
+ <ul>
+ <li><h4><%= t("layouts.footer.contact.title") %></h4></li>
+ <li>
+ <% if ChouetteIhm::Application.config.company_contact.include?("@") %>
+ <%= mail_to "#{ChouetteIhm::Application.config.company_contact}", t("layouts.footer.contact.mail") %>
+ <% else %>
+ <%= link_to t("layouts.footer.contact.mail"), "#{ChouetteIhm::Application.config.company_contact}" %>
+ <% end %>
+ </li>
+ <li><%= link_to t("layouts.footer.contact.newsletter"),"http://www.chouette.mobi/les-utilisateurs/etre-informe/" %></li>
+ <li><%= link_to t("layouts.footer.contact.forum"), "http://forum.chouette.mobi/" %></li>
+ </ul>
+ </div>
+ </div>
+</div>
diff --git a/app/views/shared/_header.erb b/app/views/shared/_header.erb
new file mode 100644
index 000000000..a1d05ca38
--- /dev/null
+++ b/app/views/shared/_header.erb
@@ -0,0 +1,93 @@
+<nav class="navbar navbar-default navbar-fixed-top" role="navigation">
+ <div class="container">
+ <!-- Brand and toggle get grouped for better mobile display -->
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
+ <span class="sr-only">Toggle navigation</span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar version"><%= APP_VERSION %></span>
+ </button>
+ <%= link_to referentials_path, :class =>"navbar-brand" do %>
+ <%= image_tag("logo_chouette.png") %> <span class="version"><%= APP_VERSION %></span>
+ <% end %>
+ </div>
+
+ <!-- Collect the nav links, forms, and other content for toggling -->
+ <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
+ <ul class="nav navbar-nav">
+ <% if selected_referential? %>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown"><%= @referential.name %><b class="caret"></b></a>
+ <ul class="dropdown-menu">
+ <li><%= link_to t("layouts.navbar.return_to_referentials"), referentials_path %></li>
+ <li class="divider"></li>
+ <li role="presentation" class="dropdown-header"><%= t("layouts.navbar.select_referential") %></li>
+ <% current_organisation.referentials.each do |referential| %>
+ <li>
+ <%= link_to referential.name, referential_path(referential) %>
+ </li>
+ <% end %>
+ </ul>
+ </li>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown"><%= t("layouts.navbar.referential_datas") %><b class="caret"></b></a>
+ <ul class="dropdown-menu">
+ <li><%= link_to t("layouts.navbar.return_to_dashboard"), referential_path(@referential) %></li>
+ <li class="divider"></li>
+ <li role="presentation" class="dropdown-header"><%= t("layouts.navbar.select_referential_datas") %></li>
+ <li><%= link_to referential_networks_path(@referential) do %>
+ <%= Referential.human_attribute_name("networks") %><span class="badge pull-right"><%= @referential.networks.size %></span>
+ <% end %>
+ </li>
+ <li><%= link_to referential_companies_path(@referential) do %>
+ <%= Referential.human_attribute_name("companies") %><span class="badge pull-right"><%= @referential.companies.size %></span>
+ <% end %>
+ </li>
+ <li><%= link_to referential_group_of_lines_path(@referential) do %>
+ <%= Referential.human_attribute_name("group_of_lines") %><span class="badge pull-right"><%= @referential.group_of_lines.size %></span>
+ <% end %>
+ </li>
+ <li><%= link_to referential_lines_path(@referential) do %>
+ <%= Referential.human_attribute_name("lines") %><span class="badge pull-right"><%= @referential.lines.size %></span>
+ <% end %>
+ </li>
+ <li><%= link_to referential_stop_areas_path(@referential) do %>
+ <%= Referential.human_attribute_name("stop_areas") %><span class="badge pull-right"><%= @referential.stop_areas.size %></span>
+ <% end %>
+ </li>
+ <li><%= link_to referential_connection_links_path(@referential) do %>
+ <%= Referential.human_attribute_name("connection_links") %><span class="badge pull-right"><%= @referential.connection_links.size %></span>
+ <% end %>
+ </li>
+ <li><%= link_to referential_time_tables_path(@referential) do %>
+ <%= Referential.human_attribute_name("time_tables") %><span class="badge pull-right"><%= @referential.time_tables.size %></span>
+ <% end %>
+ </li>
+ </ul>
+ </li>
+ <li><%= link_to Referential.human_attribute_name("import_tasks"), referential_import_tasks_path(@referential) %></li>
+ <li><%= link_to Referential.human_attribute_name("export_tasks"), referential_exports_path(@referential) %></li>
+ <li><%= link_to Referential.human_attribute_name("compliance_check_tasks"), referential_compliance_check_tasks_path(@referential) %></li>
+ <% end %>
+ </ul>
+ <ul class="nav navbar-nav navbar-right">
+ <li class="<%= language_class('fr') %>"><%= link_to_language :fr %></li>
+ <li class="<%= language_class('en') %>"><%= link_to_language :en %></li>
+ <li><%= link_to t('layouts.help'), help_path, :class =>("current" if help_page?), :target => "_blank" %></li>
+ <% if user_signed_in? %>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="gravatar"><%= user_gravatar_image_tag(current_user) %></span><%= current_user.name %> <b class="caret"></b></a>
+ <ul class="dropdown-menu">
+ <li><%= link_to t('layouts.user.profile'), edit_user_registration_path %></li>
+ <li><%= link_to t('layouts.user.sign_out'), destroy_user_session_path, :method => :delete %></li>
+ <li class="divider"></li>
+ <li><%= tab_link_to Organisation.model_name.human, organisation_path %></li>
+ </ul>
+ </li>
+ <% end %>
+ </ul>
+ </div><!-- /.navbar-collapse -->
+ </div><!-- /.container-fluid -->
+</nav>
diff --git a/app/views/stop_area_exports/index.xls.erb b/app/views/stop_area_exports/index.xls.erb
new file mode 100644
index 000000000..e48a97fe0
--- /dev/null
+++ b/app/views/stop_area_exports/index.xls.erb
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <Worksheet ss:Name="Sheet1">
+ <Table>
+ <Row>
+ <% @column_names.each do |column_name|%>
+ <Cell><Data ss:Type="String"><%= column_name %></Data></Cell>
+ <% end %>
+ </Row>
+ <% @stop_areas.each do |stop_area| %>
+ <Row>
+ <Cell><Data ss:Type="Number"><%= stop_area.id %></Data></Cell>
+ <Cell><Data ss:Type="String"><%= stop_area.name %></Data></Cell>
+ <Cell><Data ss:Type="Number"><%= stop_area.longitude %></Data></Cell>
+ <Cell><Data ss:Type="Number"><%= stop_area.latitude %></Data></Cell>
+ <Cell><Data ss:Type="String"><%= stop_area.area_type %></Data></Cell>
+ <Cell><Data ss:Type="Number"><%= stop_area.parent_id %></Data></Cell>
+ <Cell><Data ss:Type="String"><%= stop_area.comment %></Data></Cell>
+ <Cell><Data ss:Type="String"><%= stop_area.country_code %></Data></Cell>
+ <Cell><Data ss:Type="String"><%= stop_area.street_name %></Data></Cell>
+ <Cell><Data ss:Type="String"><%= stop_area.mobility_restricted_suitability %></Data></Cell>
+ <Cell><Data ss:Type="String"><%= stop_area.stairs_availability %></Data></Cell>
+ <Cell><Data ss:Type="String"><%= stop_area.lift_availability %></Data></Cell>
+ <Cell><Data ss:Type="String"><%= stop_area.int_user_needs %></Data></Cell>
+ </Row>
+ <% end %>
+ </Table>
+ </Worksheet>
+</Workbook>
diff --git a/app/views/stop_area_imports/new.html.erb b/app/views/stop_area_imports/new.html.erb
new file mode 100644
index 000000000..54ca1c57a
--- /dev/null
+++ b/app/views/stop_area_imports/new.html.erb
@@ -0,0 +1,24 @@
+<%= title_tag t('stop_area_imports.new.title') %>
+
+<div class="main_actions">
+ <div class="btn-group">
+ <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
+ <%= t('stop_area_imports.new.export_stop_areas') %><span class="caret"></span>
+ </button>
+ <ul class="dropdown-menu" role="menu">
+ <li><%= link_to image_tag("icons/file_csv.png") + " Csv" , referential_stop_area_exports_path(@referential, :format => :csv) %></li>
+ <li><%= link_to image_tag("icons/file_excel.png") + " Excel", referential_stop_area_exports_path(@referential, :format => :xls) %></li>
+ </ul>
+ </div>
+</div>
+
+<%= semantic_form_for [@referential, @stop_area_import] do |form| %>
+ <br>
+ <%= form.inputs do %>
+ <%= form.input :file, :as => :file, :input_html => { :title => "#{t('.tooltip.file')}", :'data-placement' => "right", :'data-toggle' => "tooltip", :'data-trigger' =>"hover" } %>
+ <% end %>
+ <%= form.actions do %>
+ <%= form.action :submit, :as => :button , :label => t( 'formtastic.import' ) %>
+ <%= form.action :cancel, :as => :link %>
+ <% end %>
+<% end %>
diff --git a/app/views/stop_areas/_form.html.erb b/app/views/stop_areas/_form.html.erb
index 24800159a..74bccc816 100644
--- a/app/views/stop_areas/_form.html.erb
+++ b/app/views/stop_areas/_form.html.erb
@@ -1,5 +1,5 @@
<div class="container-fluid">
- <div class="col-md-8">
+ <div class="col-md-7">
<%= semantic_form_for [@referential, @stop_area] do |form| %>
<%= form.inputs do %>
<%= form.input :id, :as => :hidden %>
@@ -35,7 +35,7 @@
<%= form.input :lift_availability,:as => :boolean %>
<% end %>
- <%= form.input :objectid, :required => !@stop_area.new_record?, :input_html => { :disabled => !@stop_area.new_record? } %>
+ <%= form.input :objectid, :required => !@stop_area.new_record? %>
<% end %>
<%= form.actions do %>
@@ -45,8 +45,9 @@
<% end %>
</div>
- <div class="col-md-4">
+ <div class="col-md-5">
<% if !manage_itl && @map %>
<%= @map.to_html %>
<% end %>
</div>
+</div>
diff --git a/app/views/stop_areas/index.html.erb b/app/views/stop_areas/index.html.erb
index 5519ea55e..1ff6f73d4 100644
--- a/app/views/stop_areas/index.html.erb
+++ b/app/views/stop_areas/index.html.erb
@@ -26,6 +26,9 @@
<ul class="actions">
<li><%= link_to t('stop_areas.actions.new'), new_referential_stop_area_path(@referential), :class => "add" %></li>
<li><%= link_to t('stop_areas.actions.default_geometry'), default_geometry_referential_stop_areas_path(@referential), :method => :put, :class => "calculator_edit" %></li>
+ <li>
+ <%= link_to t('stop_area_imports.new.title'), new_referential_stop_area_import_path( @referential ), :class => "import" %>
+ </li>
</ul>
<h4><%= t(".selection") %></h4>
diff --git a/app/views/stop_areas/show.html.erb b/app/views/stop_areas/show.html.erb
index 25510b10f..d812ff4e3 100644
--- a/app/views/stop_areas/show.html.erb
+++ b/app/views/stop_areas/show.html.erb
@@ -92,14 +92,11 @@
</div>
<p class="after_map" />
-<div class="genealogical">
+<div class="genealogical clearfix">
<%= render "stop_areas/genealogical" %>
</div>
-
-
<% if manage_access_points %>
- <p class="after_map" />
<div>
<h3><%= t('.access_points') %></h3>
diff --git a/app/views/time_tables/_date_fields.erb b/app/views/time_tables/_date_fields.erb
index 5d24456a3..8c6259f3f 100644
--- a/app/views/time_tables/_date_fields.erb
+++ b/app/views/time_tables/_date_fields.erb
@@ -1,4 +1,5 @@
-<%= f.inputs :class => 'dates nested-fields' do %>
+<%= f.inputs :class => 'dates nested-fields' do %>
<%= f.input :date, :as => :date_picker, :label => @time_table.human_attribute_name("date"), :wrapper_html => { :class => 'fl1' }%>
+ <%= f.input :in_out, :as => :hidden, :value => true %>
<%= link_to_remove_association t('actions.destroy'), f %>
<% end %>
diff --git a/app/views/time_tables/_dates.html.erb b/app/views/time_tables/_dates.html.erb
index 663efec58..c6af6ee8c 100644
--- a/app/views/time_tables/_dates.html.erb
+++ b/app/views/time_tables/_dates.html.erb
@@ -1,5 +1,5 @@
<ul class='dates'>
- <% @time_table.dates.each do |tmd| %>
+ <% @time_table.dates.where("in_out = true").to_a.each do |tmd| %>
<li class="<%= (tmd.position%2==0) ? 'odd' : 'even' %>"><%= l tmd.date %>
</li>
<% end %>
diff --git a/app/views/time_tables/_excluded_date_fields.erb b/app/views/time_tables/_excluded_date_fields.erb
new file mode 100644
index 000000000..3c73dc076
--- /dev/null
+++ b/app/views/time_tables/_excluded_date_fields.erb
@@ -0,0 +1,5 @@
+<%= f.inputs :class => 'dates1 nested-fields' do %>
+ <%= f.input :date, :as => :date_picker, :label => @time_table.human_attribute_name("date"), :wrapper_html => { :class => 'fl1' }%>
+ <%= f.input :in_out, :as => :hidden, :value => false %>
+ <%= link_to_remove_association t('actions.destroy'), f %>
+<% end %>
diff --git a/app/views/time_tables/_excluded_dates.html.erb b/app/views/time_tables/_excluded_dates.html.erb
new file mode 100644
index 000000000..8097c618f
--- /dev/null
+++ b/app/views/time_tables/_excluded_dates.html.erb
@@ -0,0 +1,7 @@
+ <ul class='dates'>
+ <% @time_table.dates.where("in_out = false").to_a.each do |tmd| %>
+ <li class="<%= (tmd.position%2==0) ? 'odd' : 'even' %>"><%= l tmd.date %>
+ </li>
+ <% end %>
+ </ul>
+
diff --git a/app/views/time_tables/_form.erb b/app/views/time_tables/_form.erb
index 9970577d6..7933b2f7c 100644
--- a/app/views/time_tables/_form.erb
+++ b/app/views/time_tables/_form.erb
@@ -4,17 +4,12 @@
<%= form.input :version %>
<% end %>
<%= form.inputs :class => 'day_type' do %>
- <label class="day_type_label"><%= @time_table.human_attribute_name("day_types") %></label>
- <%= form.input :monday, :as => :boolean, :class => "others" %>
- <%= form.input :tuesday, :as => :boolean %>
- <%= form.input :wednesday, :as => :boolean %>
- <%= form.input :thursday, :as => :boolean %>
- <%= form.input :friday, :as => :boolean %>
- <%= form.input :saturday, :as => :boolean %>
- <%= form.input :sunday, :as => :boolean %>
+ <label class="day_type_label"><%= @time_table.human_attribute_name("peculiarities") %></label>
+ <%= form.input :school_holliday, :as => :boolean, :class => "others" %>
+ <%= form.input :public_holliday, :as => :boolean %>
<% end %>
<%= form.inputs do %>
- <%= form.input :objectid, :required => !@time_table.new_record?, :input_html => { :disabled => !@time_table.new_record? } %>
+ <%= form.input :objectid, :required => !@time_table.new_record? %>
<% end %>
<h3 class="time_table_periods">
@@ -25,6 +20,16 @@
</h3>
<div class="periods content" id="periods_content">
+ <%= form.inputs :class => 'day_type' do %>
+ <label class="day_type_label"><%= @time_table.human_attribute_name("day_types") %></label>
+ <%= form.input :monday, :as => :boolean, :class => "others" %>
+ <%= form.input :tuesday, :as => :boolean %>
+ <%= form.input :wednesday, :as => :boolean %>
+ <%= form.input :thursday, :as => :boolean %>
+ <%= form.input :friday, :as => :boolean %>
+ <%= form.input :saturday, :as => :boolean %>
+ <%= form.input :sunday, :as => :boolean %>
+ <% end %>
<div id="periods">
<%= form.semantic_fields_for :periods do |p| %>
<%= render "period_fields", :f => p %>
@@ -44,14 +49,34 @@
<div class="dates content" id="dates_content">
<div id="dates">
- <%= form.semantic_fields_for :dates do |p| %>
- <%= render "date_fields", :f => p %>
+ <%= form.semantic_fields_for :dates, @time_table.dates.where("in_out = true").to_a do |p| %>
+ <%= render "date_fields", :f => p %>
<% end %>
</div>
<%= link_to_add_association t("time_tables.actions.add_date"), form, :dates ,
:"data-association-insertion-method" => "append",
+ :"partial" => "date_fields",
:"data-association-insertion-node" => "div#dates" %>
</div>
+
+ <h3 class="time_table_dates">
+ <a class="excluded_dates"><%= @time_table.human_attribute_name("excluded_dates") %>
+ <%= image_tag("icons/plus.png" , :class => "switcher", :style => "display: none;") %>
+ <%= image_tag("icons/minus.png" , :class => "switcher" ) %>
+ </a>
+ </h3>
+
+ <div class="excluded_dates content" id="dates_content">
+ <div id="excluded">
+ <%= form.semantic_fields_for :dates, @time_table.dates.where("in_out = false").to_a do |p| %>
+ <%= render "excluded_date_fields", :f => p %>
+ <% end %>
+ </div>
+ <%= link_to_add_association t("time_tables.actions.add_excluded_date"), form, :dates ,
+ :"data-association-insertion-method" => "append",
+ :"partial" => "excluded_date_fields",
+ :"data-association-insertion-node" => "div#excluded" %>
+ </div>
<p/>
<%= form.actions do %>
diff --git a/app/views/time_tables/_periods.html.erb b/app/views/time_tables/_periods.html.erb
index 1f0aea057..41bf9db2d 100644
--- a/app/views/time_tables/_periods.html.erb
+++ b/app/views/time_tables/_periods.html.erb
@@ -1,4 +1,39 @@
<ul class='periods'>
+ <p>
+ <label><%= @time_table.human_attribute_name("day_types") %>:&nbsp;&nbsp;</label>
+ <% if @time_table.int_day_types & 508 == 0 %>
+ <label><%= @time_table.human_attribute_name("none") %></label>
+ <% else %>
+ <% if @time_table.monday %>
+ <span class='day_type'>&nbsp;<%= @time_table.human_attribute_name("monday") %>&nbsp;</span>
+ <% end %>
+
+ <% if @time_table.tuesday %>
+ <span class='day_type'>&nbsp;<%= @time_table.human_attribute_name("tuesday") %>&nbsp;</span>
+ <% end %>
+
+ <% if @time_table.wednesday %>
+ <span class='day_type'>&nbsp;<%= @time_table.human_attribute_name("wednesday") %>&nbsp;</span>
+ <% end %>
+
+ <% if @time_table.thursday %>
+ <span class='day_type'>&nbsp;<%= @time_table.human_attribute_name("thursday") %>&nbsp;</span>
+ <% end %>
+
+ <% if @time_table.friday %>
+ <span class='day_type'>&nbsp;<%= @time_table.human_attribute_name("friday") %>&nbsp;</span>
+ <% end %>
+
+ <% if @time_table.saturday %>
+ <span class='day_type'>&nbsp;<%= @time_table.human_attribute_name("saturday") %>&nbsp;</span>
+ <% end %>
+
+ <% if @time_table.sunday %>
+ <span class='day_type'>&nbsp;<%= @time_table.human_attribute_name("sunday") %>&nbsp;</span>
+ <% end %>
+ <% end %>
+
+ </p>
<% @time_table.periods.each do |tmp| %>
<li class='period'><%= t('time_tables.show.from')%> <%= l tmp.period_start %> <%= t('time_tables.show.to')%> <%= l tmp.period_end %>
</li>
diff --git a/app/views/time_tables/show.html.erb b/app/views/time_tables/show.html.erb
index c23ed912c..0997c9d06 100644
--- a/app/views/time_tables/show.html.erb
+++ b/app/views/time_tables/show.html.erb
@@ -2,7 +2,7 @@
<%= title_tag t('time_tables.show.title', :time_table => @time_table.comment )%>
<div class="time_table_show">
-
+
<div class="resume">
<div class="validity <%= time_table_state_code(@time_table) %>"></div>
<label>
@@ -24,39 +24,20 @@
<%= @time_table.version %>
</p>
<p>
- <label><%= @time_table.human_attribute_name("day_types") %>:&nbsp;&nbsp;</label>
- <% if @time_table.int_day_types == 0 %>
+ <label><%= @time_table.human_attribute_name("peculiarities") %>:&nbsp;&nbsp;</label>
+ <% if @time_table.int_day_types & 1536 == 0 %>
<label><%= @time_table.human_attribute_name("none") %></label>
- <% else %>
- <% if @time_table.monday %>
- <span class='day_type'>&nbsp;<%= @time_table.human_attribute_name("monday") %>&nbsp;</span>
- <% end %>
-
- <% if @time_table.tuesday %>
- <span class='day_type'>&nbsp;<%= @time_table.human_attribute_name("tuesday") %>&nbsp;</span>
- <% end %>
-
- <% if @time_table.wednesday %>
- <span class='day_type'>&nbsp;<%= @time_table.human_attribute_name("wednesday") %>&nbsp;</span>
- <% end %>
-
- <% if @time_table.thursday %>
- <span class='day_type'>&nbsp;<%= @time_table.human_attribute_name("thursday") %>&nbsp;</span>
- <% end %>
-
- <% if @time_table.friday %>
- <span class='day_type'>&nbsp;<%= @time_table.human_attribute_name("friday") %>&nbsp;</span>
- <% end %>
-
- <% if @time_table.saturday %>
- <span class='day_type'>&nbsp;<%= @time_table.human_attribute_name("saturday") %>&nbsp;</span>
- <% end %>
-
- <% if @time_table.sunday %>
- <span class='day_type'>&nbsp;<%= @time_table.human_attribute_name("sunday") %>&nbsp;</span>
- <% end %>
- <% end %>
-
+ <% else %>
+ <% if @time_table.school_holliday %>
+ <span class='day_type'>&nbsp;<%= @time_table.human_attribute_name("school_holliday") %>&nbsp;</span>
+ <% end %>
+
+ <% if @time_table.public_holliday %>
+ <span class='day_type'>&nbsp;<%= @time_table.human_attribute_name("public_holliday") %>&nbsp;</span>
+ <% end %>
+
+ <% end %>
+
</p>
<p>
<label><%= @time_table.human_attribute_name("objectid") %>: </label>
@@ -68,31 +49,33 @@
<%= image_tag("icons/plus.png" , :class => "switcher", :style => "display: none;") %>
<%= image_tag("icons/minus.png" , :class => "switcher" ) %>
</a>
-
+
</h3>
<div class="calendars content">
<div class="year_choice">
- <span class="previous"> <%= link_to("<", referential_time_table_path(@referential, @time_table, :year => (@year - 1)) ) %> </span>
- <span class="year"> <%= "#{@year}" %> </span>
+ <span class="previous"> <%= link_to("<", referential_time_table_path(@referential, @time_table, :year => (@year - 1)) ) %> </span>
+ <span class="year"> <%= "#{@year}" %> </span>
<span class="next"> <%= link_to(">", referential_time_table_path(@referential, @time_table, :year => (@year + 1)) ) %> </span>
</div>
<div class="calendar_helper">
<%= cal = ""
(1..12).each do |month|
cal << calendar(:year => @year, :month => month, :first_day_of_week => 1) do |d|
- if @time_table.include_in_dates?(d)
- [link_to(d.mday, edit_referential_time_table_path(@referential, @time_table) ), {:class => "selected_date"}]
- elsif @time_table.include_in_periods?(d)
- [link_to(d.mday, edit_referential_time_table_path(@referential, @time_table) ), {:class => "selected_period"}]
+ if @time_table.excluded_date?(d)
+ [link_to(d.mday, edit_referential_time_table_path(@referential, @time_table) ), {:class => "excluded_date"}]
elsif @time_table.include_in_overlap_dates?(d)
- [link_to(d.mday, edit_referential_time_table_path(@referential, @time_table) ), {:class => "overlap_date"}]
+ [link_to(d.mday, edit_referential_time_table_path(@referential, @time_table) ), {:class => "overlap_date"}]
+ elsif @time_table.include_in_dates?(d)
+ [link_to(d.mday, edit_referential_time_table_path(@referential, @time_table) ), {:class => "selected_date"}]
+ elsif @time_table.include_in_periods?(d)
+ [link_to(d.mday, edit_referential_time_table_path(@referential, @time_table) ), {:class => "selected_period"}]
end
end
end
cal.html_safe
%>
- </div>
- </div>
+ </div>
+ </div>
</div>
@@ -101,7 +84,7 @@
<%= image_tag("icons/plus.png" , :class => "switcher", :style => "display: none;") %>
<%= image_tag("icons/minus.png" , :class => "switcher" ) %>
</a>
-
+
</h3>
<div class="periods content">
<%= render "periods" %>
@@ -117,7 +100,18 @@
<div class="dates content">
<%= render "dates" %>
</div>
-
+
+ <h3 class="time_table_dates">
+ <a class="excluded_dates"><%= @time_table.human_attribute_name("excluded_dates") %>
+ <%= image_tag("icons/plus.png" , :class => "switcher", :style => "display: none;") %>
+ <%= image_tag("icons/minus.png" , :class => "switcher" ) %>
+ </a>
+ </h3>
+
+ <div class="excluded_dates content">
+ <%= render "excluded_dates" %>
+ </div>
+
</div>
<% content_for :sidebar do %>
diff --git a/app/views/vehicle_journey_exports/index.xls.erb b/app/views/vehicle_journey_exports/index.xls.erb
new file mode 100644
index 000000000..b6fea2b73
--- /dev/null
+++ b/app/views/vehicle_journey_exports/index.xls.erb
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <Worksheet ss:Name="Sheet1">
+ <Table>
+ <Row>
+ <% @column_names.each do |column_name| %>
+ <Cell><Data ss:Type="String"><%= column_name %></Data></Cell>
+ <% end %>
+ </Row>
+ <% vehicle_journey_at_stops_matrix = (@vehicle_journeys.collect{ |vj| vj.vehicle_journey_at_stops.collect(&:departure_time).collect{|time| time.strftime("%H:%M")} }).transpose %>
+ <% @route.stop_points.each_with_index do |stop_point, index| %>
+ <Row>
+ <Cell><Data ss:Type="Number"><%= stop_point.id %></Data></Cell>
+ <Cell><Data ss:Type="String"><%= stop_point.stop_area.name %></Data></Cell>
+ <% vehicle_journey_at_stops_matrix[index].each do |vehicle_journey_at_stop| %>
+ <Cell><Data ss:Type="String"><%= vehicle_journey_at_stop %></Data></Cell>
+ <% end %>
+ </Row>
+ <% end %>
+ </Table>
+ </Worksheet>
+</Workbook>
diff --git a/app/views/vehicle_journey_imports/new.html.erb b/app/views/vehicle_journey_imports/new.html.erb
index a1078c88d..65bfd6b17 100644
--- a/app/views/vehicle_journey_imports/new.html.erb
+++ b/app/views/vehicle_journey_imports/new.html.erb
@@ -1,24 +1,20 @@
<%= title_tag t('vehicle_journey_imports.new.title') %>
-<p class="export"><%= t('vehicle_journey_imports.new.export_vehicle_journeys') %>
- <span class="file"><%= link_to image_tag("icons/file_csv.png"), referential_line_route_vehicle_journey_exports_path(@referential, @line, @route, :format => :csv) %></span>
- <span class="file"><%= link_to image_tag("icons/file_excel.png"), referential_line_route_vehicle_journey_exports_path(@referential, @line, @route, :format => :xls) %></span>
-</p>
+<div class="main_actions">
+ <div class="btn-group">
+ <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
+ <%= t('vehicle_journey_imports.new.export_vehicle_journeys') %><span class="caret"></span>
+ </button>
+ <ul class="dropdown-menu" role="menu">
+ <li><%= link_to image_tag("icons/file_csv.png") + " Csv" , referential_line_route_vehicle_journey_exports_path(@referential, @line, @route, :format => :csv) %></li>
+ <li><%= link_to image_tag("icons/file_excel.png") + " Excel", referential_line_route_vehicle_journey_exports_path(@referential, @line, @route, :format => :xls) %></li>
+ </ul>
+ </div>
+</div>
<%= semantic_form_for [@referential, @line, @route, @vehicle_journey_import] do |form| %>
- <% if @vehicle_journey_import.errors.any? %>
- <div id="error_explanation">
- <h2><%= pluralize(@vehicle_journey_import.errors.count, "error") %> prohibited this import from completing:</h2>
- <ul>
- <% @vehicle_journey_import.errors.full_messages.each do |msg| %>
- <li><%= msg %></li>
- <% end %>
- </ul>
- </div>
- <% end %>
- <br>
<%= form.inputs do %>
- <%= form.input :file, :as => :file %>
+ <%= form.input :file, :as => :file, :input_html => { :title => "#{t('.tooltip.file')}", :'data-placement' => "right", :'data-toggle' => "tooltip", :'data-trigger' =>"hover" } %>
<% end %>
<%= form.actions do %>
<%= form.action :submit, :as => :button , :label => t( 'formtastic.import' ) %>
diff --git a/app/views/vehicle_journeys/_form.html.erb b/app/views/vehicle_journeys/_form.html.erb
index ef92ef114..859a9027a 100644
--- a/app/views/vehicle_journeys/_form.html.erb
+++ b/app/views/vehicle_journeys/_form.html.erb
@@ -10,48 +10,40 @@
<%= form.input :status_value %>
<%= form.input :facility %>
<%= form.input :vehicle_type_identifier%>
- <%= form.input :objectid, :required => !@vehicle_journey.new_record?, :input_html => { :disabled => !@vehicle_journey.new_record? } %>
+ <%= form.input :objectid, :required => !@vehicle_journey.new_record? %>
- <%= form.inputs :class => "stop_times", :name => @vehicle_journey.human_attribute_name(:vehicle_journey_at_stop_ids) do %>
- <table border="0" class="vehicle_journey_at_stops">
- <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>
- <!--
- <= form.semantic_fields_for :vehicle_journey_at_stops do |vjas| >
- <= vjas.object.stop_point.stop_area.name >
- <= vjas.input :_destroy, :as => :hidden >
- <= vjas.input :departure_time, :as => :time >
-
- < end >
- -->
- <tbody class="journey_pattern_dependent_list">
+ <%= form.inputs :class => "stop_times", :name => @vehicle_journey.human_attribute_name(:vehicle_journey_at_stop_ids) do %>
+ <table border="0" class="vehicle_journey_at_stops">
+ <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 %>
- </tbody>
- </table>
- <% end %>
+ :collection => @vehicle_journey.vehicle_journey_at_stops, :as => :vehicle_journey_at_stop %>
+ </tbody>
+ </table>
+ <% end %>
<%= form.input :time_table_tokens, :label => t('.time_tables'), :as => :text, :input_html => { :"data-pre" => ( @vehicle_journey.time_tables.map { |time_table| { :id => time_table.id, :name => time_table.comment } } ).to_json } %>
-
+
<% end %>
- <%= form.actions do %>
- <%= form.action :submit, :as => :button %>
- <%= form.action :cancel, :as => :link %>
- <% end %>
+ <%= form.actions do %>
+ <%= form.action :submit, :as => :button %>
+ <%= 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 %>
diff --git a/app/views/vehicle_journeys/_vehicle_journey_at_stop_fields.html.erb b/app/views/vehicle_journeys/_vehicle_journey_at_stop_fields.html.erb
index 65a017f24..150ecde4b 100644
--- a/app/views/vehicle_journeys/_vehicle_journey_at_stop_fields.html.erb
+++ b/app/views/vehicle_journeys/_vehicle_journey_at_stop_fields.html.erb
@@ -4,21 +4,21 @@
<%= select_hour(vjas.arrival_time ? vjas.arrival_time.hour : 0, { :prefix => "vehicle_journey", :field_name => "vehicle_journey_at_stops_attributes[#{vehicle_journey_at_stop_counter}][arrival_time(4i)]"}, :class => "hour") %>
<%= select_minute(vjas.arrival_time ? vjas.arrival_time.min : 0, { :prefix => "vehicle_journey", :field_name => "vehicle_journey_at_stops_attributes[#{vehicle_journey_at_stop_counter}][arrival_time(5i)]"}, :class => "minute") %>
</td>
- <td>
- <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][id]" %> type="hidden" value="<%= vjas.id %>">
- <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][_destroy]" %> type="hidden" value="<%= vjas._destroy ? "1" : "0" %>">
- <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][stop_point_id]" %> type="hidden" value="<%= vjas.stop_point_id %>">
- <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][departure_time(3i)]" %> type="hidden" value="1">
- <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][departure_time(2i)]" %> type="hidden" value="1">
- <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][departure_time(1i)]" %> type="hidden" value="2000">
- <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][arrival_time(3i)]" %> type="hidden" value="1">
- <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][arrival_time(2i)]" %> type="hidden" value="1">
- <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][arrival_time(1i)]" %> type="hidden" value="2000">
- <label for=<%= "vehicle_journey_vehicle_journey_at_stops_attributes_#{vehicle_journey_at_stop_counter}_departure_time_5i" %>><%= vjas.stop_point.stop_area.name %></label>
+ <td>
+ <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][id]" %> type="hidden" value="<%= vjas.id %>">
+ <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][_destroy]" %> type="hidden" value="<%= vjas._destroy ? "1" : "0" %>">
+ <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][stop_point_id]" %> type="hidden" value="<%= vjas.stop_point_id %>">
+ <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][departure_time(3i)]" %> type="hidden" value="1">
+ <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][departure_time(2i)]" %> type="hidden" value="1">
+ <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][departure_time(1i)]" %> type="hidden" value="2000">
+ <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][arrival_time(3i)]" %> type="hidden" value="1">
+ <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][arrival_time(2i)]" %> type="hidden" value="1">
+ <input name=<%= "vehicle_journey[vehicle_journey_at_stops_attributes][#{vehicle_journey_at_stop_counter}][arrival_time(1i)]" %> type="hidden" value="2000">
+ <label for=<%= "vehicle_journey_vehicle_journey_at_stops_attributes_#{vehicle_journey_at_stop_counter}_departure_time_5i" %>><%= vjas.stop_point.stop_area.name %></label>
</td>
<td class="departure_time <%= vjas.departure_time.nil? ? "missing" : "" %> <%= vjas.errors[:departure_time].blank? ? "" : "invalid_position" %>">
<%= select_hour(vjas.departure_time ? vjas.departure_time.hour : 0, { :prefix => "vehicle_journey", :field_name => "vehicle_journey_at_stops_attributes[#{vehicle_journey_at_stop_counter}][departure_time(4i)]"}, :class => "hour") %>
<%= select_minute(vjas.departure_time ? vjas.departure_time.min : 0, { :prefix => "vehicle_journey", :field_name => "vehicle_journey_at_stops_attributes[#{vehicle_journey_at_stop_counter}][departure_time(5i)]"}, :class => "minute") %>
- </td>
+ </td>
</tr>
diff --git a/app/views/vehicle_journeys/edit.html.erb b/app/views/vehicle_journeys/edit.html.erb
index fcb0c2bd9..dba18248e 100644
--- a/app/views/vehicle_journeys/edit.html.erb
+++ b/app/views/vehicle_journeys/edit.html.erb
@@ -10,8 +10,8 @@
<label><%= @vehicle_journey.human_attribute_name(:route) %>: </label>
<%= link_to @route.name, [@referential, @line, @route] %>
</p>
- <div>
-<div>
+ </div>
+</div>
<%= render "form" %>
diff --git a/app/views/vehicle_journeys/index.html.erb b/app/views/vehicle_journeys/index.html.erb
index d32c9f02f..651aea739 100644
--- a/app/views/vehicle_journeys/index.html.erb
+++ b/app/views/vehicle_journeys/index.html.erb
@@ -1,18 +1,9 @@
-<%= title_tag t('vehicle_journeys.index.title', :route => @route.name ) %>
+<ol class="breadcrumb">
+ <li><%= link_to line_formatted_name( @line), [@referential, @line] %></li>
+ <li><%= link_to @route.name, [@referential, @line, @route] %></li>
+</ol>
-<div class="vehicle_journey_index">
- <div class="summary">
- <p>
- <label><%= @route.human_attribute_name(:line) %>: </label>
- <%= link_to line_formatted_name( @line), [@referential, @line] %>
- </p>
- <p>
- <label><%= Chouette::Route.model_name.human %>: </label>
- <%= link_to @route.name, [@referential, @line, @route] %>
- </p>
- </div>
-</div>
-<h3 class="vehicle_journeys"><%= t('.vehicle_journeys') %></h3>
+<%= title_tag t('vehicle_journeys.index.title', :route => @route.name ) %>
<div class="page_info">
<span class="search"> <%= t("will_paginate.page_entries_info.search") %></span> <%= page_entries_info @vehicle_journeys %>
</div>
@@ -20,7 +11,7 @@
<%= will_paginate @vehicle_journeys, :container => false, renderer: BootstrapPagination::Rails %>
</div>
<div class="vehicle_journeys paginated_content">
- <table class="table table-hover">
+ <table class="table table-hover table-striped">
<thead>
<tr>
<th class="title"><%= Chouette::JourneyPattern.model_name.human.pluralize %> :</th>
diff --git a/config/deploy/production.rb b/config/deploy/production.rb
index d342580f4..872dfbf1a 100644
--- a/config/deploy/production.rb
+++ b/config/deploy/production.rb
@@ -1,2 +1,2 @@
server "chouette.cityway.fr", :app, :web, :db, :primary => true
-set :branch, "V2_1_0"
+set :branch, "V2_4"
diff --git a/config/deploy/staging.rb b/config/deploy/staging.rb
index a4519644b..3a288164b 100644
--- a/config/deploy/staging.rb
+++ b/config/deploy/staging.rb
@@ -3,4 +3,4 @@ set :deploy_via, :copy
set :copy_cache, true
set :copy_via, :scp
set :copy_exclude, ".git/*"
-set :branch, "V2_3_0"
+set :branch, "V2_4"
diff --git a/config/environment.rb b/config/environment.rb
index 5353fe344..299eb7b07 100644
--- a/config/environment.rb
+++ b/config/environment.rb
@@ -6,4 +6,4 @@ require File.expand_path('../application', __FILE__)
ChouetteIhm::Application.initialize!
# Fix version
-APP_VERSION = '2.4.0'
+APP_VERSION = '2.4.1'
diff --git a/config/environments/development.rb b/config/environments/development.rb
index d93762ad7..f06db3fde 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -7,6 +7,9 @@ ChouetteIhm::Application.configure do
# since you don't have to restart the web server when you make code changes.
config.cache_classes = false
+ # Do not eager load code on boot.
+ config.eager_load = false
+
# Log error messages when you accidentally call methods on nil.
config.whiny_nils = true
@@ -34,10 +37,21 @@ ChouetteIhm::Application.configure do
# uncomment to show chouette error view in development
#config.consider_all_requests_local = false
- # config.active_record.auto_explain_threshold_in_seconds = (RUBY_PLATFORM == "java" ? nil : 0.5)
+ config.active_record.auto_explain_threshold_in_seconds = (RUBY_PLATFORM == "java" ? nil : 0.5)
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
+ # replace this with your production tracker code
+ GA.tracker = "UA-AAAAAAAA"
+
+ # api key to geoportail IGN (production key link to application url root referer)
+ config.geoportail_api_key = "aaaaaaaaaaaaaa"
+
+ # Specific for each company
+ config.company_name = "afimb"
+ config.company_theme = "#61970b"
+ config.company_contact = "http://www.chouette.mobi/contact-support/"
+
# file to data for demo
config.demo_data = "tmp/demo.zip"
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 31148daf4..c0dcc1933 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -1,8 +1,5 @@
ChouetteIhm::Application.configure do
# Settings specified here will take precedence over those in config/application.rb
- #
- # replace this with your production tracker code
- GA.tracker = "UA-AAAAAAAA"
# Code is not reloaded between requests
config.cache_classes = true
@@ -23,6 +20,19 @@ ChouetteIhm::Application.configure do
# Generate digests for assets URLs
config.assets.digest = true
+ # Defaults to Rails.root.join("public/assets")
+ # config.assets.manifest = YOUR_PATH
+
+ # Specifies the header that your server uses for sending files
+ # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
+ # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
+
+ # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
+ # config.force_ssl = true
+
+ # See everything in the log (default is :info)
+ #config.log_level = :info
+
# Use a different logger for distributed setups
#if ENV['OS'] == 'Windows_NT'
# # args = log_path,number of files,file sizes
@@ -34,8 +44,21 @@ ChouetteIhm::Application.configure do
end
#end
- # api key to geoportail IGN (production key link to application url root referer)
- config.geoportail_api_key = "aaaaaaaaaaaaaa"
+ # Use a different cache store in production
+ # config.cache_store = :mem_cache_store
+
+ # Enable serving of images, stylesheets, and JavaScripts from an asset server
+ # config.action_controller.asset_host = "chouette2"
+
+ # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
+ # config.assets.precompile += %w( search.js )
+
+ # Disable delivery errors, bad email addresses will be ignored
+ # config.action_mailer.raise_delivery_errors = false
+
+ # Enable threaded mode
+ # NOTICE : With Rails 3.2, Delayed::JRubyWorker blocks the application without threaded mode
+ # config.threadsafe!
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
# the I18n.default_locale when a translation can not be found)
@@ -44,10 +67,19 @@ ChouetteIhm::Application.configure do
# Send deprecation notices to registered listeners
config.active_support.deprecation = :notify
- config.action_mailer.default_url_options = { :host => 'my-domain-name.com' }
+ if ENV['CHOUETTE_BASE_URL'].nil?
+ config.action_mailer.default_url_options = { :host => 'my-domain-name.com' }
+ else
+ config.action_mailer.default_url_options = { :host => ENV['CHOUETTE_BASE_URL'] }
+ end
+
# Configure the e-mail address which will be shown in Devise::Maile
- config.mailer_sender = "chouette-production@my-domain-name.com"
+ if ENV['CHOUETTE_MAIL_SENDER'].nil?
+ config.mailer_sender = "chouette-production@my-domain-name.com"
+ else
+ config.mailer_sender = ENV['CHOUETTE_MAIL_SENDER']
+ end
# mailer configuration :
# by default : set to smtp on windows platforms and sendmail on unix one
@@ -61,14 +93,52 @@ ChouetteIhm::Application.configure do
# :user_name => "username",
# }
#else
- ActionMailer::Base.smtp_settings = {
- :address => "smtp.samle.com",
- :domain => "sample.com"
- }
+ mailer = ""
+ if ENV['CHOUETTE_MAILER'].nil?
+ mailer = "smtp"
+ else
+ mailer = ENV['CHOUETTE_MAILER']
+ end
+ if mailer == "smtp"
+ if ENV['CHOUETTE_SMTP_USER'].nil?
+ ActionMailer::Base.smtp_settings = {
+ :address => ENV['CHOUETTE_SMTP_ADDRESS'].nil? ? "smtp.sample.com" : ENV['CHOUETTE_SMTP_ADDRESS'],
+ :port => ENV['CHOUETTE_SMTP_PORT'].nil? ? 25 : ENV['CHOUETTE_SMTP_PORT'].to_i,
+ :domain => ENV['CHOUETTE_SMTP_DOMAIN'].nil? ? "sample.com" : ENV['CHOUETTE_SMTP_DOMAIN'] }
+ else
+ ActionMailer::Base.smtp_settings = {
+ :address => ENV['CHOUETTE_SMTP_ADDRESS'],
+ :port => ENV['CHOUETTE_SMTP_PORT'].nil? ? 25 : ENV['CHOUETTE_SMTP_PORT'].to_i,
+ :domain => ENV['CHOUETTE_SMTP_DOMAIN'],
+ :user_name => ENV['CHOUETTE_SMTP_USER'],
+ :password => ENV['CHOUETTE_SMTP_PASSWORD'],
+ :authentication => ENV['CHOUETTE_SMTP_AUTH'] }
+ end
+ end
#end
+ # replace this with your production tracker code
+ # replace this with your production tracker code
+ if ENV['CHOUETTE_GOOGLE_ANALYTICS'].nil?
+ GA.tracker = "UA-AAAAAAAA"
+ else
+ GA.tracker = ENV['CHOUETTE_GOOGLE_ANALYTICS']
+ end
+
+ # api key to geoportail IGN (production key link to application url root referer)
+ if ENV['CHOUETTE_GEOPORTAIL_KEY'].nil?
+ config.geoportail_api_key = "aaaaaaaaaaaaaa"
+ else
+ config.geoportail_api_key = ENV['CHOUETTE_GEOPORTAIL_KEY']
+ end
+
+ # Specific for each company
+ config.company_name = "afimb"
+ config.company_theme = "#61970b"
+ config.company_contact = "http://www.chouette.mobi/contact-support/"
+
# file to data for demo
- config.demo_data = "/path/to/demo.zip"
+ config.demo_data = ENV['CHOUETTE_DEMO_DATA'].nil? ? "/path/to/demo.zip" : ENV['CHOUETTE_DEMO_DATA']
# link to validation specification pages
config.validation_spec = "http://www.chouette.mobi/neptune-validation/v20/"
@@ -76,7 +146,7 @@ ChouetteIhm::Application.configure do
# paths for external resources
config.to_prepare do
Devise::Mailer.layout "mailer"
- Chouette::Command.command = "/usr/local/opt/chouette-command/chouette-cmd_2.4.0/chouette"
+ Chouette::Command.command = ENV['CHOUETTE_GUI_COMMAND'].nil? ? "/usr/local/opt/chouette-command/chouette-cmd_2.4.1/chouette" : ENV['CHOUETTE_GUI_COMMAND']
ImportTask.root = "/var/lib/chouette/imports"
Export.root = "/var/lib/chouette/exports"
end
diff --git a/config/environments/test.rb b/config/environments/test.rb
index fdfe9f527..d5a5fe5e8 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -44,6 +44,20 @@ ChouetteIhm::Application.configure do
# Print deprecation notices to the stderr
config.active_support.deprecation = :stderr
+ # replace this with your production tracker code
+ GA.tracker = "UA-AAAAAAAA"
+
+ # api key to geoportail IGN (production key link to application url root referer)
+ config.geoportail_api_key = "aaaaaaaaaaaaaa"
+
+ # Specific for each company
+ config.company_name = "afimb"
+ config.company_theme = "#61970b"
+ config.company_contact = "http://www.chouette.mobi/contact-support/"
+
+ # file to data for demo
+ config.demo_data = "tmp/demo.zip"
+
# link to validation specification pages
config.validation_spec = "http://www.chouette.mobi/neptune-validation/v20/"
diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb
index 37e7c1d1f..ef5c89fbf 100644
--- a/config/initializers/devise.rb
+++ b/config/initializers/devise.rb
@@ -243,24 +243,24 @@ Devise.setup do |config|
# end
end
-class Devise::FailureApp
- def return_to_root_path?
- root_path == session["#{scope}_return_to"]
- end
- def redirect
- store_location!
- if flash[:timedout] && flash[:alert]
- flash.keep(:timedout)
- flash.keep(:alert)
- else
- Rails.logger.debug "A" * 30
- Rails.logger.debug i18n_message
- Rails.logger.debug redirect_url
- Rails.logger.debug scope
- Rails.logger.debug root_path
- Rails.logger.debug session["#{scope}_return_to"]
- flash[:alert] = i18n_message unless return_to_root_path?
- end
- redirect_to redirect_url
- end
-end
+# class Devise::FailureApp
+# def return_to_root_path?
+# root_path == session["#{scope}_return_to"]
+# end
+# def redirect
+# store_location!
+# if flash[:timedout] && flash[:alert]
+# flash.keep(:timedout)
+# flash.keep(:alert)
+# else
+# Rails.logger.debug "A" * 30
+# Rails.logger.debug i18n_message
+# Rails.logger.debug redirect_url
+# Rails.logger.debug scope
+# Rails.logger.debug root_path
+# Rails.logger.debug session["#{scope}_return_to"]
+# flash[:alert] = i18n_message unless return_to_root_path?
+# end
+# redirect_to redirect_url
+# end
+# end
diff --git a/config/locales/compliance_check_results.yml b/config/locales/compliance_check_results.yml
index e12bfd235..cc6196e52 100644
--- a/config/locales/compliance_check_results.yml
+++ b/config/locales/compliance_check_results.yml
@@ -47,7 +47,7 @@ en:
detail_2_neptune_accesslink_2: "Sur la liaison d'accès %{objectId}, les références startOfLink = %{startOfLink} et endOfLink = %{endOfLink} sont de même type : %{type}"
detail_2_neptune_line_1: "La ligne %{objectId} référence un réseau (ptNetworkIdShortcut = %{ptNetworkIdShortcut} inexistant"
detail_2_neptune_line_2: "La ligne %{objectId} référence un point d'arrêt <StopPoint> (lineEnd = %{lineEnd}) inexistant "
- detail_2_neptune_line_3: "La ligne %{objectId} référence référence un point d'arrêt (lineEnd = %{lineEnd}) qui n'est pas terminus d'une séquence d'arrêts"
+ detail_2_neptune_line_3: "La ligne %{objectId} référence un point d'arrêt (lineEnd = %{lineEnd}) qui n'est pas terminus d'une séquence d'arrêts"
detail_2_neptune_line_4: "La ligne %{objectId} référence une séquence d'arrêt (routeId = %{routeId}) inexistante"
detail_2_neptune_line_5: "La séquence d'arrêts (routeId = %{routeId}) n'est pas référencée par la ligne %{objectId}"
detail_2_neptune_route_1: "La séquence d'arrêts %{objectId} référence une mission (journeyPatternId = %{journeyPatternId}) inexistante"
@@ -56,7 +56,7 @@ en:
detail_2_neptune_route_4: "Le tronçon (ptLinkId = %{ptLinkId}) référencé par la séquence d'arrêt %{objectId} est partagé avec %{routeId}"
detail_2_neptune_route_5: "Le tronçon %{objectId} partage un %{link} : %{target} avec un autre tronçon"
detail_2_neptune_route_6_1: "La séquence d'arrêts %{objectId} n'est pas une séquence linéaire, le chainage des tronçons forme un anneau"
- detail_2_neptune_route_6_2: "La séquence d'arrêts %{objectId} n'est pas une séquence linéaire, le chainage des tronçons est rompu à l'arrêt %{stopPointId}"
+ detail_2_neptune_route_6_2: "La séquence d'arrêts %{objectId} n'est pas une séquence linéaire, le chainage des tronçons est rompu au tronçon %{ptLinkId}"
detail_2_neptune_route_7: "La séquence d'arrêts %{objectId} ne référence pas la mission %{journeyPatternId} alors que cette mission référence la séquence d'arrêt"
detail_2_neptune_route_8: "La mission journeyPatternId = %{journeyPatternId} de la séquence d'arrêts %{objectId} utilise des points d'arrêts hors séquence"
detail_2_neptune_route_9: "Le point d'arrêt (stopPointId = %{stopPointId}) de la séquence d'arrêts %{objectId} n'est utilisé dans aucune mission"
@@ -302,7 +302,7 @@ fr:
detail_2_neptune_accesslink_2: "Sur la liaison d'accès %{objectId}, les références startOfLink = %{startOfLink} et endOfLink = %{endOfLink} sont de même type : %{type}"
detail_2_neptune_line_1: "La ligne %{objectId} référence un réseau (ptNetworkIdShortcut = %{ptNetworkIdShortcut} inexistant"
detail_2_neptune_line_2: "La ligne %{objectId} référence un point d'arrêt <StopPoint> (lineEnd = %{lineEnd}) inexistant "
- detail_2_neptune_line_3: "La ligne %{objectId} référence référence un point d'arrêt (lineEnd = %{lineEnd}) qui n'est pas terminus d'une séquence d'arrêts"
+ detail_2_neptune_line_3: "La ligne %{objectId} référence un point d'arrêt (lineEnd = %{lineEnd}) qui n'est pas terminus d'une séquence d'arrêts"
detail_2_neptune_line_4: "La ligne %{objectId} référence une séquence d'arrêt (routeId = %{routeId}) inexistante"
detail_2_neptune_line_5: "La séquence d'arrêts (routeId = %{routeId}) n'est pas référencée par la ligne %{objectId}"
detail_2_neptune_route_1: "La séquence d'arrêts %{objectId} référence une mission (journeyPatternId = %{journeyPatternId}) inexistante"
@@ -311,7 +311,7 @@ fr:
detail_2_neptune_route_4: "Le tronçon (ptLinkId = %{ptLinkId}) référencé par la séquence d'arrêt %{objectId} est partagé avec %{routeId}"
detail_2_neptune_route_5: "Le tronçon %{objectId} partage un %{link} : %{target} avec un autre tronçon"
detail_2_neptune_route_6_1: "La séquence d'arrêts %{objectId} n'est pas une séquence linéaire, le chainage des tronçons forme un anneau"
- detail_2_neptune_route_6_2: "La séquence d'arrêts %{objectId} n'est pas une séquence linéaire, le chainage des tronçons est rompu à l'arrêt %{stopPointId}"
+ detail_2_neptune_route_6_2: "La séquence d'arrêts %{objectId} n'est pas une séquence linéaire, le chainage des tronçons est rompu au tronçon %{ptLinkId}"
detail_2_neptune_route_7: "La séquence d'arrêts %{objectId} ne référence pas la mission %{journeyPatternId} alors que cette mission référence la séquence d'arrêt"
detail_2_neptune_route_8: "La mission journeyPatternId = %{journeyPatternId} de la séquence d'arrêts %{objectId} utilise des points d'arrêts hors séquence"
detail_2_neptune_route_9: "Le point d'arrêt (stopPointId = %{stopPointId}) de la séquence d'arrêts %{objectId} n'est utilisé dans aucune mission"
diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml
index d01f375c5..4fb3980f1 100644
--- a/config/locales/devise.en.yml
+++ b/config/locales/devise.en.yml
@@ -1,59 +1,43 @@
-# Additional translations at https://github.com/plataformatec/devise/wiki/I18n
+# Additional translations for devise forms
en:
devise:
+ sessions:
+ new:
+ title: Sign in
+ commit: Sign in
confirmations:
- confirmed: "Your account was successfully confirmed. You are now signed in."
- send_instructions: "You will receive an email with instructions about how to confirm your account in a few minutes."
- send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions about how to confirm your account in a few minutes."
- failure:
- already_authenticated: "You are already signed in."
- inactive: "Your account was not activated yet."
- invalid: "Invalid email or password."
- invalid_token: "Invalid authentication token."
- locked: "Your account is locked."
- not_found_in_database: "Invalid email or password."
- timeout: "Your session expired, please sign in again to continue."
- unauthenticated: "You need to sign in or sign up before continuing."
- unconfirmed: "You have to confirm your account before continuing."
- mailer:
- confirmation_instructions:
- subject: "Confirmation instructions"
- reset_password_instructions:
- subject: "Reset password instructions"
- unlock_instructions:
- subject: "Unlock Instructions"
- omniauth_callbacks:
- failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
- success: "Successfully authenticated from %{kind} account."
- passwords:
- no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
- send_instructions: "You will receive an email with instructions about how to reset your password in a few minutes."
- send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
- updated: "Your password was changed successfully. You are now signed in."
- updated_not_active: "Your password was changed successfully."
+ new:
+ title: Resend confirmation instructions
registrations:
- destroyed: "Bye! Your account was successfully cancelled. We hope to see you again soon."
- signed_up: "Welcome! You have signed up successfully."
- signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
- signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
- signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please open the link to activate your account."
- update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and click on the confirm link to finalize confirming your new email address."
- updated: "You updated your account successfully."
- sessions:
- signed_in: "Signed in successfully."
- signed_out: "Signed out successfully."
- unlocks:
- send_instructions: "You will receive an email with instructions about how to unlock your account in a few minutes."
- send_paranoid_instructions: "If your account exists, you will receive an email with instructions about how to unlock it in a few minutes."
- unlocked: "Your account has been unlocked successfully. Please sign in to continue."
- errors:
- messages:
- already_confirmed: "was already confirmed, please try signing in"
- confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
- expired: "has expired, please request a new one"
- not_found: "not found"
- not_locked: "was not locked"
- not_saved:
- one: "1 error prohibited this %{resource} from being saved:"
- other: "%{count} errors prohibited this %{resource} from being saved:"
+ new:
+ title: Sign up
+ commit: Sign up
+ edit:
+ title: "Your profile"
+ commit: Update
+ actions:
+ destroy: Delete your profile
+ destroy_confirm: Do you confirm to delete your profile ?
+ passwords:
+ new:
+ title: Update password
+ commit: Receive an email with instructions about how to reset your password
+ edit:
+ title: Change your password
+ new_password: New password
+ new_password_confirmation: New password confirmation
+ commit: Update password
+ links:
+ sign_in: "Sign in"
+ sign_up: "Sign up"
+ new_password: Forget your password ?
+ new_confirmation: "Didn't receive confirmation instructions?"
+ helpers:
+ label:
+ user:
+ name: Full name
+ password: Password
+ password_confirmation: Password confirmation
+ current_password: Current password
+ remember_me: Remember me \ No newline at end of file
diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml
index 27b338de3..b1a9a743a 100644
--- a/config/locales/devise.fr.yml
+++ b/config/locales/devise.fr.yml
@@ -1,66 +1,47 @@
-# Additional translations at https://github.com/plataformatec/devise/wiki/I18n
-
+# Additional translations for devise forms
fr:
+ activerecord:
+ attributes:
+ user:
+ password: Mot de passe
devise:
+ sessions:
+ new:
+ title: Se connecter
+ commit: Se connecter
confirmations:
- confirmed: 'Votre compte a été validé.'
- send_instructions: 'Vous allez recevoir les instructions nécessaires à la confirmation de votre compte dans quelques minutes.'
- send_paranoid_instructions: 'Si votre e-mail existe dans notre base de données, vous allez bientôt recevoir un e-mail contenant les instructions de confirmation de votre compte.'
- failure:
- already_authenticated: "Vous êtes déjà connecté !"
- inactive: "Votre compte n'est pas encore activé."
- invalid: "Email ou mot de passe incorrect."
- invalid_token: "Jeton d'authentification incorrect."
- locked: "Votre compte est verrouillé."
- not_found_in_database: "Email ou mot de passe invalide."
- timeout: "Votre session est expirée, veuillez vous reconnecter pour continuer."
- unauthenticated: "Vous devez vous connecter ou vous inscrire pour continuer."
- unconfirmed: "Vous devez valider votre compte pour continuer."
- mailer:
- confirmation_instructions:
- subject: "Instructions de confirmation"
- reset_password_instructions:
- subject: "Instructions pour changer le mot de passe"
- unlock_instructions:
- subject: "Instructions pour déverrouiller le compte"
- omniauth_callbacks:
- failure: "Nous n'avons pas pu vous authentifier via %{kind} : '%{reason}'."
- success: 'Authentifié avec succès via %{kind}.'
- passwords:
- no_token: "Vous ne pouvez accéder à cette page sans passer par un e-mail de réinitialisation de mot de passe. Si vous êtes passé par un e-mail de ce type, assurez-vous d'utiliser l'URL complète."
- send_instructions: 'Vous allez recevoir les instructions de réinitialisation du mot de passe dans quelques instants'
- send_paranoid_instructions: "Si votre e-mail existe dans notre base de données, vous allez recevoir un lien de réinitialisation par e-mail"
- updated: 'Votre mot de passe a été édité avec succès, vous êtes maintenant connecté'
- updated_not_active: 'Votre mot de passe a été changé avec succès.'
+ new:
+ title: Renvoyer le mail de confirmation
registrations:
- destroyed: 'Votre compte a été supprimé avec succès. Nous espérons vous revoir bientôt.'
- signed_up: 'Bienvenu, vous êtes connecté'
- signed_up_but_inactive: "Vous êtes bien enregistré. Vous ne pouvez cependant pas vous connecter car votre compte n'est pas encore activé."
- signed_up_but_locked: "Vous êtes bien enregistré. Vous ne pouvez cependant pas vous connecter car votre compte est verrouillé."
- signed_up_but_unconfirmed: 'Un message contenant un lien de confirmation a été envoyé à votre adresse email. Ouvrez ce lien pour activer votre compte.'
- update_needs_confirmation: "Votre compte a bien été mis à jour mais nous devons vérifier votre nouvelle adresse email. Merci de vérifier vos emails et de cliquer sur le lien de confirmation pour finaliser la validation de votre nouvelle adresse."
- updated: 'Votre compte a été modifié avec succès.'
- sessions:
- signed_in: "Connecté."
- signed_out: "Déconnecté."
- unlocks:
- send_instructions: 'Vous allez recevoir les instructions nécessaires au déverrouillage de votre compte dans quelques instants'
- send_paranoid_instructions: 'Si votre compte existe, vous allez bientôt recevoir un email contenant les instructions pour le déverrouiller.'
- unlocked: 'Votre compte a été déverrouillé avec succès, vous êtes maintenant connecté.'
- errors:
- messages:
- already_confirmed: "a déjà été validé(e)"
- confirmation_period_expired: "à confirmer dans les %{period}, merci de faire une nouvelle demande"
- expired: "a expiré, merci d'en faire une nouvelle demande"
- not_found: "n'a pas été trouvé(e)"
- not_locked: "n'était pas verrouillé(e)"
- not_saved:
- one: "1 erreur a empêché ce(tte) %{resource} d'être sauvegardé(e) :"
- other: "%{count} erreurs ont empêché ce(tte) %{resource} d'être sauvegardé(e) :"
- devise:
- mailer:
- invitation_instructions:
- subject: "Invitation sur l'application Chouette"
- confirmation_instructions:
- subject: "Confirmation de votre compte d'accès à l'application Chouette"
+ new:
+ title: "S'inscrire"
+ commit: Créer un compte
+ edit:
+ title: "Votre Profil"
+ commit: Modifier
+ actions:
+ destroy: Supprimer votre profil
+ destroy_confirm: Etes vous sûr de vouloir supprimer *définitivement* votre profil ?
+ passwords:
+ new:
+ title: Mot de passe oublié
+ commit: Envoyer les instructions pour un nouveau mot de passe
+ edit:
+ title: Changer de mot de passe
+ new_password: Nouveau mot de passe
+ new_password_confirmation: Confirmation du nouveau mot de passe
+ commit: Changer de mot de passe
+ links:
+ sign_in: "Se connecter"
+ sign_up: "S'inscrire"
+ new_password: Mot de passe oublié
+ new_confirmation: "Vous n'avez pas reçu les instructions de confirmation ?"
+ helpers:
+ label:
+ user:
+ name: Nom complet
+ password: Mot de passe
+ password_confirmation: Confirmation du mot de passe
+ current_password: Mot de passe actuel
+ remember_me: Se souvenir de moi
diff --git a/config/locales/import_tasks.yml b/config/locales/import_tasks.yml
index 7ae667830..f927a1f4b 100644
--- a/config/locales/import_tasks.yml
+++ b/config/locales/import_tasks.yml
@@ -99,7 +99,6 @@ fr:
index:
title: "Imports"
warning: ""
- imported_file: "Fichier importé"
show:
report: "Rapport"
not_yet_started: "En file d'attente"
diff --git a/config/locales/layouts.yml b/config/locales/layouts.yml
index 6efd519c7..081252aec 100644
--- a/config/locales/layouts.yml
+++ b/config/locales/layouts.yml
@@ -6,8 +6,12 @@ en:
user:
profile: "My Profile"
sign_out: "Sign out"
- tabs:
- dashboard: "dashboard"
+ navbar:
+ return_to_referentials: "Return to referentials"
+ select_referential: "Select referential"
+ select_referential_datas: "Select datas"
+ return_to_dashboard: "Return to Dashboard"
+ referential_datas: "Referential datas"
creation_tag:
title: "Create"
history_tag:
@@ -20,7 +24,22 @@ en:
error: "Error"
alert: "Alert"
notice: "Info"
-
+ footer:
+ support:
+ title: "Support"
+ technical_support: "Technical support"
+ help: "Help"
+ good_practices: "Good pratices"
+ product:
+ title: "Product"
+ licence: "Licence"
+ source_code: "Source code"
+ user_group: "User group"
+ contact:
+ title: "Contact"
+ mail: "Contact us"
+ newsletter: "Newsletter"
+ forum: "Forum"
fr:
layouts:
back_to_dashboard: "Retour au Tableau de Bord"
@@ -29,8 +48,12 @@ fr:
user:
profile: "Mon Profil"
sign_out: "Déconnexion"
- tabs:
- dashboard: "Tableau de bord"
+ navbar:
+ return_to_referentials: "Retour à la liste des référentiels"
+ select_referential: "Sélection du référentiel"
+ select_referential_datas: "Sélection des données"
+ return_to_dashboard: "Retour au Tableau de Bord"
+ referential_datas: "Données du référentiel"
creation_tag:
title: "Création"
history_tag:
@@ -43,7 +66,22 @@ fr:
error: "Erreur"
alert: "Alerte"
notice: "Info"
-
+ footer:
+ support:
+ title: "Support"
+ technical_support: "Support technique"
+ help: "Aide"
+ good_practices: "Bonnes pratiques"
+ product:
+ title: "Produit"
+ licence: "Licence"
+ source_code: "Code Source"
+ user_group: "Club utilisateur"
+ contact:
+ title: "Contact"
+ mail: "Contactez nous"
+ newsletter: "Lettre d'information"
+ forum: "Forum"
true: "oui"
false: "non"
or: "ou"
diff --git a/config/locales/lines.yml b/config/locales/lines.yml
index 3c41a50f9..91a139a66 100644
--- a/config/locales/lines.yml
+++ b/config/locales/lines.yml
@@ -5,6 +5,7 @@ en:
edit: "Edit this line"
destroy: "Remove this line"
destroy_confirm: "Are you sure you want destroy this line?"
+ destroy_selection_confirm: "Are you sure you want destroy those lines?"
import: "Import lines"
export_kml: "Export KML line"
export__kml_all: "Export KML lines"
@@ -35,9 +36,9 @@ en:
group_of_lines: "Associated groups of lines"
no_group_of_line: "No group of line"
several_group_of_lines: "%{count} groups of lines"
- activerecord:
- models:
- line:
+ activerecord:
+ models:
+ line:
zero: "line"
one: "line"
other: "lines"
@@ -71,11 +72,11 @@ en:
objectid: "Neptune identifier"
object_version: "Version"
creation_time: "Created on"
- creator_id: "Created by"
+ creator_id: "Created by"
formtastic:
hints:
line:
- registration_number: "only alphanumerical or underscore characters"
+ registration_number: "only alphanumerical or underscore characters"
objectid: "[prefix]:Line:[unique_key] : prefix contains only alphanumerical or underscore characters, unique_key accepts also minus character"
fr:
@@ -85,6 +86,7 @@ fr:
edit: "Modifier cette ligne"
destroy: "Supprimer cette ligne"
destroy_confirm: "Etes vous sûr de supprimer cette ligne ?"
+ destroy_selection_confirm: "Etes vous sûr de supprimer cette sélection de lignes ?"
import: "Importer des lignes"
export_kml: "Export KML de la ligne"
export_kml_all: "Export KML des lignes"
@@ -115,8 +117,8 @@ fr:
group_of_lines: "Groupes de lignes associés"
no_group_of_line: "Aucun groupe de lignes"
several_group_of_lines: "%{count} groupes of lignes"
- activerecord:
- models:
+ activerecord:
+ models:
line:
zero: "ligne"
one: "ligne"
@@ -155,5 +157,5 @@ fr:
formtastic:
hints:
line:
- registration_number: "caractères autorisés : alphanumériques et 'souligné'"
+ registration_number: "caractères autorisés : alphanumériques et 'souligné'"
objectid: "[prefixe]:Line:[clé_unique] caractères autorisés : alphanumériques et 'souligné' pour le préfixe, la clé unique accepte en plus le 'moins'"
diff --git a/config/locales/referentials.yml b/config/locales/referentials.yml
index d39ec4bcc..08a82a11d 100644
--- a/config/locales/referentials.yml
+++ b/config/locales/referentials.yml
@@ -62,6 +62,9 @@ en:
commercial_stops: "commercial stops"
stop_places: "stop places"
itls: "routing contraints"
+ import_tasks: "Imports"
+ export_tasks: "Exports"
+ compliance_check_tasks: "Validations"
formtastic:
hints:
referential:
@@ -134,6 +137,9 @@ fr:
commercial_stops: "arrêts commerciaux"
stop_places: "pôles d'échange"
itls: "ITL"
+ import_tasks: "Imports"
+ export_tasks: "Exports"
+ compliance_check_tasks: "Validations"
formtastic:
hints:
referential:
diff --git a/config/locales/stop_area_imports.yml b/config/locales/stop_area_imports.yml
new file mode 100644
index 000000000..c080ea1b5
--- /dev/null
+++ b/config/locales/stop_area_imports.yml
@@ -0,0 +1,33 @@
+en:
+ stop_area_imports:
+ new:
+ title: "Import stop areas"
+ export_stop_areas: "Export existing stop_areas"
+ succcess: "Import is a success"
+ tooltip:
+ file: "Select a CSV or Excel file"
+ errors:
+ import_aborted: "Errors prohibited this import from completing: "
+ invalid_stop_area: "Error column %{column}, stop_area is invalid : %{message}"
+ exception: "Invalid file, you must provide valid csv, xls or xlsx file"
+ activemodel:
+ attributes:
+ stop_area_import:
+ file: "File"
+fr:
+ stop_area_imports:
+ new:
+ title: "Import des arrêts"
+ export_stop_areas: "Exporter les arrêts existants"
+ succcess: "L'import des données est un succès"
+ tooltip:
+ file: "Sélectionner un fichier CSV ou Excel"
+ errors:
+ import_aborted: "Des erreurs ont empéchées le bon déroulement de l'import: "
+ invalid_stop_area: "Erreur colonne %{column}, l'arrêt est invalide : %{message}"
+ exception: "Le fichier est invalide, vous devez fournir un fichier csv, xls ou xlsx valide"
+ activemodel:
+ attributes:
+ stop_area_import:
+ file: "Fichier"
+ \ No newline at end of file
diff --git a/config/locales/time_tables.yml b/config/locales/time_tables.yml
index 85d268daf..ede789bc9 100644
--- a/config/locales/time_tables.yml
+++ b/config/locales/time_tables.yml
@@ -14,7 +14,8 @@ en:
destroy_date_confirm: "Are you sure you want destroy this date ?"
destroy_period_confirm: "Are you sure you want destroy this period ?"
add_period: "Add a period"
- add_date: "Add a date"
+ add_date: "Add a peculiar date"
+ add_excluded_date: "Add an excluded date"
new:
title: "Add a new timetable"
edit:
@@ -31,7 +32,7 @@ en:
add_date: "Add a date"
index:
title: "Timetables"
- comment: "Comment"
+ comment: "Name"
selection: "Selection"
selection_all: "All"
activerecord:
@@ -42,8 +43,11 @@ en:
other: "Timetables"
attributes:
time_table:
- comment: "Comment"
- version: "Version"
+ comment: "Name"
+ version: "Short name"
+ peculiarities: "Peculiarities"
+ school_holliday: "School hollidays"
+ public_holliday: "Public hollidays"
day_types: "Day types"
none: "none"
monday: "Monday"
@@ -58,8 +62,9 @@ en:
creation_time: "Created on"
creator_id: "Created by "
calendars: "Calendar view"
- dates: "Application dates"
+ dates: "Peculiar dates"
date: "On"
+ excluded_dates: "Excluded dates"
periods: "Application periods"
period_start: "From"
period_end: "to"
@@ -85,7 +90,8 @@ fr:
destroy_date_confirm: "Etes vous sûr de supprimer cette date ?"
destroy_period_confirm: "Etes vous sûr de supprimer cette période ?"
add_period: "Ajouter une période"
- add_date: "Ajouter une date"
+ add_date: "Ajouter une date particulière"
+ add_excluded_date: "Ajouter une date exclue"
new:
title: "Ajouter un calendrier"
edit:
@@ -101,7 +107,7 @@ fr:
add_period: "Ajouter une période"
add_date: "Ajouter une date"
index:
- comment: "Description"
+ comment: "Nom"
title: "calendriers"
selection: "Sélection"
selection_all: "Tous"
@@ -113,8 +119,11 @@ fr:
other: "Calendriers"
attributes:
time_table:
- comment: "Description"
- version: "Version"
+ comment: "Nom"
+ version: "Abréviation"
+ peculiarities: "Particularités"
+ school_holliday: "Vacances scolaires"
+ public_holliday: "Jours fériés"
day_types: "Jours d'application"
none: "aucun"
monday: "Lundi"
@@ -129,8 +138,9 @@ fr:
creation_time: "Créé le"
creator_id: "Créé par"
calendars: "Présentation calendaire"
- dates: "Dates d'application"
- date: "Date"
+ dates: "Dates particulières"
+ date: "Le"
+ excluded_dates: "Dates exclues"
periods: "Périodes d'application"
period_start: "Du"
period_end: "au"
diff --git a/config/locales/vehicle_journey_imports.yml b/config/locales/vehicle_journey_imports.yml
index 2cf1e7b95..476996f41 100644
--- a/config/locales/vehicle_journey_imports.yml
+++ b/config/locales/vehicle_journey_imports.yml
@@ -2,27 +2,35 @@ en:
vehicle_journey_imports:
new:
title: "Import vehicle journey at stops"
- export_vehicle_journeys: "Export existing vehicle journey at stops :"
- form:
- file: "File"
+ export_vehicle_journeys: "Export existing vehicle journey at stops"
+ succcess: "Import is a success"
+ tooltip:
+ file: "Select a CSV or Excel file"
errors:
+ import_aborted: "Des erreurs ont empéchées le bon déroulement de l'import: "
not_same_stop_points: "Error column 1 : Not same stop points than in route %{route}"
invalid_vehicle_journey_at_stop: "Error column %{column} line %{line} : vehicle journey at stop invalid %{time}"
invalid_vehicle_journey: "Error column %{column}, vehicle journey is invalid : %{message}"
- exception: "An exception occured : %{message}"
+ exception: "Invalid file, you must provide valid csv, xls or xlsx file"
+ activemodel:
+ attributes:
+ vehicle_journey_import:
+ file: "File"
fr:
- form:
- file: "Fichier"
vehicle_journey_imports:
new:
title: "Import des horaires à l'arrêt"
- export_vehicle_journeys: "Exporter les horaires à l'arrêt existants :"
- file: "Fichier"
- form:
- file: "Fichier"
+ export_vehicle_journeys: "Exporter les horaires existants"
+ succcess: "L'import des données est un succès"
+ tooltip:
+ file: "Sélectionner un fichier CSV ou Excel"
errors:
+ import_aborted: "Des erreurs ont empéchées le bon déroulement de l'import: "
not_same_stop_points: "Erreur colonne 1 : Pas les mêmes points d'arrêt que sur l'itinéraire %{route}"
invalid_vehicle_journey_at_stop: "Erreur colonne %{column} ligne %{line} : horaire à l'arrêt invalide %{time}"
invalid_vehicle_journey: "Erreur colonne %{column}, la course est invalide : %{message}"
- exception: "Une exception est survenu : %{message}"
- \ No newline at end of file
+ exception: "Le fichier est invalide, vous devez fournir un fichier csv, xls ou xlsx valide"
+ activemodel:
+ attributes:
+ vehicle_journey_import:
+ file: "Fichier" \ No newline at end of file
diff --git a/config/locales/will_paginate.yml b/config/locales/will_paginate.yml
index e666fce92..4793c962c 100644
--- a/config/locales/will_paginate.yml
+++ b/config/locales/will_paginate.yml
@@ -5,7 +5,7 @@ en:
page_gap: "&hellip;"
page_entries_info:
- search: "Search"
+ search: "Results :"
list: "Paginated list"
single_page:
zero: "No item found"
@@ -26,7 +26,7 @@ fr:
page_gap: "&hellip;"
page_entries_info:
- search: "Recherche"
+ search: "Résultats :"
list: "Liste paginée"
single_page:
zero: "Aucun élément trouvé"
diff --git a/config/routes.rb b/config/routes.rb
index 12a83eea1..fe4db9a12 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -37,6 +37,7 @@ ChouetteIhm::Application.routes.draw do
end
resources :referentials do
+ resources :stop_area_imports
resources :api_keys
resources :rule_parameter_sets
resources :stop_point_areas
diff --git a/db/migrate/20140626081657_add_in_out_to_timetable_date.ninoxe_engine.rb b/db/migrate/20140626081657_add_in_out_to_timetable_date.ninoxe_engine.rb
new file mode 100644
index 000000000..81f12e64d
--- /dev/null
+++ b/db/migrate/20140626081657_add_in_out_to_timetable_date.ninoxe_engine.rb
@@ -0,0 +1,6 @@
+# This migration comes from ninoxe_engine (originally 20140625143030)
+class AddInOutToTimetableDate < ActiveRecord::Migration
+ def change
+ add_column "time_table_dates", "in_out", "boolean"
+ end
+end
diff --git a/db/migrate/20140626081658_set_in_out_to_timetable_date.ninoxe_engine.rb b/db/migrate/20140626081658_set_in_out_to_timetable_date.ninoxe_engine.rb
new file mode 100644
index 000000000..724154466
--- /dev/null
+++ b/db/migrate/20140626081658_set_in_out_to_timetable_date.ninoxe_engine.rb
@@ -0,0 +1,9 @@
+# This migration comes from ninoxe_engine (originally 20140626054725)
+class SetInOutToTimetableDate < ActiveRecord::Migration
+ def up
+ Chouette::TimeTableDate.update_all( :in_out => true)
+ end
+
+ def down
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index f18047652..1d3d2aa24 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,11 @@
#
# It's strongly recommended to check this file into your version control system.
+<<<<<<< HEAD
+ActiveRecord::Schema.define(:version => 20140626081658) do
+=======
ActiveRecord::Schema.define(:version => 20140618072859) do
+>>>>>>> tad_pmr
create_table "access_links", :force => true do |t|
t.integer "access_point_id", :limit => 8
@@ -430,6 +434,7 @@ ActiveRecord::Schema.define(:version => 20140618072859) do
t.integer "time_table_id", :limit => 8, :null => false
t.date "date"
t.integer "position", :null => false
+ t.boolean "in_out"
end
add_index "time_table_dates", ["time_table_id"], :name => "index_time_table_dates_on_time_table_id"
diff --git a/lib/tasks/userdoc.rake b/lib/tasks/userdoc.rake
new file mode 100644
index 000000000..1023aa681
--- /dev/null
+++ b/lib/tasks/userdoc.rake
@@ -0,0 +1,132 @@
+#encoding: utf-8
+require 'fileutils'
+require 'nokogiri'
+
+namespace :doc do
+ desc "doc production"
+ task :user do
+ puts "Produce user documentation"
+
+ abort("Missing commands: please install them before processing") unless command?("pandoc") && command?("unzip") && command?("zip")
+
+ FileUtils.rm_r("tmp/doc") if File.exist?("tmp/doc")
+ FileUtils.rm_r("word") if File.exist?("word")
+ File.delete("userdoc.docx") if File.exists?("userdoc.docx")
+
+ Dir.mkdir("tmp/doc");
+ # merge all textile files in one
+ merge_textiles
+
+ # copy images in temp dir
+ puts "add images"
+ FileUtils.cp_r Dir.glob("public/help/*.png"), "tmp/doc"
+
+ # call pandoc to build docx
+ puts "build docx"
+ Dir.chdir "tmp/doc"
+ system "pandoc -s -o ../../userdoc.docx temp.textile"
+
+ # clean working directory
+ puts "clean temp files"
+ Dir.chdir "../.."
+ FileUtils.rm_r("tmp/doc") if File.exist?("tmp/doc")
+
+ # patch docx
+ patch_docx "userdoc.docx"
+
+ # end job
+ puts "User doc completed"
+ end
+
+ def merge_textiles
+ puts "parsing app/views/help/toc.textile"
+ File.open('tmp/doc/temp.textile','w') { |f|
+ File.open('app/views/help/toc.textile','r').each_line do |line|
+ line.chomp!
+ if line.start_with?("#")
+ title=""
+ file=""
+ if line.include? ":"
+ title=line.scan(/"([^"]*)"/).last.first
+ file=line.split(":").last
+ else
+ title=line.split.last
+ end
+ if line.start_with?("##")
+ f.puts "h2. "+title
+ elsif line.start_with?("#")
+ f.puts "h1. "+title
+ end
+ f.puts ""
+ if !file.empty?
+ parse_textile "app/views/help/#{file}.textile",f
+ end
+ end
+ end
+ }
+ end
+
+ def command?(command)
+ puts "command #{command} missing" unless system("which #{command} > /dev/null 2>&1")
+ system("which #{command} > /dev/null 2>&1")
+ end
+
+ def parse_textile (file,out)
+ puts " parsing #{file}"
+ File.open(file,"r").each_line do |l|
+ l.chomp!
+ next if l.start_with? "---"
+ next if l.start_with? "layout:"
+ next if l.start_with? "title:"
+ next if !l.scan(/^\* ".*":#/).empty?
+ l=l.gsub("->","→").gsub("<<","«").gsub(">>","»").gsub("oe","œ").gsub("p=.","p.")
+ clean_local_links l
+ out.puts l
+ end
+ out.puts ""
+ end
+
+ def clean_local_links (line)
+ if line.include? '":'
+ check_and_remove_link line,0
+ end
+ end
+
+ def check_and_remove_link (line,pos)
+ link_pos = line.index '":',pos
+ return if link_pos.nil?
+ title_pos = line[0..link_pos-1].rindex '"'
+ title=line[title_pos+1..link_pos-1]
+ if !line[link_pos+2..-1].start_with? "http"
+ end_link = line.index(/[^a-z_]/, link_pos+2)
+ end_link = line.length if end_link.nil?
+ end_link = end_link - 1
+ link=line[link_pos+1..end_link]
+ # remove link syntax
+ line.sub!(link,'')
+ line.sub!('"'+title+'"',title)
+ end
+ check_and_remove_link line,link_pos+1
+ end
+
+ def patch_docx file
+ system "unzip #{file} word/document.xml > /dev/null 2>&1"
+
+ f=File.open("word/document.xml","r+")
+ doc = Nokogiri::XML(f)
+ doc.xpath("//w:t").each do |tag|
+ if tag.to_s.include? '&amp;#95;'
+ tag.child.content = tag.child.content.gsub '&#95;','_'
+ end
+ end
+ f.rewind
+ f.write(doc.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML))
+ f.close
+
+ system "zip -r #{file} word/document.xml > /dev/null 2>&1"
+ FileUtils.rm_r("word") if File.exist?("word")
+ end
+
+end
+
+
diff --git a/spec/controllers/vehicle_journey_imports_controller_spec.rb b/spec/controllers/vehicle_journey_imports_controller_spec.rb
new file mode 100644
index 000000000..091826205
--- /dev/null
+++ b/spec/controllers/vehicle_journey_imports_controller_spec.rb
@@ -0,0 +1,7 @@
+require 'spec_helper'
+
+describe ImportTasksController do
+ login_user
+
+
+end
diff --git a/spec/fixtures/stop_area_import_invalid.csv b/spec/fixtures/stop_area_import_invalid.csv
new file mode 100644
index 000000000..379c33012
--- /dev/null
+++ b/spec/fixtures/stop_area_import_invalid.csv
@@ -0,0 +1,7 @@
+"id","name","longitude","latitude","area_type","parent_id","comment","country_code","street_name","mobility_restricted_suitability","stairs_availability","lift_availability","int_user_needs"
+,"StopArea1","0.1","0.1",,,"Comment",,,,,,
+,"StopArea2","0.2","0.2",,,"Comment",,,,,,
+,"StopArea3","0.3","0.3",,,"Comment",,,,,,
+,"StopArea4","0.4","0.4",,,"Comment",,,,,,
+,"StopArea5","0.5","0.5",,,"Comment",,,,,,
+,"StopArea6","0.6","0.6",,,"Comment",,,,,,
diff --git a/spec/fixtures/stop_area_import_valid.csv b/spec/fixtures/stop_area_import_valid.csv
new file mode 100644
index 000000000..d3d2c6974
--- /dev/null
+++ b/spec/fixtures/stop_area_import_valid.csv
@@ -0,0 +1,7 @@
+"id","name","longitude","latitude","area_type","parent_id","comment","country_code","street_name","mobility_restricted_suitability","stairs_availability","lift_availability","int_user_needs"
+,"StopArea1","0.1","0.1","Quay",,"Comment",,,,,,
+,"StopArea2","0.2","0.2","Quay",,"Comment",,,,,,
+,"StopArea3","0.3","0.3","Quay",,"Comment",,,,,,
+,"StopArea4","0.4","0.4","Quay",,"Comment",,,,,,
+,"StopArea5","0.5","0.5","Quay",,"Comment",,,,,,
+,"StopArea6","0.6","0.6","Quay",,"Comment",,,,,,
diff --git a/spec/fixtures/vehicle_journey_imports_valid.csv b/spec/fixtures/vehicle_journey_imports_valid.csv
index 2e05cbfc8..b20d58ab5 100644
--- a/spec/fixtures/vehicle_journey_imports_valid.csv
+++ b/spec/fixtures/vehicle_journey_imports_valid.csv
@@ -1,5 +1,6 @@
-"stop area id","stop area name","first:VehicleJourney:vehicle_journey_1","first:VehicleJourney:vehicle_journey_2","first:VehicleJourney:vehicle_journey_3"
-1,"Arrêt 1","9:00:00","10:05:00","11:10:00"
-2,"Arrêt 2","9:05:00",,"11:15:00"
-3,"Arrêt 3","9:10:00","10:20:00","11:20:00"
-4,"Arrêt 4","9:15:00","10:25:00","11:25:00"
+"stop area id","stop area name","import:VehicleJourney:1","import:VehicleJourney:2","import:VehicleJourney:3",""
+1,"Arrêt 1","9:00:00",,"11:10:00","12:10:00"
+2,"Arrêt 2","9:05:00","10:05:00","11:15:00","12:15:00"
+3,"Arrêt 3","9:10:00",,"11:20:00","12:20:00"
+4,"Arrêt 4","9:15:00","10:20:00","11:25:00","12:25:00"
+5,"Arrêt 5","9:20:00",,"11:30:00","12:30:00"
diff --git a/spec/fixtures/vehicle_journey_imports_with_vj_invalid.csv b/spec/fixtures/vehicle_journey_imports_with_vj_invalid.csv
index 3def5eca1..1b7aeb731 100644
--- a/spec/fixtures/vehicle_journey_imports_with_vj_invalid.csv
+++ b/spec/fixtures/vehicle_journey_imports_with_vj_invalid.csv
@@ -1,5 +1,6 @@
-"stop area id","stop area name","first:VehicleJourney:vehicle_journey_1","first:VehicleJourney:vehicle_journey_2","first:VehicleJourney:vehicle_journey_3"
+"stop area id","stop area name",invalid vj,"import:VehicleJourney:2","import:VehicleJourney:3"
1,"Arrêt 1","9:00:00","10:05:00","11:10:00"
2,"Arrêt 2","11:05:00",,"11:15:00"
3,"Arrêt 3","11:10:00","10:20:00","11:20:00"
-4,"Arrêt 4","11:15:00","10:25:00","11:25:00"
+4,"Arrêt 4","11:15:00",,"11:25:00"
+5,"Arrêt 5","9:20:00","10:30:00","11:30:00"
diff --git a/spec/fixtures/vehicle_journey_imports_with_vjas_bad_order.csv b/spec/fixtures/vehicle_journey_imports_with_vjas_bad_order.csv
new file mode 100644
index 000000000..4096616ab
--- /dev/null
+++ b/spec/fixtures/vehicle_journey_imports_with_vjas_bad_order.csv
@@ -0,0 +1,6 @@
+"stop area id","stop area name","import:VehicleJourney:1","import:VehicleJourney:2",""
+1,"Arrêt 1","9:05:00","10:05:00","11:10:00"
+2,"Arrêt 2","11:05:00",,"11:15:00"
+3,"Arrêt 3","9:10:00","10:20:00","11:20:00"
+4,"Arrêt 4","9:15:00","10:25:00","11:25:00"
+5,"Arrêt 5","9:20:00","10:30:00","11:30:00"
diff --git a/spec/fixtures/vehicle_journey_imports_with_vjas_invalid.csv b/spec/fixtures/vehicle_journey_imports_with_vjas_invalid.csv
index c63b56432..c5e9e32b1 100644
--- a/spec/fixtures/vehicle_journey_imports_with_vjas_invalid.csv
+++ b/spec/fixtures/vehicle_journey_imports_with_vjas_invalid.csv
@@ -1,5 +1,6 @@
-"stop area id","stop area name","first:VehicleJourney:vehicle_journey_1","first:VehicleJourney:vehicle_journey_2","first:VehicleJourney:vehicle_journey_3"
+"stop area id","stop area name","import:VehicleJourney:1","import:VehicleJourney:2",""
1,"Arrêt 1",invalid time,"10:05:00","11:10:00"
2,"Arrêt 2","9:05:00",,"11:15:00"
3,"Arrêt 3","9:10:00","10:20:00","11:20:00"
-4,"Arrêt 4","9:15:00","10:25:00","11:25:00"
+4,"Arrêt 4","9:15:00",,"11:25:00"
+5,"Arrêt 5","9:20:00","10:30:00","11:30:00"
diff --git a/spec/models/stop_area_import_spec.rb b/spec/models/stop_area_import_spec.rb
new file mode 100644
index 000000000..07f3a111b
--- /dev/null
+++ b/spec/models/stop_area_import_spec.rb
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+require 'spec_helper'
+
+describe StopAreaImport do
+
+ let(:valid_file) {
+ csv_file = File.open(Rails.root.join("spec", "fixtures", "stop_area_import_valid.csv").to_s, "r")
+ mock("CSV", :tempfile => csv_file, :original_filename => File.basename(csv_file), :path => File.path(csv_file) )
+ }
+
+ let(:invalid_file) {
+ csv_file = File.open(Rails.root.join("spec", "fixtures", "stop_area_import_invalid.csv").to_s, "r")
+ mock("CSV", :tempfile => csv_file, :original_filename => File.basename(csv_file), :path => File.path(csv_file) )
+ }
+
+ subject { StopAreaImport.new(:file => valid_file) }
+
+ describe ".save" do
+
+ it "should validate presence of file" do
+ expect(StopAreaImport.new.save).to be_false
+ end
+
+ it "should import stop areas and create the right number of objects" do
+ expect(StopAreaImport.new(:file => valid_file).save).to be_true
+ expect(Chouette::StopArea.all.size).to eq(6)
+ end
+
+ it "should not import vehicle_journeys and not create objects when vehicle journey at stops are not in ascendant order" do
+ expect(StopAreaImport.new(:file => invalid_file).save).to be_false
+ expect(Chouette::StopArea.all.size).to eq(0)
+ end
+
+ end
+
+ describe ".load_imported_stop_areas" do
+
+ # it "should return errors when stop_areas in file are invalid" do
+ # stop_area_import = StopAreaImport.new(:referential => referential, :file => invalid_file)
+ # expect { stop_area_import.load_imported_stop_areas }.to raise_exception
+ # end
+
+ it "should load stop ateas" do
+ expect(subject.load_imported_stop_areas.size).to eq(6)
+ expect(subject.errors.messages).to eq({})
+ end
+
+ end
+
+end
diff --git a/spec/models/vehicle_journey_import_spec.rb b/spec/models/vehicle_journey_import_spec.rb
new file mode 100644
index 000000000..07cd921bb
--- /dev/null
+++ b/spec/models/vehicle_journey_import_spec.rb
@@ -0,0 +1,141 @@
+# -*- coding: utf-8 -*-
+require 'spec_helper'
+
+describe VehicleJourneyImport do
+
+ def update_csv_file_with_factory_data(filename)
+ csv_file = CSV.open("/tmp/#{filename}", "wb") do |csv|
+ counter = 0
+ CSV.foreach( Rails.root.join("spec", "fixtures", "#{filename}").to_s ) do |row|
+ if counter == 0
+ csv << row
+ else
+ csv << ( row[0] = route.stop_points[counter - 1].id; row)
+ end
+ counter += 1
+ end
+
+ end
+
+ File.open("/tmp/#{filename}")
+ end
+
+ let!(:route) { create(:route) }
+ let!(:other_route) { create(:route) }
+
+ let!(:journey_pattern) { create(:journey_pattern, :route => route) }
+ let!(:other_journey_pattern) { create(:journey_pattern_even, :route => route) }
+
+ let!(:vehicle_journey1) { create(:vehicle_journey_common, :objectid => "import:VehicleJourney:1", :route_id => route.id, :journey_pattern_id => journey_pattern.id) }
+ let!(:vehicle_journey2) { create(:vehicle_journey_common, :objectid => "import:VehicleJourney:2", :route_id => route.id, :journey_pattern_id => other_journey_pattern.id) }
+ let!(:vehicle_journey3) { create(:vehicle_journey_common, :objectid => "import:VehicleJourney:3", :route_id => route.id, :journey_pattern_id => journey_pattern.id) }
+
+ let!(:stop_point0) { route.stop_points[0] }
+ let!(:stop_point1) { route.stop_points[1] }
+ let!(:stop_point2) { route.stop_points[2] }
+ let!(:stop_point3) { route.stop_points[3] }
+ let!(:stop_point4) { route.stop_points[4] }
+
+
+ # Must use uploaded file and not classical ruby File!
+ let(:valid_file) {
+ csv_file = update_csv_file_with_factory_data("vehicle_journey_imports_valid.csv")
+ mock("CSV", :tempfile => csv_file, :original_filename => File.basename(csv_file), :path => File.path(csv_file) )
+ }
+
+ let(:invalid_file_on_vj) {
+ csv_file = update_csv_file_with_factory_data("vehicle_journey_imports_with_vj_invalid.csv")
+ mock("CSV", :tempfile => csv_file, :original_filename => File.basename(csv_file), :path => File.path(csv_file) )
+ }
+
+ let(:invalid_file_on_vjas) {
+ csv_file = update_csv_file_with_factory_data("vehicle_journey_imports_with_vjas_invalid.csv")
+ mock("CSV", :tempfile => csv_file, :original_filename => File.basename(csv_file), :path => File.path(csv_file) )
+ }
+
+ let(:invalid_file_on_vjas_object) {
+ csv_file = update_csv_file_with_factory_data("vehicle_journey_imports_with_vjas_bad_order.csv")
+ mock("CSV", :tempfile => csv_file, :original_filename => File.basename(csv_file), :path => File.path(csv_file) )
+ }
+
+ subject { VehicleJourneyImport.new(:route => route, :file => valid_file) }
+
+ describe ".save" do
+
+ it "should validate presence of route" do
+ expect(VehicleJourneyImport.new(:route => route).save).to be_false
+ end
+
+ it "should validate presence of file" do
+ expect(VehicleJourneyImport.new(:file => valid_file).save).to be_false
+ end
+
+ it "should import vehicle_journeys and create the right number of objects" do
+ expect(VehicleJourneyImport.new(:file => valid_file, :route => route).save).to be_true
+ expect(Chouette::VehicleJourney.all.size).to eq(4)
+ expect(Chouette::VehicleJourneyAtStop.all.size).to eq(17)
+ end
+
+ it "should not import vehicle_journeys and not create objects when vehicle journey at stops are not in ascendant order" do
+ expect(VehicleJourneyImport.new(:route => route, :file => invalid_file_on_vjas_object).save).to be_false
+ expect(Chouette::VehicleJourney.all.size).to eq(3)
+ expect(Chouette::VehicleJourneyAtStop.all.size).to eq(0)
+ end
+
+ # it "should not import vehicle_journeys and not create objects with invalid file" do
+ # expect(VehicleJourneyImport.new(:file => invalid_file_on_vj, :route => route).save).to be_false
+ # expect(Chouette::VehicleJourney.all.size).to eq(3)
+ # expect(Chouette::VehicleJourneyAtStop.all.size).to eq(0)
+ # end
+
+ end
+
+ describe ".find_journey_pattern_schedule" do
+
+ it "should return journey pattern with same stop points" do
+ expect(subject.find_journey_pattern_schedule( { stop_point0.id => "9:00", stop_point1.id => "9:05", stop_point2.id => "9:10", stop_point3.id => "9:15", stop_point4.id => "9:20"} )).to eq(journey_pattern)
+ expect(subject.find_journey_pattern_schedule( { stop_point1.id => "9:00", stop_point3.id => "9:10" } )).to eq(other_journey_pattern)
+ end
+
+ it "should return new journey_pattern if no journey pattern with same stop points is founded" do
+ expect(subject.find_journey_pattern_schedule( { stop_point0.id => "9:00", stop_point1.id => "9:05", stop_point2.id => nil, stop_point3.id => "9:15", stop_point4.id => "9:20"} )).to be_true
+ expect(subject.find_journey_pattern_schedule( { stop_point0.id => "9:00", stop_point1.id => "9:05", stop_point2.id => nil, stop_point3.id => "9:15", stop_point4.id => "9:20"} ).id).not_to eq(journey_pattern.id)
+ expect(subject.find_journey_pattern_schedule( { stop_point0.id => "9:00", stop_point1.id => "9:05", stop_point2.id => nil, stop_point3.id => "9:15", stop_point4.id => "9:20"} ).id).not_to eq(other_journey_pattern.id)
+ end
+
+ end
+
+ describe ".load_imported_vehicle_journeys" do
+
+ it "should return false when stop points in file are not the same in the route" do
+ vehicle_journey_import = VehicleJourneyImport.new(:route => other_route, :file => valid_file)
+ expect { vehicle_journey_import.load_imported_vehicle_journeys }.to raise_exception
+ end
+
+ # it "should return errors when vehicle journeys in file are invalid" do
+ # vehicle_journey_import = VehicleJourneyImport.new(:route => route, :file => invalid_file_on_vj)
+
+ # expect { vehicle_journey_import.load_imported_vehicle_journeys }.to raise_error
+ # end
+
+ it "should return errors when vehicle journey at stops in file are invalid" do
+ vehicle_journey_import = VehicleJourneyImport.new(:route => route, :file => invalid_file_on_vjas)
+ expect { vehicle_journey_import.load_imported_vehicle_journeys }.to raise_exception
+ end
+
+ it "should return errors when vehicle journey at stops are not in ascendant order" do
+ vehicle_journey_import = VehicleJourneyImport.new(:route => route, :file => invalid_file_on_vjas_object)
+ expect(vehicle_journey_import.load_imported_vehicle_journeys.size).to eq(3)
+ expect(vehicle_journey_import.errors.messages).to be_empty
+ end
+
+ it "should load vehicle journeys" do
+ expect(subject.load_imported_vehicle_journeys.size).to eq(4)
+ expect(subject.errors.messages).to eq({})
+ end
+
+ end
+
+
+
+end
diff --git a/spec/models/vehicle_journey_importer_spec.rb b/spec/models/vehicle_journey_importer_spec.rb
deleted file mode 100644
index cb8785586..000000000
--- a/spec/models/vehicle_journey_importer_spec.rb
+++ /dev/null
@@ -1,99 +0,0 @@
-# -*- coding: utf-8 -*-
-require 'spec_helper'
-
-describe VehicleJourneyImport do
-
- let(:file) { File.open(Rails.root.join("spec", "fixtures", "vehicle_journey_imports_valid.csv").to_s, "r") }
-
- let!(:route) { create(:route) }
- let!(:other_route) { create(:route) }
-
- let!(:journey_pattern) { create(:journey_pattern, :route_id => route.id) }
- let!(:other_journey_pattern) { create(:journey_pattern, :route_id => route.id) }
-
- let!(:vehicle_journey1) { create(:vehicle_journey, :objectid => "vehicle_journey_1", :route_id => route.id, :journey_pattern_id => journey_pattern.id) }
- let!(:vehicle_journey2) { create(:vehicle_journey, :objectid => "vehicle_journey_2", :route_id => route.id, :journey_pattern_id => other_journey_pattern.id) }
- let!(:vehicle_journey3) { create(:vehicle_journey, :objectid => "vehicle_journey_3", :route_id => route.id, :journey_pattern_id => journey_pattern.id) }
-
- let!(:stop_area1) { create(:stop_area, :name => "Arrêt 1") }
- let!(:stop_area2) { create(:stop_area, :name => "Arrêt 2") }
- let!(:stop_area3) { create(:stop_area, :name => "Arrêt 3") }
- let!(:stop_area4) { create(:stop_area, :name => "Arrêt 4") }
-
- let!(:stop_point1) { create(:stop_point, :id => 1, :stop_area => stop_area1) }
- let!(:stop_point2) { create(:stop_point, :id => 2, :stop_area => stop_area2) }
- let!(:stop_point3) { create(:stop_point, :id => 3, :stop_area => stop_area3) }
- let!(:stop_point4) { create(:stop_point, :id => 4, :stop_area => stop_area4) }
-
- subject { VehicleJourneyImport.new(:route => route, :file => file) }
-
- before :each do
- route.stop_points = [stop_point1, stop_point2, stop_point3, stop_point4]
- journey_pattern.stop_points = [stop_point1, stop_point2, stop_point3, stop_point4]
- other_journey_pattern.stop_points = [stop_point1, stop_point3, stop_point4]
- end
-
- describe ".save" do
-
- it "should validate presence of route" do
- expect(VehicleJourneyImport.new(:route => route).save).to be_false
- end
-
- it "should validate presence of file" do
- expect(VehicleJourneyImport.new(:file => file).save).to be_false
- end
-
- it "should import vehicle_journeys and create the right number of objects" do
- expect(VehicleJourneyImport.new(:file => file, :route => route).save).to be_true
- end
-
- end
-
- describe ".find_journey_pattern_schedule" do
-
- it "should return journey pattern with same stop points" do
- expect(subject.find_journey_pattern_schedule( { 1 => "9:00", 2 => "9:05", 3 => "9:10", 4 => "9:15"} )).to eq(journey_pattern)
- expect(subject.find_journey_pattern_schedule( { 1 => "9:00", 2 => nil, 3 => "9:10", 4 => "9:15"} )).to eq(other_journey_pattern)
- end
-
- it "should return new journey_pattern if no journey pattern with same stop points is founded" do
- expect(subject.find_journey_pattern_schedule( { 1 => "9:00", 2 => "9:05", 3 => nil, 4 => "9:15"} )).to be_true
- expect(subject.find_journey_pattern_schedule( { 1 => "9:00", 2 => "9:05", 3 => nil, 4 => "9:15"} ).id).not_to eq(journey_pattern.id)
- expect(subject.find_journey_pattern_schedule( { 1 => "9:00", 2 => "9:05", 3 => nil, 4 => "9:15"} ).id).not_to eq(other_journey_pattern.id)
- end
-
- end
-
- describe ".load_imported_vehicle_journeys" do
-
- it "should return false when stop points in file are not the same in the route" do
- expect(VehicleJourneyImport.new(:route => other_route, :file => file).load_imported_vehicle_journeys).to eq([])
- expect(Chouette::VehicleJourney.all.size).to eq(3)
- expect(Chouette::VehicleJourneyAtStop.all.size).to eq(0)
- end
-
- it "should return false when vehicle journeys in file are invalid" do
- invalid_file = File.open(Rails.root.join("spec", "fixtures", "vehicle_journey_imports_with_vj_invalid.csv").to_s, "r")
- expect(VehicleJourneyImport.new(:route => other_route, :file => invalid_file).load_imported_vehicle_journeys).to eq([])
- expect(Chouette::VehicleJourney.all.size).to eq(3)
- expect(Chouette::VehicleJourneyAtStop.all.size).to eq(0)
- end
-
- it "should return false when vehicle journey at stops in file are invalid" do
- invalid_file = File.open(Rails.root.join("spec", "fixtures", "vehicle_journey_imports_with_vjas_invalid.csv").to_s, "r")
- expect(VehicleJourneyImport.new(:route => other_route, :file => invalid_file).load_imported_vehicle_journeys).to eq([])
- expect(Chouette::VehicleJourney.all.size).to eq(3)
- expect(Chouette::VehicleJourneyAtStop.all.size).to eq(0)
- end
-
- it "should load vehicle journeys" do
- expect(subject.load_imported_vehicle_journeys.size).to eq(3)
- expect(Chouette::VehicleJourney.all.collect(&:objectid)).to match_array([vehicle_journey1.objectid, vehicle_journey2.objectid, vehicle_journey3.objectid])
- expect(Chouette::VehicleJourneyAtStop.all.size).to eq(11)
- end
-
- end
-
-
-
-end
diff --git a/spec/requests/stop_area_imports_spec.rb b/spec/requests/stop_area_imports_spec.rb
new file mode 100644
index 000000000..c0da1edac
--- /dev/null
+++ b/spec/requests/stop_area_imports_spec.rb
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+require 'spec_helper'
+
+describe "StopAreaImports" do
+ login_user
+
+ let!(:line) { create :line }
+ let!(:valid_file_path) { Rails.root + "spec/fixtures/stop_area_import_valid.csv" }
+ let!(:invalid_file_path) { Rails.root + "spec/fixtures/stop_area_import_invalid.csv" }
+
+ describe "new" do
+ it "should create stop areas and return to stop areas index page" do
+ visit new_referential_stop_area_import_path(referential)
+ attach_file('Fichier', valid_file_path)
+ click_button "Lancer l'import"
+ expect(page).to have_content(I18n.t("stop_area_imports.new.success"))
+ expect(page).to have_content("StopArea1")
+ end
+
+ it "should return error messages when file is invalid" do
+ visit new_referential_stop_area_import_path(referential)
+ attach_file('Fichier', invalid_file_path)
+ click_button "Lancer l'import"
+ expect(page).to have_content(I18n.t("stop_area_imports.errors.import_aborted"))
+ end
+
+ it "should return error message when file missing on upload" do
+ visit new_referential_stop_area_import_path(referential)
+ click_button "Lancer l'import"
+ expect(page).to have_content(I18n.t("stop_area_imports.errors.import_aborted"))
+ end
+ end
+
+end
diff --git a/spec/requests/time_tables_spec.rb b/spec/requests/time_tables_spec.rb
index 412dcece6..fbe03db2b 100644
--- a/spec/requests/time_tables_spec.rb
+++ b/spec/requests/time_tables_spec.rb
@@ -13,35 +13,35 @@ describe "TimeTables" do
page.should have_content(time_tables.first.comment)
page.should have_content(time_tables.last.comment)
end
-
- end
- describe "show" do
+ end
+
+ describe "show" do
it "display time_table" do
visit referential_time_tables_path(referential)
click_link "#{time_tables.first.comment}"
page.should have_content(time_tables.first.comment)
end
-
+
end
- describe "new" do
+ describe "new" do
it "creates time_table and return to show" do
visit referential_time_tables_path(referential)
click_link "Ajouter un calendrier"
- fill_in "Description", :with => "TimeTable 1"
- fill_in "Identifiant Neptune", :with => "test:Timetable:1"
- click_button("Créer calendrier")
+ fill_in "Nom", :with => "TimeTable 1"
+ fill_in "Identifiant Neptune", :with => "test:Timetable:1"
+ click_button("Créer Calendrier")
page.should have_content("TimeTable 1")
end
end
- describe "edit and return to show" do
+ describe "edit and return to show" do
it "edit time_table" do
visit referential_time_table_path(referential, subject)
click_link "Modifier ce calendrier"
- fill_in "Description", :with => "TimeTable Modified"
- click_button("Modifier calendrier")
+ fill_in "Nom", :with => "TimeTable Modified"
+ click_button("Modifier Calendrier")
page.should have_content("TimeTable Modified")
end
end
diff --git a/spec/requests/vehicle_journey_imports_spec.rb b/spec/requests/vehicle_journey_imports_spec.rb
new file mode 100644
index 000000000..c7a772fd3
--- /dev/null
+++ b/spec/requests/vehicle_journey_imports_spec.rb
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+require 'spec_helper'
+
+describe "VehicleJourneyImports" do
+ login_user
+
+ let!(:route) { create :route }
+
+ let(:valid_file_path) {
+ csv_file = update_csv_file_with_factory_data("vehicle_journey_imports_valid.csv")
+ File.path(csv_file)
+ }
+
+ let(:invalid_file_path) {
+ csv_file = update_csv_file_with_factory_data("vehicle_journey_imports_with_vjas_invalid.csv")
+ File.path(csv_file)
+ }
+
+ def update_csv_file_with_factory_data(filename)
+ csv_file = CSV.open("/tmp/#{filename}", "wb") do |csv|
+ counter = 0
+ CSV.foreach( Rails.root.join("spec", "fixtures", "#{filename}").to_s ) do |row|
+ if counter == 0
+ csv << row
+ else
+ csv << ( row[0] = route.stop_points[counter - 1].id; row)
+ end
+ counter += 1
+ end
+
+ end
+
+ File.open("/tmp/#{filename}")
+ end
+
+ describe "new" do
+ it "should create stop areas and return to stop areas index page" do
+ visit new_referential_line_route_vehicle_journey_import_path(referential, route.line, route)
+ attach_file('Fichier', valid_file_path)
+ click_button "Lancer l'import"
+ expect(page).to have_content(I18n.t("vehicle_journey_imports.new.success"))
+ expect(page).to have_content("Séquence d'arrêts #{route.name}")
+ end
+
+ it "should return error messages when file is invalid" do
+ visit new_referential_line_route_vehicle_journey_import_path(referential, route.line, route)
+ attach_file('Fichier', invalid_file_path)
+ click_button "Lancer l'import"
+ expect(page).to have_content(I18n.t("vehicle_journey_imports.errors.import_aborted"))
+ end
+
+ it "should return error message when file missing on upload" do
+ visit new_referential_line_route_vehicle_journey_import_path(referential, route.line, route)
+ click_button "Lancer l'import"
+ expect(page).to have_content(I18n.t("vehicle_journey_imports.errors.import_aborted"))
+ end
+ end
+
+end
diff --git a/spec/views/layouts/application.html.erb_spec.rb b/spec/views/layouts/application.html.erb_spec.rb
index 048055abf..616812e62 100644
--- a/spec/views/layouts/application.html.erb_spec.rb
+++ b/spec/views/layouts/application.html.erb_spec.rb
@@ -10,10 +10,10 @@ describe "/layouts/application" do
let(:referential) { Referential.new }
- it "should display referential name as title" do
- render
- rendered.should_not have_selector("h1")
- end
+ it "should display referential name as title" #do
+ # render
+ # rendered.should_not have_selector("h1")
+ # end
end
diff --git a/spec/views/stop_areas/show.html.erb_spec.rb b/spec/views/stop_areas/show.html.erb_spec.rb
index 19e3d9de0..019086dc3 100644
--- a/spec/views/stop_areas/show.html.erb_spec.rb
+++ b/spec/views/stop_areas/show.html.erb_spec.rb
@@ -4,6 +4,7 @@ describe "/stop_areas/show" do
assign_referential
let!(:stop_area) { assign :stop_area, create(:stop_area) }
+ let!(:access_points) { assign :access_points, [] }
let!(:map) { assign(:map, mock(:to_html => '<div id="map"/>'.html_safe)) }
it "should render h2 with the stop_area name" do