diff options
| author | Zakaria BOUZIANE | 2014-12-15 10:09:06 +0100 | 
|---|---|---|
| committer | Zakaria BOUZIANE | 2014-12-15 10:09:06 +0100 | 
| commit | fbb5cb147d73e794e2a3abffe3cf0f0c21e5e6cd (patch) | |
| tree | c06416988e4ddec2f183a5d487be88f1b85db4aa | |
| parent | d1661c9504876812d64ba3b8182612737f04900c (diff) | |
| parent | a0433013264531e825268d0ae1a0da873d368313 (diff) | |
| download | chouette-core-fbb5cb147d73e794e2a3abffe3cf0f0c21e5e6cd.tar.bz2 | |
Merge branch 'V2_5' : HUB ITLs adding
142 files changed, 844 insertions, 1425 deletions
| @@ -26,6 +26,7 @@ gem 'devise_invitable'  # Map, Geolocalization  gem "map_layers", "0.0.4"  gem "georuby-ext", "0.0.5" +gem "georuby", "2.3.0" # Fix version for georuby-ext because api has changed  # User interface  gem 'language_engine', '0.0.5' @@ -60,6 +61,7 @@ gem "breadcrumbs_on_rails"  gem 'rails-assets-typeahead.js-bootstrap3.less'  gem 'rails-assets-respond'  gem 'rails-assets-eonasdan-bootstrap-datetimepicker', '~> 3.1.3' +gem 'rails-assets-jquery-tokeninput', '~> 1.7.0'  # Format Output  gem 'json' @@ -74,9 +76,9 @@ gem 'google-analytics-rails'  gem 'will_paginate', '~> 3.0'  gem 'ransack'  gem 'squeel' -#gem 'ninoxe', :git => 'https://github.com/afimb/ninoxe.git' +gem 'ninoxe', :git => 'https://github.com/afimb/ninoxe.git'  #gem 'ninoxe',:path => '~/workspace/chouette/ninoxe' -gem 'ninoxe', '~> 1.1.1' +#gem 'ninoxe', '~> 1.1.3'  gem 'acts_as_list', '0.1.6'  gem "acts_as_tree-1.8", '1.1.0', :require => "acts_as_tree" @@ -93,6 +95,7 @@ group :development do    gem 'guard'    gem 'guard-rspec'    gem 'rails-erd' +  gem 'meta_request'  end  group :test, :development do diff --git a/Gemfile.lock b/Gemfile.lock index bbfc5d34b..6560ec708 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,17 @@ +GIT +  remote: https://github.com/afimb/ninoxe.git +  revision: 37fdb46bfa9c089a231ea5e7e093a9b78cc11b5e +  specs: +    ninoxe (1.1.3) +      activerecord (~> 3.2.13) +      acts-as-taggable-on (>= 3) +      acts_as_list (>= 0.1.6) +      acts_as_tree (>= 1.1.0) +      deep_cloneable (~> 2.0.0) +      enumerize (~> 0.8.0) +      foreigner (= 1.6.0) +      georuby-ext (= 0.0.5) +  GEM    remote: http://rubygems.org/    remote: https://rails-assets.org/ @@ -56,6 +70,7 @@ GEM      builder (3.0.4)      calendar_helper (0.2.5)        open4 +    callsite (0.0.11)      capistrano (2.13.5)        highline        net-scp (>= 1.0.0) @@ -108,6 +123,8 @@ GEM      dr-apartment (0.14.1)      dr-ffi-proj4 (0.0.3)        ffi (>= 1.0.0) +    enumerize (0.8.0) +      activesupport (>= 3.2)      erubis (2.7.0)      execjs (1.4.0)        multi_json (~> 1.0) @@ -186,6 +203,10 @@ GEM        mime-types (~> 1.16)        treetop (~> 1.4.8)      map_layers (0.0.4) +    meta_request (0.3.4) +      callsite (~> 0.0, >= 0.0.11) +      rack-contrib (~> 1.1) +      railties (>= 3.0.0, < 5.0.0)      metaclass (0.0.1)      mime-types (1.25.1)      mocha (0.14.0) @@ -201,14 +222,6 @@ GEM      net-ssh (2.6.2)      net-ssh-gateway (1.1.0)        net-ssh (>= 1.99.1) -    ninoxe (1.1.1) -      activerecord (~> 3.2.13) -      acts-as-taggable-on (>= 3) -      acts_as_list (>= 0.1.6) -      acts_as_tree (>= 1.1.0) -      deep_cloneable (~> 2.0.0) -      foreigner (= 1.6.0) -      georuby-ext (= 0.0.5)      nokogiri (1.5.10)      nokogiri (1.5.10-java)      open4 (1.3.0) @@ -217,12 +230,13 @@ GEM      polyamorous (1.1.0)        activerecord (>= 3.0)      polyglot (0.3.5) -    rabl (0.7.8) +    rabl (0.11.4)        activesupport (>= 2.3.14) -      multi_json (~> 1.0)      rack (1.4.5)      rack-cache (1.2)        rack (>= 0.4) +    rack-contrib (1.2.0) +      rack (>= 0.9.1)      rack-ssl (1.3.4)        rack      rack-test (0.6.2) @@ -244,6 +258,8 @@ GEM        rails-assets-jquery (>= 1.8.3)        rails-assets-moment (>= 2.8.0)      rails-assets-jquery (2.1.1) +    rails-assets-jquery-tokeninput (1.7.0) +      rails-assets-jquery (>= 1.5)      rails-assets-moment (2.8.3)      rails-assets-respond (1.4.2)      rails-assets-tagmanager (3.0.1) @@ -399,6 +415,7 @@ DEPENDENCIES    factory_girl_rails (= 1.7)    font-awesome-sass (~> 4.2.0)    formtastic (= 2.3.1) +  georuby (= 2.3.0)    georuby-ext (= 0.0.5)    google-analytics-rails    gravatar_image_tag @@ -413,14 +430,16 @@ DEPENDENCIES    language_engine (= 0.0.5)    launchy    map_layers (= 0.0.4) +  meta_request    modernizr-rails (~> 2.0.6)    morrisjs-rails -  ninoxe (~> 1.1.1) +  ninoxe!    pg (~> 0.11.0)    rabl    rails (= 3.2.18)    rails-assets-bootstrap-sass-official (~> 3.3.0)    rails-assets-eonasdan-bootstrap-datetimepicker (~> 3.1.3) +  rails-assets-jquery-tokeninput (~> 1.7.0)    rails-assets-respond    rails-assets-tagmanager (~> 3.0.1.0)    rails-assets-typeahead.js (~> 0.10.5) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 01142c849..07fc8694c 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -13,6 +13,7 @@  //= require morris  //= require bootstrap-sass-official  //= require typeahead.js +//= require jquery-tokeninput  //= require moment  //= require moment/locale/fr  //= require eonasdan-bootstrap-datetimepicker diff --git a/app/assets/javascripts/compliance_check_tasks/index.js.coffee b/app/assets/javascripts/compliance_check_tasks/index.js.coffee index 01ca11e12..aefafbf7f 100644 --- a/app/assets/javascripts/compliance_check_tasks/index.js.coffee +++ b/app/assets/javascripts/compliance_check_tasks/index.js.coffee @@ -1,5 +1 @@ -$(".compliance_check_tasks.index").ready -> -  $(".progress-bar.failed").addClass("progress-bar-danger").prepend("100%") -  $(".progress-bar.pending").addClass("progress-bar-info").prepend("10%") -  $(".progress-bar.processing").addClass("progress-bar-info").prepend("50%") -  $(".progress-bar.completed").addClass("progress-bar-success").prepend("100%")
\ No newline at end of file +$(".compliance_check_tasks.index").ready ->
\ No newline at end of file diff --git a/app/assets/javascripts/plugins/jquery.tokeninput.js b/app/assets/javascripts/plugins/jquery.tokeninput.js deleted file mode 100644 index 87641a57a..000000000 --- a/app/assets/javascripts/plugins/jquery.tokeninput.js +++ /dev/null @@ -1,860 +0,0 @@ -/* - * jQuery Plugin: Tokenizing Autocomplete Text Entry - * Version 1.6.0 - * - * Copyright (c) 2009 James Smith (http://loopj.com) - * Licensed jointly under the GPL and MIT licenses, - * choose which one suits your project best! - * - */ - -(function ($) { -// Default settings -var DEFAULT_SETTINGS = { -	// Search settings -    method: "GET", -    contentType: "json", -    queryParam: "q", -    searchDelay: 300, -    minChars: 1, -    propertyToSearch: "name", -    jsonContainer: null, - -	// Display settings -    hintText: "Type in a search term", -    noResultsText: "No results", -    searchingText: "Searching...", -    deleteText: "×", -    animateDropdown: true, - -	// Tokenization settings -    tokenLimit: null, -    tokenDelimiter: ",", -    preventDuplicates: false, - -	// Output settings -    tokenValue: "id", - -	// Prepopulation settings -    prePopulate: null, -    processPrePopulate: false, - -	// Manipulation settings -    idPrefix: "token-input-", - -	// Formatters -    resultsFormatter: function(item){ return "<li>" + item[this.propertyToSearch]+ "</li>" }, -    tokenFormatter: function(item) { return "<li><p>" + item[this.propertyToSearch] + "</p></li>" }, - -	// Callbacks -    onResult: null, -    onAdd: null, -    onDelete: null, -    onReady: null -}; - -// Default classes to use when theming -var DEFAULT_CLASSES = { -    tokenList: "token-input-list", -    token: "token-input-token", -    tokenDelete: "token-input-delete-token", -    selectedToken: "token-input-selected-token", -    highlightedToken: "token-input-highlighted-token", -    dropdown: "token-input-dropdown", -    dropdownItem: "token-input-dropdown-item", -    dropdownItem2: "token-input-dropdown-item2", -    selectedDropdownItem: "token-input-selected-dropdown-item", -    inputToken: "token-input-input-token" -}; - -// Input box position "enum" -var POSITION = { -    BEFORE: 0, -    AFTER: 1, -    END: 2 -}; - -// Keys "enum" -var KEY = { -    BACKSPACE: 8, -    TAB: 9, -    ENTER: 13, -    ESCAPE: 27, -    SPACE: 32, -    PAGE_UP: 33, -    PAGE_DOWN: 34, -    END: 35, -    HOME: 36, -    LEFT: 37, -    UP: 38, -    RIGHT: 39, -    DOWN: 40, -    NUMPAD_ENTER: 108, -    COMMA: 188 -}; - -// Additional public (exposed) methods -var methods = { -    init: function(url_or_data_or_function, options) { -        var settings = $.extend({}, DEFAULT_SETTINGS, options || {}); - -        return this.each(function () { -            $(this).data("tokenInputObject", new $.TokenList(this, url_or_data_or_function, settings)); -        }); -    }, -    clear: function() { -        this.data("tokenInputObject").clear(); -        return this; -    }, -    add: function(item) { -        this.data("tokenInputObject").add(item); -        return this; -    }, -    remove: function(item) { -        this.data("tokenInputObject").remove(item); -        return this; -    }, -    get: function() { -    	return this.data("tokenInputObject").getTokens(); -   	} -} - -// Expose the .tokenInput function to jQuery as a plugin -$.fn.tokenInput = function (method) { -    // Method calling and initialization logic -    if(methods[method]) { -        return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); -    } else { -        return methods.init.apply(this, arguments); -    } -}; - -// TokenList class for each input -$.TokenList = function (input, url_or_data, settings) { -    // -    // Initialization -    // - -    // Configure the data source -    if($.type(url_or_data) === "string" || $.type(url_or_data) === "function") { -        // Set the url to query against -        settings.url = url_or_data; - -        // If the URL is a function, evaluate it here to do our initalization work -        var url = computeURL(); - -        // Make a smart guess about cross-domain if it wasn't explicitly specified -        if(settings.crossDomain === undefined) { -            if(url.indexOf("://") === -1) { -                settings.crossDomain = false; -            } else { -                settings.crossDomain = (location.href.split(/\/+/g)[1] !== url.split(/\/+/g)[1]); -            } -        } -    } else if(typeof(url_or_data) === "object") { -        // Set the local data to search through -        settings.local_data = url_or_data; -    } - -    // Build class names -    if(settings.classes) { -        // Use custom class names -        settings.classes = $.extend({}, DEFAULT_CLASSES, settings.classes); -    } else if(settings.theme) { -        // Use theme-suffixed default class names -        settings.classes = {}; -        $.each(DEFAULT_CLASSES, function(key, value) { -            settings.classes[key] = value + "-" + settings.theme; -        }); -    } else { -        settings.classes = DEFAULT_CLASSES; -    } - - -    // Save the tokens -    var saved_tokens = []; - -    // Keep track of the number of tokens in the list -    var token_count = 0; - -    // Basic cache to save on db hits -    var cache = new $.TokenList.Cache(); - -    // Keep track of the timeout, old vals -    var timeout; -    var input_val; - -    // Create a new text input an attach keyup events -    var input_box = $("<input type=\"text\"  autocomplete=\"off\">") -        .css({ -            outline: "none" -        }) -        .attr("id", settings.idPrefix + input.id) -        .focus(function () { -            if (settings.tokenLimit === null || settings.tokenLimit !== token_count) { -                show_dropdown_hint(); -            } -        }) -        .blur(function () { -            hide_dropdown(); -            $(this).val(""); -        }) -        .bind("keyup keydown blur update", resize_input) -        .keydown(function (event) { -            var previous_token; -            var next_token; - -            switch(event.keyCode) { -                case KEY.LEFT: -                case KEY.RIGHT: -                case KEY.UP: -                case KEY.DOWN: -                    if(!$(this).val()) { -                        previous_token = input_token.prev(); -                        next_token = input_token.next(); - -                        if((previous_token.length && previous_token.get(0) === selected_token) || (next_token.length && next_token.get(0) === selected_token)) { -                            // Check if there is a previous/next token and it is selected -                            if(event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) { -                                deselect_token($(selected_token), POSITION.BEFORE); -                            } else { -                                deselect_token($(selected_token), POSITION.AFTER); -                            } -                        } else if((event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) && previous_token.length) { -                            // We are moving left, select the previous token if it exists -                            select_token($(previous_token.get(0))); -                        } else if((event.keyCode === KEY.RIGHT || event.keyCode === KEY.DOWN) && next_token.length) { -                            // We are moving right, select the next token if it exists -                            select_token($(next_token.get(0))); -                        } -                    } else { -                        var dropdown_item = null; - -                        if(event.keyCode === KEY.DOWN || event.keyCode === KEY.RIGHT) { -                            dropdown_item = $(selected_dropdown_item).next(); -                        } else { -                            dropdown_item = $(selected_dropdown_item).prev(); -                        } - -                        if(dropdown_item.length) { -                            select_dropdown_item(dropdown_item); -                        } -                        return false; -                    } -                    break; - -                case KEY.BACKSPACE: -                    previous_token = input_token.prev(); - -                    if(!$(this).val().length) { -                        if(selected_token) { -                            delete_token($(selected_token)); -                            hidden_input.change(); -                        } else if(previous_token.length) { -                            select_token($(previous_token.get(0))); -                        } - -                        return false; -                    } else if($(this).val().length === 1) { -                        hide_dropdown(); -                    } else { -                        // set a timeout just long enough to let this function finish. -                        setTimeout(function(){do_search();}, 5); -                    } -                    break; - -                case KEY.TAB: -                case KEY.ENTER: -                case KEY.NUMPAD_ENTER: -                case KEY.COMMA: -                  if(selected_dropdown_item) { -                    add_token($(selected_dropdown_item).data("tokeninput")); -                    hidden_input.change(); -                    return false; -                  } -                  break; - -                case KEY.ESCAPE: -                  hide_dropdown(); -                  return true; - -                default: -                    if(String.fromCharCode(event.which)) { -                        // set a timeout just long enough to let this function finish. -                        setTimeout(function(){do_search();}, 5); -                    } -                    break; -            } -        }); - -    // Keep a reference to the original input box -    var hidden_input = $(input) -                           .hide() -                           .val("") -                           .focus(function () { -                               input_box.focus(); -                           }) -                           .blur(function () { -                               input_box.blur(); -                           }); - -    // Keep a reference to the selected token and dropdown item -    var selected_token = null; -    var selected_token_index = 0; -    var selected_dropdown_item = null; - -    // The list to store the token items in -    var token_list = $("<ul />") -        .addClass(settings.classes.tokenList) -        .click(function (event) { -            var li = $(event.target).closest("li"); -            if(li && li.get(0) && $.data(li.get(0), "tokeninput")) { -                toggle_select_token(li); -            } else { -                // Deselect selected token -                if(selected_token) { -                    deselect_token($(selected_token), POSITION.END); -                } - -                // Focus input box -                input_box.focus(); -            } -        }) -        .mouseover(function (event) { -            var li = $(event.target).closest("li"); -            if(li && selected_token !== this) { -                li.addClass(settings.classes.highlightedToken); -            } -        }) -        .mouseout(function (event) { -            var li = $(event.target).closest("li"); -            if(li && selected_token !== this) { -                li.removeClass(settings.classes.highlightedToken); -            } -        }) -        .insertBefore(hidden_input); - -    // The token holding the input box -    var input_token = $("<li />") -        .addClass(settings.classes.inputToken) -        .appendTo(token_list) -        .append(input_box); - -    // The list to store the dropdown items in -    var dropdown = $("<div>") -        .addClass(settings.classes.dropdown) -        .appendTo("body") -        .hide(); - -    // Magic element to help us resize the text input -    var input_resizer = $("<tester/>") -        .insertAfter(input_box) -        .css({ -            position: "absolute", -            top: -9999, -            left: -9999, -            width: "auto", -            fontSize: input_box.css("fontSize"), -            fontFamily: input_box.css("fontFamily"), -            fontWeight: input_box.css("fontWeight"), -            letterSpacing: input_box.css("letterSpacing"), -            whiteSpace: "nowrap" -        }); - -    // Pre-populate list if items exist -    hidden_input.val(""); -    var li_data = settings.prePopulate || hidden_input.data("pre"); -    if(settings.processPrePopulate && $.isFunction(settings.onResult)) { -        li_data = settings.onResult.call(hidden_input, li_data); -    } -    if(li_data && li_data.length) { -        $.each(li_data, function (index, value) { -            insert_token(value); -            checkTokenLimit(); -        }); -    } - -    // Initialization is done -    if($.isFunction(settings.onReady)) { -        settings.onReady.call(); -    } - -    // -    // Public functions -    // - -    this.clear = function() { -        token_list.children("li").each(function() { -            if ($(this).children("input").length === 0) { -                delete_token($(this)); -            } -        }); -    } - -    this.add = function(item) { -        add_token(item); -    } - -    this.remove = function(item) { -        token_list.children("li").each(function() { -            if ($(this).children("input").length === 0) { -                var currToken = $(this).data("tokeninput"); -                var match = true; -                for (var prop in item) { -                    if (item[prop] !== currToken[prop]) { -                        match = false; -                        break; -                    } -                } -                if (match) { -                    delete_token($(this)); -                } -            } -        }); -    } -     -    this.getTokens = function() { -   		return saved_tokens; -   	} - -    // -    // Private functions -    // - -    function checkTokenLimit() { -        if(settings.tokenLimit !== null && token_count >= settings.tokenLimit) { -            input_box.hide(); -            hide_dropdown(); -            return; -        } -    } - -    function resize_input() { -        if(input_val === (input_val = input_box.val())) {return;} - -        // Enter new content into resizer and resize input accordingly -        var escaped = input_val.replace(/&/g, '&').replace(/\s/g,' ').replace(/</g, '<').replace(/>/g, '>'); -        input_resizer.html(escaped); -        input_box.width(input_resizer.width() + 30); -    } - -    function is_printable_character(keycode) { -        return ((keycode >= 48 && keycode <= 90) ||     // 0-1a-z -                (keycode >= 96 && keycode <= 111) ||    // numpad 0-9 + - / * . -                (keycode >= 186 && keycode <= 192) ||   // ; = , - . / ^ -                (keycode >= 219 && keycode <= 222));    // ( \ ) ' -    } - -    // Inner function to a token to the list -    function insert_token(item) { -        var this_token = settings.tokenFormatter(item); -        this_token = $(this_token) -          .addClass(settings.classes.token) -          .insertBefore(input_token); - -        // The 'delete token' button -        $("<span>" + settings.deleteText + "</span>") -            .addClass(settings.classes.tokenDelete) -            .appendTo(this_token) -            .click(function () { -                delete_token($(this).parent()); -                hidden_input.change(); -                return false; -            }); - -        // Store data on the token -        var token_data = {"id": item.id}; -        token_data[settings.propertyToSearch] = item[settings.propertyToSearch]; -        $.data(this_token.get(0), "tokeninput", item); - -        // Save this token for duplicate checking -        saved_tokens = saved_tokens.slice(0,selected_token_index).concat([token_data]).concat(saved_tokens.slice(selected_token_index)); -        selected_token_index++; - -        // Update the hidden input -        update_hidden_input(saved_tokens, hidden_input); - -        token_count += 1; - -        // Check the token limit -        if(settings.tokenLimit !== null && token_count >= settings.tokenLimit) { -            input_box.hide(); -            hide_dropdown(); -        } - -        return this_token; -    } - -    // Add a token to the token list based on user input -    function add_token (item) { -        var callback = settings.onAdd; - -        // See if the token already exists and select it if we don't want duplicates -        if(token_count > 0 && settings.preventDuplicates) { -            var found_existing_token = null; -            token_list.children().each(function () { -                var existing_token = $(this); -                var existing_data = $.data(existing_token.get(0), "tokeninput"); -                if(existing_data && existing_data.id === item.id) { -                    found_existing_token = existing_token; -                    return false; -                } -            }); - -            if(found_existing_token) { -                select_token(found_existing_token); -                input_token.insertAfter(found_existing_token); -                input_box.focus(); -                return; -            } -        } - -        // Insert the new tokens -        if(settings.tokenLimit == null || token_count < settings.tokenLimit) { -            insert_token(item); -            checkTokenLimit(); -        } - -        // Clear input box -        input_box.val(""); - -        // Don't show the help dropdown, they've got the idea -        hide_dropdown(); - -        // Execute the onAdd callback if defined -        if($.isFunction(callback)) { -            callback.call(hidden_input,item); -        } -    } - -    // Select a token in the token list -    function select_token (token) { -        token.addClass(settings.classes.selectedToken); -        selected_token = token.get(0); - -        // Hide input box -        input_box.val(""); - -        // Hide dropdown if it is visible (eg if we clicked to select token) -        hide_dropdown(); -    } - -    // Deselect a token in the token list -    function deselect_token (token, position) { -        token.removeClass(settings.classes.selectedToken); -        selected_token = null; - -        if(position === POSITION.BEFORE) { -            input_token.insertBefore(token); -            selected_token_index--; -        } else if(position === POSITION.AFTER) { -            input_token.insertAfter(token); -            selected_token_index++; -        } else { -            input_token.appendTo(token_list); -            selected_token_index = token_count; -        } - -        // Show the input box and give it focus again -        input_box.focus(); -    } - -    // Toggle selection of a token in the token list -    function toggle_select_token(token) { -        var previous_selected_token = selected_token; - -        if(selected_token) { -            deselect_token($(selected_token), POSITION.END); -        } - -        if(previous_selected_token === token.get(0)) { -            deselect_token(token, POSITION.END); -        } else { -            select_token(token); -        } -    } - -    // Delete a token from the token list -    function delete_token (token) { -        // Remove the id from the saved list -        var token_data = $.data(token.get(0), "tokeninput"); -        var callback = settings.onDelete; - -        var index = token.prevAll().length; -        if(index > selected_token_index) index--; - -        // Delete the token -        token.remove(); -        selected_token = null; - -        // Show the input box and give it focus again -        input_box.focus(); - -        // Remove this token from the saved list -        saved_tokens = saved_tokens.slice(0,index).concat(saved_tokens.slice(index+1)); -        if(index < selected_token_index) selected_token_index--; - -        // Update the hidden input -        update_hidden_input(saved_tokens, hidden_input); - -        token_count -= 1; - -        if(settings.tokenLimit !== null) { -            input_box -                .show() -                .val("") -                .focus(); -        } - -        // Execute the onDelete callback if defined -        if($.isFunction(callback)) { -            callback.call(hidden_input,token_data); -        } -    } - -    // Update the hidden input box value -    function update_hidden_input(saved_tokens, hidden_input) { -        var token_values = $.map(saved_tokens, function (el) { -            return el[settings.tokenValue]; -        }); -        hidden_input.val(token_values.join(settings.tokenDelimiter)); - -    } - -    // Hide and clear the results dropdown -    function hide_dropdown () { -        dropdown.hide().empty(); -        selected_dropdown_item = null; -    } - -    function show_dropdown() { -        dropdown -            .css({ -                position: "absolute", -                top: $(token_list).offset().top + $(token_list).outerHeight(), -                left: $(token_list).offset().left, -                zindex: 999 -            }) -            .show(); -    } - -    function show_dropdown_searching () { -        if(settings.searchingText) { -            dropdown.html("<p>"+settings.searchingText+"</p>"); -            show_dropdown(); -        } -    } - -    function show_dropdown_hint () { -        if(settings.hintText) { -            dropdown.html("<p>"+settings.hintText+"</p>"); -            show_dropdown(); -        } -    } - -    // Highlight the query part of the search term -    function highlight_term(value, term) { -        return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<b>$1</b>"); -    } -     -    function find_value_and_highlight_term(template, value, term) { -        return template.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + value + ")(?![^<>]*>)(?![^&;]+;)", "g"), highlight_term(value, term)); -    } - -    // Populate the results dropdown with some results -    function populate_dropdown (query, results) { -        if(results && results.length) { -            dropdown.empty(); -            var dropdown_ul = $("<ul>") -                .appendTo(dropdown) -                .mouseover(function (event) { -                    select_dropdown_item($(event.target).closest("li")); -                }) -                .mousedown(function (event) { -                    add_token($(event.target).closest("li").data("tokeninput")); -                    hidden_input.change(); -                    return false; -                }) -                .hide(); - -            $.each(results, function(index, value) { -                var this_li = settings.resultsFormatter(value); -                 -                this_li = find_value_and_highlight_term(this_li ,value[settings.propertyToSearch], query);             -                 -                this_li = $(this_li).appendTo(dropdown_ul); -                 -                if(index % 2) { -                    this_li.addClass(settings.classes.dropdownItem); -                } else { -                    this_li.addClass(settings.classes.dropdownItem2); -                } - -                if(index === 0) { -                    select_dropdown_item(this_li); -                } - -                $.data(this_li.get(0), "tokeninput", value); -            }); - -            show_dropdown(); - -            if(settings.animateDropdown) { -                dropdown_ul.slideDown("fast"); -            } else { -                dropdown_ul.show(); -            } -        } else { -            if(settings.noResultsText) { -                dropdown.html("<p>"+settings.noResultsText+"</p>"); -                show_dropdown(); -            } -        } -    } - -    // Highlight an item in the results dropdown -    function select_dropdown_item (item) { -        if(item) { -            if(selected_dropdown_item) { -                deselect_dropdown_item($(selected_dropdown_item)); -            } - -            item.addClass(settings.classes.selectedDropdownItem); -            selected_dropdown_item = item.get(0); -        } -    } - -    // Remove highlighting from an item in the results dropdown -    function deselect_dropdown_item (item) { -        item.removeClass(settings.classes.selectedDropdownItem); -        selected_dropdown_item = null; -    } - -    // Do a search and show the "searching" dropdown if the input is longer -    // than settings.minChars -    function do_search() { -        var query = input_box.val().toLowerCase(); - -        if(query && query.length) { -            if(selected_token) { -                deselect_token($(selected_token), POSITION.AFTER); -            } - -            if(query.length >= settings.minChars) { -                show_dropdown_searching(); -                clearTimeout(timeout); - -                timeout = setTimeout(function(){ -                    run_search(query); -                }, settings.searchDelay); -            } else { -                hide_dropdown(); -            } -        } -    } - -    // Do the actual search -    function run_search(query) { -        var cache_key = query + computeURL(); -        var cached_results = cache.get(cache_key); -        if(cached_results) { -            populate_dropdown(query, cached_results); -        } else { -            // Are we doing an ajax search or local data search? -            if(settings.url) { -                var url = computeURL(); -                // Extract exisiting get params -                var ajax_params = {}; -                ajax_params.data = {}; -                if(url.indexOf("?") > -1) { -                    var parts = url.split("?"); -                    ajax_params.url = parts[0]; - -                    var param_array = parts[1].split("&"); -                    $.each(param_array, function (index, value) { -                        var kv = value.split("="); -                        ajax_params.data[kv[0]] = kv[1]; -                    }); -                } else { -                    ajax_params.url = url; -                } - -                // Prepare the request -                ajax_params.data[settings.queryParam] = query; -                ajax_params.type = settings.method; -                ajax_params.dataType = settings.contentType; -                if(settings.crossDomain) { -                    ajax_params.dataType = "jsonp"; -                } - -                // Attach the success callback -                ajax_params.success = function(results) { -                  if($.isFunction(settings.onResult)) { -                      results = settings.onResult.call(hidden_input, results); -                  } -                  cache.add(cache_key, settings.jsonContainer ? results[settings.jsonContainer] : results); - -                  // only populate the dropdown if the results are associated with the active search query -                  if(input_box.val().toLowerCase() === query) { -                      populate_dropdown(query, settings.jsonContainer ? results[settings.jsonContainer] : results); -                  } -                }; - -                // Make the request -                $.ajax(ajax_params); -            } else if(settings.local_data) { -                // Do the search through local data -                var results = $.grep(settings.local_data, function (row) { -                    return row[settings.propertyToSearch].toLowerCase().indexOf(query.toLowerCase()) > -1; -                }); - -                if($.isFunction(settings.onResult)) { -                    results = settings.onResult.call(hidden_input, results); -                } -                cache.add(cache_key, results); -                populate_dropdown(query, results); -            } -        } -    } - -    // compute the dynamic URL -    function computeURL() { -        var url = settings.url; -        if(typeof settings.url == 'function') { -            url = settings.url.call(); -        } -        return url; -    } -}; - -// Really basic cache for the results -$.TokenList.Cache = function (options) { -    var settings = $.extend({ -        max_size: 500 -    }, options); - -    var data = {}; -    var size = 0; - -    var flush = function () { -        data = {}; -        size = 0; -    }; - -    this.add = function (query, results) { -        if(size > settings.max_size) { -            flush(); -        } - -        if(!data[query]) { -            size += 1; -        } - -        data[query] = results; -    }; - -    this.get = function (query) { -        return data[query]; -    }; -}; -}(jQuery)); diff --git a/app/assets/stylesheets/main/routes.css.scss b/app/assets/stylesheets/main/routes.css.scss index 2d2d53a7b..7714c13a3 100644 --- a/app/assets/stylesheets/main/routes.css.scss +++ b/app/assets/stylesheets/main/routes.css.scss @@ -15,19 +15,18 @@       #stop_points .nested-fields {          ol {              margin-left: 25%; -            i.fa { margin-right: 10px;}    +            .handle { margin-left: 5px;}    -            li { -                display: inline; +            .search_stop_area {             +                margin-bottom: 0px !important; +            } -                .token-input-list { -                    overflow: visible; -                    .token-input-token {                         -                        p { margin: 0px 0px !important; }                         -                    } -                } +            div.resize{ +                height: 40px; +                line-height: 40px; +                font-size: 16px;              } -        }                        +        }       }       #stop_points .links { @@ -35,6 +34,14 @@       }         } +#workspace.routes.edit_boarding_alighting{ + +    .stop_area{ +        padding-top: 7px; +    } +     +} +  #workspace.routes.show  {    }      diff --git a/app/assets/stylesheets/main/simple_form.css.scss b/app/assets/stylesheets/main/simple_form.css.scss new file mode 100644 index 000000000..9282d89e0 --- /dev/null +++ b/app/assets/stylesheets/main/simple_form.css.scss @@ -0,0 +1,7 @@ +#workspace{ + +    .submit{ +        @extend .col-md-offset-3; +    } + +}
\ 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 580874df4..dae125471 100644 --- a/app/assets/stylesheets/main/vehicle_journeys.css.scss +++ b/app/assets/stylesheets/main/vehicle_journeys.css.scss @@ -8,17 +8,34 @@          width: 100px;          color: white;          font-weight: bold; -    } - -    .journey_pattern_dependent_list { -        tr.no_stop { display: none; } -    } +    }          .time_table_list { padding-left: 25%; }      .vehicle_journey_at_stops {          margin-left: 25%; +        thead, tbody, tfoot{ + +            th, td{ +                text-align: center; +            } +        } +         +        .journey_pattern_dependent_list { +            tr.no_stop { display: none; }             + +            td.departure_time, td.arrival_time{ +                &.missing{ +                    background-color: $brand-warning; +                } +                 +                &.invalid_position{ +                    background-color: $brand-danger; +                } +            } +        }         +          .title{              font-weight: bold;              margin-bottom: 20px; diff --git a/app/assets/stylesheets/vendor/token-input.css b/app/assets/stylesheets/vendor/token-input.css index 89dbd802e..64b1493e1 100644 --- a/app/assets/stylesheets/vendor/token-input.css +++ b/app/assets/stylesheets/vendor/token-input.css @@ -30,17 +30,20 @@ ul.token-input-list li input {  ul.token-input-disabled,  ul.token-input-disabled li input { -  background-color: #E8E8E8; +    background-color: #E8E8E8;  }  ul.token-input-disabled li.token-input-token { -  background-color: #D9E3CA; -  color: #7D7D7D +    background-color: #D9E3CA;  }  ul.token-input-disabled li.token-input-token span { -  color: #CFCFCF; -  cursor: default; +    color: $gray; +    cursor: default; +} + +ul.token-input-disabled li.token-input-token span.token-input-delete-token{ +    display: none;  }  li.token-input-token { @@ -62,19 +65,18 @@ li.token-input-token p {      margin: 0;  } -li.token-input-token span { +li.token-input-token span.token-input-delete-token {      float: right; -    color: #777;      cursor: pointer;  }  li.token-input-selected-token { -    background-color: #08844e; -    color: #fff; +    background-color: $brand-primary; +    //color: $gray;  }  li.token-input-selected-token span { -    color: #bbb; +    //color: #bbb;  }  div.token-input-dropdown { diff --git a/app/controllers/autocomplete_stop_areas_controller.rb b/app/controllers/autocomplete_stop_areas_controller.rb new file mode 100644 index 000000000..64a62efe5 --- /dev/null +++ b/app/controllers/autocomplete_stop_areas_controller.rb @@ -0,0 +1,54 @@ +class AutocompleteStopAreasController < InheritedResources::Base +  respond_to :json, :only => [:index, :children, :parent, :physicals] +   +  before_filter :switch_referential +   +  def switch_referential +    Apartment::Database.switch(referential.slug) +  end + +  def referential +    @referential ||= current_organisation.referentials.find params[:referential_id]   +  end  + +  protected + +  def collection +    result = [] +    if physical_filter? +     result = referential.stop_areas.physical +    elsif itl_exclude_filter? +      result = Chouette::StopArea.where("area_type != 'ITL'") +    elsif target_type? && relation_parent? +     result = Chouette::StopArea.new( :area_type => params[ :target_type ] ).possible_parents +    elsif target_type? && relation_children? +     result = Chouette::StopArea.new( :area_type => params[ :target_type ] ).possible_children +    else +      result = referential.stop_areas +    end +    @stop_areas = result.select{ |p| p.name =~ /#{params[:q]}/i  } +    @stop_areas +  end + +  def target_type? +    params.has_key?( :target_type) && params.has_key?( :relation ) +  end + +  def relation_parent? +    params[ :relation ] == "parent" +  end + +  def relation_children? +    params[ :relation ] == "children" +  end + +  def itl_exclude_filter? +    params[:filter] == "itl_excluded" +  end + +  def physical_filter? +    params[:filter] == "physical" +  end + +end + diff --git a/app/controllers/routes_controller.rb b/app/controllers/routes_controller.rb index 391a14d88..6454ce068 100644 --- a/app/controllers/routes_controller.rb +++ b/app/controllers/routes_controller.rb @@ -15,6 +15,21 @@ class RoutesController < ChouetteController      end    end +  def edit_boarding_alighting +    @route = route +    build_breadcrumb :edit +  end + +  def save_boarding_alighting +    @route = route +     +    if @route.update_attributes(params[:route]) +      redirect_to referential_line_route_path(@referential, @line, @route) +    else +      render "edit_boarding_alighting" +    end +  end +      def show      @map = RouteMap.new(route).with_helpers(self)      @stop_points = route.stop_points.paginate(:page => params[:page]) @@ -26,7 +41,7 @@ class RoutesController < ChouetteController    # overwrite inherited resources to use delete instead of destroy     # foreign keys will propagate deletion)    def destroy_resource(object) -        object.delete +    object.delete    end    def destroy diff --git a/app/controllers/stop_area_children_controller.rb b/app/controllers/stop_area_children_controller.rb deleted file mode 100644 index d60fcb1a6..000000000 --- a/app/controllers/stop_area_children_controller.rb +++ /dev/null @@ -1,21 +0,0 @@ -class StopAreaChildrenController < ChouetteController - -  respond_to :json, :only => :index - -  def index -    respond_to do |format| -      format.json { render :json => children_maps } -    end -  end - -  protected - -  def children_maps -    children.map {|area| area.attributes.merge( :area_type => t("area_types.label.#{area.area_type.underscore}"))} -  end - -  def children -    referential.stop_areas.find(params[:stop_area_id]).possible_children.select{ |p| p.name =~ /#{params[:q]}/i  } -  end - -end diff --git a/app/controllers/stop_area_parents_controller.rb b/app/controllers/stop_area_parents_controller.rb deleted file mode 100644 index c32e5df17..000000000 --- a/app/controllers/stop_area_parents_controller.rb +++ /dev/null @@ -1,19 +0,0 @@ -class StopAreaParentsController < ChouetteController - -  respond_to :json, :only => :index - -  def index -    respond_to do |format| -      format.json { render :json => parents_maps } -    end -  end - -  def parents_maps -    parents.map {|area| area.attributes.merge( :area_type => t("area_types.label.#{area.area_type.underscore}"))} -  end - -  def parents -    referential.stop_areas.find(params[:stop_area_id]).possible_parents.select{ |p| p.name =~ /#{params[:q]}/i  } -  end - -end diff --git a/app/controllers/stop_area_routing_stops_controller.rb b/app/controllers/stop_area_routing_stops_controller.rb deleted file mode 100644 index c5e7980f9..000000000 --- a/app/controllers/stop_area_routing_stops_controller.rb +++ /dev/null @@ -1,21 +0,0 @@ -class StopAreaRoutingStopsController < ChouetteController - -  respond_to :json, :only => :index - -  def index -    respond_to do |format|   -      format.json { render :json => routing_stops_maps }   -    end   -  end - -  def routing_stops_maps -    routing_stops.collect do |stop| -      { :id => stop.id.to_s, :name => "#{stop.name} #{stop.country_code}" } -    end -  end - -  def routing_stops  -    referential.stop_areas.find(params[:stop_area_id]).possible_children.select{ |p| p.name =~ /#{params[:q]}/i  }        -  end - -end diff --git a/app/controllers/stop_areas_controller.rb b/app/controllers/stop_areas_controller.rb index 53a7575b9..6277b5814 100644 --- a/app/controllers/stop_areas_controller.rb +++ b/app/controllers/stop_areas_controller.rb @@ -36,7 +36,6 @@ class StopAreasController < ChouetteController    def add_routing_stops      @stop_area = stop_area -    @stops = stop_area.routing_stops      build_breadcrumb :edit    end @@ -100,7 +99,7 @@ class StopAreasController < ChouetteController    def update      stop_area.position ||= stop_area.default_position      map.editable = true -     +      update!    end diff --git a/app/controllers/stop_point_areas_controller.rb b/app/controllers/stop_point_areas_controller.rb deleted file mode 100644 index 1ece8641e..000000000 --- a/app/controllers/stop_point_areas_controller.rb +++ /dev/null @@ -1,20 +0,0 @@ -class StopPointAreasController < ChouetteController - -  respond_to :json, :only => :index - -  def index -    respond_to do |format| -      format.json { render :json => areas_maps } -    end -  end - -  def areas_maps -    areas.map {|area| area.attributes.merge( :area_type => t("area_types.label.#{area.area_type.underscore}"))} -  end - -  def areas -    Chouette::StopPoint.area_candidates.select{ |p| p.name =~ /#{params[:q]}/i  } -  end - -end - diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index a74fa15da..88ff3fecf 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,5 +1,9 @@  module ApplicationHelper - +   +  def stop_area_picture_url(stop_area) +    image_path("map/#{stop_area.area_type.underscore}.png") +  end +      def selected_referential?      @referential.present? and not @referential.new_record?    end @@ -56,6 +60,8 @@ module ApplicationHelper        "exports"      when path.include?("/compliance_check_tasks")        "validations" +    when path.include?("/referentials") +      "dataspaces"      else        ""      end diff --git a/app/helpers/compliance_check_tasks_helper.rb b/app/helpers/compliance_check_tasks_helper.rb index dd61a4fbe..22a0608e0 100644 --- a/app/helpers/compliance_check_tasks_helper.rb +++ b/app/helpers/compliance_check_tasks_helper.rb @@ -9,4 +9,31 @@ module ComplianceCheckTasksHelper        "btn-default"      end    end + +  def compliance_check_task_progress_bar_tag(compliance_check_task) +       +    if compliance_check_task.status == "failed" +      div_class = "progress-bar progress-bar-danger" +      percentage_progress = "100" +    elsif compliance_check_task.status == "pending" +      div_class = "progress-bar progress-bar-info" +      percentage_progress = "10" +    elsif compliance_check_task.status == "processing" +      div_class = "progress-bar progress-bar-info" +      percentage_progress = "50" +    elsif compliance_check_task.status == "completed" +      div_class = "progress-bar progress-bar-success" +      percentage_progress = "100" +    else +      div_class = "" +      percentage_progress = "" +    end   + +    content_tag :div, :class => "progress" do +      content_tag :div, :class => div_class, role: "progressbar", :'aria-valuenow' => percentage_progress, :'aria-valuemin' => "0", :'aria-valuemax' => "100", :style => "width: #{percentage_progress}%;" do +        percentage_progress + "% " + I18n.t("compliance_check_tasks.statuses.#{compliance_check_task.status}") +      end +    end +     +  end  end diff --git a/app/helpers/stop_areas_helper.rb b/app/helpers/stop_areas_helper.rb index e287af7f3..ce0dab85a 100644 --- a/app/helpers/stop_areas_helper.rb +++ b/app/helpers/stop_areas_helper.rb @@ -1,4 +1,16 @@  module StopAreasHelper +  def explicit_name(stop_area) +    name = localization = "" +     +    name += truncate(stop_area.name, :length => 30) || "" +    name += (" <small>["+ ( truncate(stop_area.registration_number, :length => 10) || "") + "]</small>") if stop_area.registration_number +     +    localization += stop_area.zip_code || "" +    localization += ( truncate(stop_area.city_name, :length => 15) ) if stop_area.city_name +     +    ( "#{image_tag( stop_area_picture_url(stop_area)) }" + " <span style='height:25px; line-height:25px; margin-left: 5px; '>" + name + " <small style='height:25px; line-height:25px; margin-left: 10px; color: #555;'>" + localization + "</small></span>").html_safe +  end +      def genealogical_title      return t(".stop_areas.genealogical.genealogical_routing") if @stop_area.stop_area_type == 'itl'          t("stop_areas.genealogical.genealogical") diff --git a/app/inputs/search_stop_area_input.rb b/app/inputs/search_stop_area_input.rb index 901715dc1..e5cfafc34 100644 --- a/app/inputs/search_stop_area_input.rb +++ b/app/inputs/search_stop_area_input.rb @@ -1,30 +1,45 @@  class SearchStopAreaInput < Formtastic::Inputs::SearchInput - +      def search      if options[:json]        tokenLimit = options[:tokenLimit].present? ? options[:tokenLimit] : "null"        template.content_tag( :script,         ("$(document).ready(function() { +             var item_name = function( item){ -              var result = item.name; -              console.log( item ); -              console.log( item.registration_number ); -              if ( item.registration_number !=null && item.registration_number.length > 0) { -                 result += '  (' + item.registration_number + ')'; +              var result = item.short_name; +              if ( item.short_registration_number != '' ) { +                 result += ' <small>[' + item.short_registration_number + ']</small>';                }                return result;             }; -           var item_format = function( item ){ -              var info = ''; -              if ( item.zip_code != null ) { -                 info += item.zip_code + ' '; -              } -              if ( item.city_name != null ) { -                 info += item.city_name; + +           var item_localization = function( item){ +              var localization = item.zip_code + ' ' + item.short_city_name; +              return localization;          +           }; + +           var item_format = function( item ){                        +              var name = item_name( item );   +              var localization = item_localization( item ); +               +              html_result = '<li>'; +              html_result += '<span><image src=\"' + item.stop_area_path + '\" height=\"25px\" width=\"25px\"></span>' +              if(name != '') +              { +                html_result += '<span style=\"height:25px; line-height:25px; margin-left: 5px; \">' + name + '</span>' ;     +              }               +              if(localization != '') +              { +                html_result += '<small style=\"height:25px; line-height:25px; margin-left: 10px; color: #555; \">' + localization + '</small>';                } -              return '<li><div class=\"name\">' + item_name( item) + '</div><div class=\"info\">' + item.area_type + '</div><div class=\"info\">' +  info + '</div></li>' +              html_result += '</li>'; +              return html_result;             }; +             $('##{dom_id}').tokenInput('#{options[:json]}', { +             zindex: 1061, +             disabled: #{options[:disabled] || false},               crossDomain: false,               tokenLimit: #{tokenLimit},               minChars: 2, @@ -33,7 +48,7 @@ class SearchStopAreaInput < Formtastic::Inputs::SearchInput               noResultsText: '#{options[:no_result_text]}',               searchingText: '#{options[:searching_text]}',               resultsFormatter: item_format, -             tokenFormatter: item_format +             tokenFormatter: item_format,                          });          });").html_safe)      end @@ -47,11 +62,12 @@ class SearchStopAreaInput < Formtastic::Inputs::SearchInput      end    end -  def input_html_options +  def input_html_options     +    css_class =  super[:class]      super.merge({                    :required          => nil,                    :autofocus         => nil, -                  :class             => 'token-input', +                  :class             => "#{css_class} token-input",                    'data-model-name' => object.class.model_name.human                  })    end diff --git a/app/inputs/search_time_table_input.rb b/app/inputs/search_time_table_input.rb index 6f40d7e1e..877333592 100644 --- a/app/inputs/search_time_table_input.rb +++ b/app/inputs/search_time_table_input.rb @@ -15,10 +15,11 @@ class SearchTimeTableInput < Formtastic::Inputs::SearchInput                tags = '<div class=\"info\">' +  item.tags + '</div>' ;              }              return '<li><div class=\"comment\">' + item.comment + -                    '</div><div class=\"info\">' + item.time_table_bounding + day_types + '</div>' + +                    '</div><div class=\"info\">' + item.time_table_bounding + '  ' + day_types + '</div>' +                      tags + '</li>';            };             $('##{dom_id}').tokenInput('#{options[:json]}', { +             zindex: 1061,               crossDomain: false,               tokenLimit: #{tokenLimit},               minChars: 2, @@ -29,7 +30,7 @@ class SearchTimeTableInput < Formtastic::Inputs::SearchInput               noResultsText: '#{options[:no_result_text]}',               searchingText: '#{options[:searching_text]}',               resultsFormatter: time_table_formatter, -             tokenFormatter: time_table_formatter, +             tokenFormatter: time_table_formatter,                          });          });").html_safe)      end @@ -48,7 +49,7 @@ class SearchTimeTableInput < Formtastic::Inputs::SearchInput                    :required          => nil,                    :autofocus         => nil,                    :class             => 'token-input', -                  'data-model-name' => object.class.model_name.human +                  'data-model-name' => object.class.model_name.human                                    })    end diff --git a/app/views/autocomplete_stop_areas/index.rabl b/app/views/autocomplete_stop_areas/index.rabl new file mode 100644 index 000000000..6d81442c7 --- /dev/null +++ b/app/views/autocomplete_stop_areas/index.rabl @@ -0,0 +1,18 @@ +collection @stop_areas + +node do |stop_area| +  { +  :id => stop_area.id, +  :registration_number => stop_area.registration_number || "", +  :short_registration_number => truncate(stop_area.registration_number, :length => 10) || "", +  :name => stop_area.name || "", +  :short_name => truncate(stop_area.name, :length => 30) || "", +  :zip_code => stop_area.zip_code || "", +  :city_name => stop_area.city_name || "", +  :short_city_name => truncate(stop_area.city_name, :length => 15) || "" +  } +end + +node(:stop_area_path) { |stop_area| +  stop_area_picture_url(stop_area) || "" +} diff --git a/app/views/autocomplete_stop_areas/show.rabl b/app/views/autocomplete_stop_areas/show.rabl new file mode 100644 index 000000000..73ce277cf --- /dev/null +++ b/app/views/autocomplete_stop_areas/show.rabl @@ -0,0 +1,18 @@ +object @stop_area + +node do |stop_area| +  { +  :id => stop_area.id, +  :registration_number => stop_area.registration_number || "", +  :short_registration_number => truncate(stop_area.registration_number, :length => 10) || "", +  :name => stop_area.name || "", +  :short_name => truncate(stop_area.name, :length => 30) || "", +  :zip_code => stop_area.zip_code || "", +  :city_name => stop_area.city_name || "", +  :short_city_name => truncate(stop_area.city_name, :length => 15) || "" +  } +end + +node(:stop_area_path) { |stop_area| +  stop_area_picture_url(stop_area) || "" +} diff --git a/app/views/compliance_check_tasks/_compliance_check_task.html.erb b/app/views/compliance_check_tasks/_compliance_check_task.html.erb index ac652c470..40a265731 100644 --- a/app/views/compliance_check_tasks/_compliance_check_task.html.erb +++ b/app/views/compliance_check_tasks/_compliance_check_task.html.erb @@ -24,9 +24,7 @@        <% end %>    </div>    <div class="panel-footer"> -    <div class="progress"> -      <div class="progress-bar <%= compliance_check_task.status %>" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100"> <%= t("compliance_check_tasks.statuses.#{compliance_check_task.status}") %></div> -    </div> +    <%= compliance_check_task_progress_bar_tag(compliance_check_task) %>          <div class="history">        <%= l compliance_check_task.created_at, :format => "%d/%m/%Y %H:%M" %> | <%= compliance_check_task.user_name %>      </div> diff --git a/app/views/connection_links/select_areas.html.erb b/app/views/connection_links/select_areas.html.erb index ee93d1d0d..b4c40c5f6 100644 --- a/app/views/connection_links/select_areas.html.erb +++ b/app/views/connection_links/select_areas.html.erb @@ -3,8 +3,8 @@  <%= semantic_form_for [@referential, @connection_link] do |form| %>  <div>    <%= form.inputs do %> -    <%= form.input :departure_id, :as => :search_stop_area, :json => referential_connection_link_connection_link_areas_path(@referential, @connection_link, :format => :json), :tokenLimit => 1, :hint_text => t('search_hint'), :no_result_text => t('no_result_text'),:searching_text => t('searching_term'), :input_html => { :"data-pre" => Rabl::Renderer.new('stop_areas/show', [@departure].compact, :view_path => 'app/views', :format => :json).render  } %> -    <%= form.input :arrival_id, :as => :search_stop_area, :json => referential_connection_link_connection_link_areas_path(@referential, @connection_link, :format => :json), :tokenLimit => 1, :hint_text => t('search_hint'), :no_result_text => t('no_result_text'),:searching_text => t('searching_term'), :input_html => { :"data-pre" => Rabl::Renderer.new('stop_areas/show', [@arrival].compact, :view_path => 'app/views', :format => :json).render }  %> +    <%= form.input :departure_id, :as => :search_stop_area, :json => referential_autocomplete_stop_areas_path(@referential, :format => :json)+"?filter=itl_excluded", :tokenLimit => 1, :hint_text => t('search_hint'), :no_result_text => t('no_result_text'),:searching_text => t('searching_term'), :input_html => { :"data-pre" => Rabl::Renderer.new('autocomplete_stop_areas/show', [@departure].compact, :view_path => 'app/views', :format => :json, :scope => self).render  } %> +    <%= form.input :arrival_id, :as => :search_stop_area, :json =>  referential_autocomplete_stop_areas_path(@referential, :format => :json)+"?filter=itl_excluded", :tokenLimit => 1, :hint_text => t('search_hint'), :no_result_text => t('no_result_text'),:searching_text => t('searching_term'), :input_html => { :"data-pre" => Rabl::Renderer.new('autocomplete_stop_areas/show', [@arrival].compact, :view_path => 'app/views', :format => :json, :scope => self).render }  %>    <% end %>     <%= form.actions do %> diff --git a/app/views/devise/invitations/edit.html.erb b/app/views/devise/invitations/edit.html.erb index becfb8efc..8835c5773 100644 --- a/app/views/devise/invitations/edit.html.erb +++ b/app/views/devise/invitations/edit.html.erb @@ -1,14 +1,18 @@ -<h2><%= t 'devise.invitations.edit.header' %></h2> +<div class="col-md-offset-2 col-md-8"> +  <div class="panel panel-default"> +    <div class="panel-heading"><%= t "devise.invitations.edit.header" %></div> +    <div class="panel-body"> -<%= form_for resource, :as => resource_name, :url => invitation_path(resource_name), :html => { :method => :put } do |f| %> -  <%= devise_error_messages! %> -  <%= f.hidden_field :invitation_token %> +      <%= simple_form_for resource, :as => resource_name, :url => invitation_path(resource_name), :html => { :method => :put } do |form| %> +        <%= form.hidden_field :invitation_token %> -  <p><%= f.label :password %><br /> -  <%= f.password_field :password %></p> +        <%= form.input :password, :as => :password %> +        <%= form.input :password_confirmation, :as => :password %> -  <p><%= f.label :password_confirmation %><br /> -  <%= f.password_field :password_confirmation %></p> - -  <p><%= f.submit t("devise.invitations.edit.submit_button") %></p> -<% end %> +        <div class="submit"> +          <%= form.button :submit, :value => t("devise.invitations.edit.submit_button"), :class => "btn-info" %> +        </div> +      <% end %> +    </div> +  </div> +</div> diff --git a/app/views/devise/invitations/new.html.erb b/app/views/devise/invitations/new.html.erb index b5acf475a..5567463c8 100644 --- a/app/views/devise/invitations/new.html.erb +++ b/app/views/devise/invitations/new.html.erb @@ -1,12 +1,18 @@ -<h2><%= t "devise.invitations.new.header" %></h2> +<div class="col-md-offset-2 col-md-8"> +  <div class="panel panel-default"> +    <div class="panel-heading"><%= t "devise.invitations.new.header" %></div> +    <div class="panel-body"> -<%= form_for resource, :as => resource_name, :url => invitation_path(resource_name), :html => {:method => :post} do |f| %> -  <%= devise_error_messages! %> +      <%= simple_form_for resource, :as => resource_name, :url => invitation_path(resource_name), :html => {:method => :post} do |form| %> -<% resource.class.invite_key_fields.each do |field| -%> -  <p><%= f.label field %><br /> -  <%= f.text_field field %></p> -<% end -%> +        <% resource.class.invite_key_fields.each do |field| -%> +            <%= form.input field %> +        <% end -%> -  <p><%= f.submit t("devise.invitations.new.submit_button") %></p> -<% end %> +        <div class="submit"> +          <%= form.button :submit, :value => t("devise.invitations.new.submit_button"), :class => "btn-info" %> +        </div>   +      <% end %> +    </div> +  </div> +</div> diff --git a/app/views/devise/passwords/edit.html.erb b/app/views/devise/passwords/edit.html.erb index 421339b5d..e0cad44a2 100644 --- a/app/views/devise/passwords/edit.html.erb +++ b/app/views/devise/passwords/edit.html.erb @@ -1,17 +1,18 @@ -<%= title_tag t('.title') %> +<div class="col-md-offset-2 col-md-8"> +  <div class="panel panel-default"> +    <div class="panel-heading"><%= t('.title') %></div> +    <div class="panel-body"> +      <%= simple_form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :put }) do |f| %> -<%= semantic_form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :put }) do |f| %> - -  <%= f.inputs do %>  -    <%= f.input :reset_password_token, :as => :hidden %> -    <%= f.input :password, :as => :password %> -    <%= f.input :password_confirmation, :as => :password %> -  <% end %> - -   <%= f.actions do %> -     <%= f.action :submit, :as => :button, :label => t('.commit') %>  -     <%= f.action :cancel, :as => :link %> -   <% end %> -<% end %> - -<%= render "links" %> +      <%= f.input :reset_password_token, :as => :hidden %> +      <%= f.input :password, :as => :password %> +      <%= f.input :password_confirmation, :as => :password %> +       +      <div class="submit"> +        <%= link_to t("cancel"), root_path, :class => "btn btn-default" %>     +        <%= f.button :submit, :value => t("devise.passwords.edit.commit"), :class => "btn-info" %> +      </div> +      <% end %> +    </div> +  </div> +</div> diff --git a/app/views/devise/passwords/new.html.erb b/app/views/devise/passwords/new.html.erb index 865805319..8f5ec0f10 100644 --- a/app/views/devise/passwords/new.html.erb +++ b/app/views/devise/passwords/new.html.erb @@ -5,7 +5,7 @@        <%= simple_form_for(resource, :as => resource_name, :url => password_path(resource_name)) do |form| %>        <%= form.input :email, :as => :email, placeholder: 'user@domain.com'  %>  -      <div class="col-md-offset-2"> +      <div class="submit">          <%= link_to t("cancel"), root_path, :class => "btn btn-default" %>              <%= form.button :submit, :value => t("devise.passwords.new.commit"), :class => "btn-info" %>        </div> diff --git a/app/views/help/access_points_links.textile b/app/views/help/access_points_links.textile index 1bf479c36..459d51a9b 100644 --- a/app/views/help/access_points_links.textile +++ b/app/views/help/access_points_links.textile @@ -11,9 +11,10 @@ h3. Créer un accès  Depuis la page d'un arrêt auquel l'accès se rapporte, cliquer sur _"ajouter un accès"_. Un formulaire de création permet de décrire l'accès. 
 -!2014-10-30_181251.png! Création d'un accès
 +!2014-10-30_181251.png! 
 +Création d'un accès
 -Le champ de localisation par coordonnées est disponible dès la création et permet de localiser un accès avec des données chiffrées. A noter que les données doivent être saisies dans un champ unique, séparée par une virgule. Cette configuration permet de faire des copier coller directs depuis googlemaps notamment. 
 +Le champ de localisation par coordonnées est disponible dès la création et permet de localiser un accès avec des données chiffrées. A noter que les données doivent être saisies dans un champ unique, séparée par une virgule. Cette configuration permet de faire des copier coller directs depuis Googlemaps notamment. 
  La carte n'est pas disponible au moment de la création. Elle apparaît lors de la modification. Il faut donc créer un accès puis le modifier si l'on souhaite localiser l'accès sur la cartographie plutôt que par les coordonnées. 
 @@ -41,7 +42,7 @@ h4. Données géographiques :  * Position X : coordonnée horizontale de l'accès dans le référentiel de projection de l'espace de données
  * Position Y : coordonnée verticale de l'accès dans le référentiel de projection de l'espace de données
  * Longitude : longitude de l'accès dans le référentiel WGS84
 -* latitude : latitude de l'accès dans le référentiel WGS84
 +* Latitude : latitude de l'accès dans le référentiel WGS84
  h3. Modifier un accès
 @@ -51,15 +52,17 @@ h3. Consulter les accès existants  Les accès existants sont listés en bas de la page de l'arrêt sous forme d'éléments de liste. Cliquer sur le nom de l'accès ou sur le lien _"Gérer les liens arrêt-accès"_ affiche la vue détaillée de l'accès qui permet notamment son paramétrage complet. 
 -Les liens entre l'accès et l'arrêt global est présenté en premier, suivi d'une liste entre l'accès et les arrêts fils. Chacune de ses relations est figurée par une double flèche qui permet de savoir si les accès sont valables et si oui, dans quel sens exactement. 
 +Les liens entre l'accès et l'arrêt global est présenté en premier, suivi d'une liste entre l'accès et les arrêts fils. Chacune de ces relations est figurée par une double flèche qui permet de savoir si les accès sont valables et si oui, dans quel sens exactement. 
 -!2014-10-30_181326.png! Liste des accès d'un arrêt, située en bas de la page de l'arrêt
 +!2014-10-30_181326.png! 
 +Liste des accès d'un arrêt, située en bas de la page de l'arrêt
  h3. Paramétrer les accès
  Cliquer sur l'une des flèches affiche le formulaire de paramétrage détaillé de l'accès pour le sens de circulation correspondant à la flèche. 
 -!2014-10-30_181422.png! Définition des sens d'accès
 +!2014-10-30_181422.png!
 +Définition des sens d'accès
  h4. Attributs du lien Accès / Arrêt
 diff --git a/app/views/help/browser.textile b/app/views/help/browser.textile index 8796c25cb..e0586a702 100644 --- a/app/views/help/browser.textile +++ b/app/views/help/browser.textile @@ -7,9 +7,9 @@ h3. Navigateur prérequis  L’utilisation de l’application nécessite de disposer d’un navigateur ayant les caractéristiques suivantes :
 -* Internet Explorer (Version 8 et +)
 -* Mozilla FireFox (Version 12 et +)
 -* Chrome (Version 8 et +)
 +* Internet Explorer (Version 11 et +)
 +* Mozilla FireFox (Version 33 et +)
 +* Chrome (Version 38 et +)
  h3. Paramétrage du navigateur
  Le navigateur doit autoriser l’exécution de Javascript.
 diff --git a/app/views/help/companies.textile b/app/views/help/companies.textile index 72edd0b00..025cac0f0 100644 --- a/app/views/help/companies.textile +++ b/app/views/help/companies.textile @@ -9,13 +9,14 @@ Dans la réalité, le _"transporteur"_ est l'entité en charge de l'exploitation  Ce principe se retrouve dans le logiciel CHOUETTE. 
  * Il s'agit de l'exploitant de la ligne; chaque ligne est rattachée à un seul transporteur, un transporteur pouvant évidemment gérer plusieurs lignes. 
 -* Chaque transporteur dispose d'un identifiant fonctionnel, une sorte de _"numéro d'enregistrement"_, qui est utilisé dans les échanges XML pour l'identifier et le mettre à jour. Cet identifiant est unique pour toute la base CHOUETTE, quel que soit le réseau ; il est donc important que le gestionnaire de la base CHOUETTE le renseigne d'une manière bien définie et pérenne sans quoi des erreurs risquent fort de survenir lors de l'export des données vers des systèmes tiers les exploitants..
 +* Chaque transporteur dispose d'un identifiant fonctionnel, une sorte de _"numéro d'enregistrement"_, qui est utilisé dans les échanges XML pour l'identifier et le mettre à jour. Cet identifiant est unique pour toute la base CHOUETTE, quel que soit le réseau ; il est donc important que le gestionnaire de la base CHOUETTE le renseigne d'une manière bien définie et pérenne, sans quoi des erreurs risquent fort de survenir lors de l'export des données vers des systèmes tiers les exploitants..
  h4. Liste des transporteurs
  Sélectionner _"Transporteurs"_ dans le menu _"Données"_ affiche la liste des Transporteurs existants dans l'espace de données. 
 -!2014-10-30_175216.png! Liste des transporteurs
 +!2014-10-30_175216.png! 
 +Liste des transporteurs
  h4. Ajouter un transporteur
 @@ -25,7 +26,7 @@ Un formulaire s'affiche. Les champs obligatoires sont signalés par des astéris  h4. Afficher un transporteur existant
 -Pour afficher un transporteur existant il suffit de cliquer sur le nom du transporteur depuis la liste des transporteurs existants.
 +Pour afficher un transporteur existant, il suffit de cliquer sur le nom du transporteur depuis la liste des transporteurs existants.
  h4. Modifier un transporteur
 @@ -33,7 +34,7 @@ On peut modifier un transporteur en cliquant sur le bouton de modification direc  h4. Supprimer un transporteur
 -On peut modifier un transporteur en cliquant sur le bouton de modification directement depuis la liste des transporteurs ou depuis la page d'un transporteur particulier. A noter que les éléments rattachés à ce transporteur (lignes notamment) ne seront pas supprimés. Il sera toujours possible de les rattacher à un autre transporteur par la suite en les modifiant. 
 +On peut supprimer un transporteur en cliquant sur le bouton de suppression directement depuis la liste des transporteurs ou depuis la page d'un transporteur particulier. A noter que les éléments rattachés à ce transporteur (lignes notamment) ne seront pas supprimés. Il sera toujours possible de les rattacher à un autre transporteur par la suite en les modifiant. 
  h3. Attributs d'un transporteur
 diff --git a/app/views/help/connection.textile b/app/views/help/connection.textile index 85398329f..7f9ecee48 100644 --- a/app/views/help/connection.textile +++ b/app/views/help/connection.textile @@ -11,18 +11,30 @@ CHOUETTE est une application web, elle peut donc être utilisée depuis n'import  h3. Utilisateurs et organisations
 -Lorsqu’un utilisateur s’enregistre dans l’application, il crée alors une organisation qui lui appartient.
 +Lorsqu’un utilisateur s’enregistre dans l’application, une organisation qui lui appartient est créée.
 -Il peut ensuite inviter des personnes à y accéder en créant leur compte dans l’onglet Organisation.
 +Il peut ensuite inviter des personnes à y accéder en les y associant dans l’onglet Organisation.
 -!2014-10-30_173033.png! Accès au menu organisation
 +!2014-10-30_173033.png! 
 +Accès au menu organisation
 -Un utilisateur ne peut pas appartenir à plusieurs organisations.
 +Inviter d'autres utilisateurs dans son organisation permet de leur accorder un accès à ses espaces de données. Les invités ont les mêmes droits sur les éléments partagés que le titulaire de l'organisation. Il peut également être invité par d'autres utilisateurs et accéder ainsi à leurs données.
 +
 +Différents utilisateurs peuvent alors travailler de concert sur les données CHOUETTE. Cela comporte néanmoins des contraintes d'organisation car l'application ne verrouille pas les données sur lesquelles un utilisateur travaillerait. Dans l'hypothèse où deux utilisateurs effectueraient des modifications sur les mêmes données en même temps, le dernier à valider aurait gain de cause. 
 +
 +Un invité dans un espace de données peut également éditer la liste des invités. 
  h3. Identification
  L'accès à CHOUETTE se fait par une identification par identifiant / mot de passe. 
 -Une fois identifié, l’utilisateur accède à un écran organisé autour des données à gérer. Chacune d'entre-elle se présente sous la forme d'un espace de données. A l'intérieur de chaque espace de données, des menus permettent de gérer (créer, modifier, supprimer) chaque type de données. 
 +Une fois identifié, l’utilisateur accède à un écran organisé autour des données qu'il peut gérer. Ces données sont organisées sous la forme d'un <<espace de données>>. A l'intérieur de chaque espace de données, des menus permettent de gérer (créer, modifier, supprimer) chaque type de données. 
  L’application est disponible également en version anglaise et comprend le glossaire du présent manuel en ligne.
 +
 +h3. Mot de passe perdu
 +
 +Dans l'hypothèse où un utilisateur a perdu son mot de passe, il peut en récupérer un nouveau en cliquant sur le lien _"mot de passe oublié"_ au niveau de la page d'identification. Un mail de remise à zéro du mot de passe lui sera envoyé sur l'adresse mail rentrée sur son profil.
 +
 +!2014-12-01_151637.png!
 +Réinitialisation du mot de passe
 diff --git a/app/views/help/connection_links.textile b/app/views/help/connection_links.textile index a23f23867..28f55eb81 100644 --- a/app/views/help/connection_links.textile +++ b/app/views/help/connection_links.textile @@ -5,7 +5,7 @@ title: Correspondances  h3. Définition
 -Une *correspondance* ou un changement est, dans un voyage en transports en commun, une étape nécessitant de changer de ligne. Le changement peut se faire soit au sein du même réseau, soit de manière intermodale, c'est-à-dire en changeant également de mode de transport.
 +Une *correspondance* ou un changement est, dans un voyage en transport en commun, une étape nécessitant de changer de ligne. Le changement peut se faire soit au sein du même réseau, soit de manière intermodale, c'est-à-dire en changeant également de mode de transport.
  La correspondance permet d'établir une liaison entre un arrêt physique (ou une zone d'arrêt de type << arrêt commercial >> ou de type << pôle d'échange >>) et un autre arrêt physique (ou une autre zone d'arrêt de type << arrêt commercial >> ou de type << pôle d'échange >>). Elle permet notamment de préciser la distance et le temps de parcours de la correspondance.
 @@ -13,11 +13,11 @@ La correspondance permet d'établir une liaison entre un arrêt physique (ou une  h3. Créer une correspondance
 -La page des correspondance est accessible depuis le menu _"Données"_. Elle présente la liste des correspondances avec un champ de recherche par le nom. Dans le menu latéral, cliquer sur _"Ajouter une correspondance"_ permet d'afficher le formulaire  de création d'une nouvelle correspondance.
 +La page des correspondances est accessible depuis le menu _"Données"_. Elle présente la liste des correspondances avec un champ de recherche par le nom. Dans le menu latéral, cliquer sur _"Ajouter une correspondance"_ permet d'afficher le formulaire  de création d'une nouvelle correspondance.
  Seul le nom de la correspondance est obligatoire. 
 -Il est également possible de créer une nouvelle correspondance depuis la page de n'importe quelle correspondance existante. Il s'agira bien d'une nouvelle correspondance telle qu'elel pourrait être créée depuis la page des correspondances. Elle n'a aucun rapport avec la correspondance depuis laquelle elle a été créee. 
 +Il est également possible de créer une nouvelle correspondance depuis la page de n'importe quelle correspondance existante. Il s'agira bien d'une nouvelle correspondance telle qu’elle pourrait être créée depuis la page des correspondances. Elle n'a aucun rapport avec la correspondance depuis laquelle elle a été créée. 
  Une fois le formulaire enregistré, la page de la correspondance permet de définir les arrêts reliés par celle-ci. Les correspondances sont définies entre deux arrêts uniquement. Ils doivent être sélectionnés parmi les arrêts existants en base. La saisie d'éléments correspondant au nom de l'arrêt fera remonter des propositions correspondantes par l'auto-complétion. 
 diff --git a/app/views/help/dataspaces.textile b/app/views/help/dataspaces.textile index 8aca2f47b..bdd2081ff 100644 --- a/app/views/help/dataspaces.textile +++ b/app/views/help/dataspaces.textile @@ -9,11 +9,12 @@ Un espace de données est le lieu de stockage d’un ensemble de données de tra  Plusieurs attributs sont définis au niveau d’un espace de données.
 -!2014-10-30_174529.png! Espace de données
 +!2014-10-30_174529.png! 
 +Espace de données
  h3. Créer un nouvel espace de données
 -A l'issue de l'identification, la page d'accueil listant tous les espaces de données s'affichent. Cette même page est accessible en cliquant sur le pictogramme Chouette situé en haut de la page. Cliquer sur le lien _"Ajouter un espace de données"_ situé dans le menu latéral affiche le formulaire de création d'espace de données.
 +A l'issue de l'identification, la page d'accueil listant tous les espaces de données s'affichent. Cette même page est accessible en cliquant sur le pictogramme Chouette situé en haut de la page. Cliquer sur le lien _"Ajouter un espace de données"_ situé dans le menu latéral affiche le formulaire de création d'un espace de données.
  h3. Modifier un espace de données. 
 @@ -24,7 +25,7 @@ Il est également possible de le modifier depuis la page d'accueil de l'espace d  Sur la page d'un espace de données, deux fonctions spécifiques sont disponibles :
  * Ajouter une clé d'accès API : La clé API permet à une application tierce de récupérer des données directement dans l'application pour les exploiter pour son propre fonctionnement. La clé, fournie par le prestataire chargé de la maintenance du système, permet au système tiers de s'identifier auprès de CHOUETTE.
 -* Purge des données obsolètes : Cette fonction permet de supprimer tous les calendriers échus avant la date renseignée. Une fois les calendriers supprimés, CHOUETTE supprimera toutes les courses dépourvues de calendrier, puis les missions dépourvues de courses etc... Cela permet de nettoyer la base de toutes ses informations obsolètes. Il est possible de ne pas supprimer certaines catégories d'objets en cliquant les options correspondantes, notamment dans les cas où la modification est saisonnière et où les objets conservés seront utilisés ultérieurement. Purger les données permet de conserver une base de taille raisonnable. Autrement, toutes les données obsolètes resteront dans la base sans pour autant servir à quoi que ce soit. 
 +* Purge des données obsolètes : Cette fonction permet de supprimer tous les calendriers échus avant la date renseignée. Une fois les calendriers supprimés, CHOUETTE supprimera toutes les courses dépourvues de calendrier, puis les missions dépourvues de courses, etc. Cela permet de nettoyer la base de toutes ses informations obsolètes. Il est possible de ne pas supprimer certaines catégories d'objets en cliquant sur les options correspondantes, notamment dans les cas où la modification est saisonnière et où les objets conservés seront utilisés ultérieurement. Purger les données permet de conserver une base de taille raisonnable. Autrement, toutes les données obsolètes resteront dans la base sans pour autant être utiles. 
  h3. Supprimer un espace de données
 @@ -37,9 +38,12 @@ h3. Attributs d'un espace de données  Tous les champs sont obligatoires. 
  * Nom : nom de l’espace de données
 -* Code : code de l’espace de données (voir implémentation)
 +* Code : code de l’espace de données
  * Préfixe Neptune : préfixe utilisé par défaut lors la génération de nouveaux identifiants Neptune
  * Projection géographique : référentiel de projection des coordonnées cartographiques en complément du WGS84
 -* Fuseau horaire : fuseau horaire applicable pour les horaires des courses. (cf Tz_database)
 +* Fuseau horaire : fuseau horaire applicable pour les horaires des courses.
  * Emprise par défaut : emprise (en WGS84) utilisée pour positionner les cartes lorsqu’il n’y a pas d’élément à afficher. Lors de la création, chacun des points défini un carré pour l'affichage par défaut de la cartographie.
 +h3. Choix du référentiel de projection géographique
 +
 +La norme officielle en matière de projection géographique est le WGS84. C'est donc sous se format que les données de géocodage sont enregistrées dans CHOUETTE. Choisir un autre référentiel permet de saisir des coordonnées disponibles sous ce format obsolète. Ces coordonnées seront toutefois converties et enregistrées en WGS84 dans la base CHOUETTE. L'application accepte donc plusieurs projection en entrée mais n'enregistre que du WGS84. Cette projection secondaire est aussi exportée pour les formats acceptant plusieurs types de projection.
 diff --git a/app/views/help/edit.textile b/app/views/help/edit.textile index 77ea00336..eb7952c00 100644 --- a/app/views/help/edit.textile +++ b/app/views/help/edit.textile @@ -3,18 +3,22 @@ layout: default  title: Edition et suppression d'un élément
  ---
 -L'un des principes de fonctionnement de l'application pour la création, la modification et la supression d'un élément est de pouvoir utiliser deux méthodes différentes. 
 +L'un des principes de fonctionnement de l'application pour la création, la modification et la suppression d'un élément est de pouvoir utiliser deux méthodes différentes. 
  L'une consiste à passer par les listes d'éléments et d'utiliser les boutons de modification et de suppression directement sur l'élément de la liste. 
 -!2014-10-30_174647.png! Modification d'un espace de données depuis un élément de liste. 
 +!2014-10-30_174647.png! 
 +Modification d'un espace de données depuis un élément de liste. 
 -!2014-10-30_174728.png! Modification d'un espace de données depuis sa page.
 +!2014-10-30_174728.png! 
 +Modification d'un espace de données depuis sa page.
  L'autre méthode consiste à utiliser les fonctions du menu latéral directement dans la page de l'élément à éditer. 
 -!2014-10-30_175041.png! Suppression d'un élément depuis la liste.
 +!2014-10-30_175041.png! 
 +Suppression d'un élément depuis la liste.
 -!2014-10-30_175002.png! Suppression d'un élément depuis le menu latéral accessible dans sa page.
 +!2014-10-30_175002.png! 
 +Suppression d'un élément depuis le menu latéral accessible dans sa page.
 diff --git a/app/views/help/export_format.textile b/app/views/help/export_format.textile index f60d20661..e21d4fa21 100644 --- a/app/views/help/export_format.textile +++ b/app/views/help/export_format.textile @@ -9,11 +9,11 @@ p. L'export permet d'extraire de la base un ensemble de données selon plusieurs  h3. Formats disponibles
 -* Neptune : format d'échange de données de transport en commun pour la France (cf "Normalisation":normalisation)
 +* Neptune : format d'échange de données de transport en commun pour la France (cf ["Normalisation":http://www.normes-donnees-tc.org/format-dechange/donnees-theoriques/])
  * NeTEx : format d'échange de données de transport en commun expérimental sur la future 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 le format 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://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
 +* KML : format contenant l'ensemble des données cartographiées pouvant ainsi être importées dans un SIG
  * HUB : format tabulaire interne Transdev
  h3. Options des formats
 @@ -21,13 +21,13 @@ h3. Options des formats  Les options des différents formats apparaissent en fonction de celui qui a été choisi.
  * *tout format* : 
 -** Type de données incluses :sélection des lignes exportées. Le choix porte sur toutes, les lignes d'une sélection de réseaux, de transporteurs ou directement sélectionnées =:
 +** Type de données incluses :sélection des lignes exportées. Le choix porte sur toutes, les lignes d'une sélection de réseaux, de transporteurs ou directement sélectionnées ;
  ** Données incluses : liste des données selon le type choisi; ce champs n'apparait pas pour le choix 'toutes' la sélection propose dès le premier caractère saisi la liste des objets dont le nom contient le texte.
  * *Neptune* :
  ** Début de période : permet d'exporter uniquement les courses circulant à partir de cette date
  ** Fin de période : permet d'exporter uniquement les courses circulant jusqu'à cette date
  * *GTFS* :
 -** Préfixe d'identifiant Neptune à ignorer : Lorsque ce préfixe est rencontré dans l'identifiant Neptune, celui-ci n'est pas utilisé pour générer l'identifiant GTFS . La valeur proposée par défaut est celle de l'espace de données.
 +** Préfixe d'identifiant Neptune à ignorer : lorsque ce préfixe est rencontré dans l'identifiant Neptune, celui-ci n'est pas utilisé pour générer l'identifiant GTFS . La valeur proposée par défaut est celle de l'espace de données.
  ** Fuseau horaire : fixe le fuseau horaire (paramètre obligatoire des données GTFS). La valeur proposée par défaut est celle de l'espace de données.
  ** Données incluses (complément) : le choix des arrêts permet de n'exporter que les fichiers d'arrêts (stops.txt) et de correspondances (transfers.txt). 3 champs sont alors ajoutés : l'adresse, la localité et le code postal; ceux-ci seront exploités en retour sur l'import GTFS d'arrêts.
  * *NeTex* : pas d'option particulière
 diff --git a/app/views/help/exports.textile b/app/views/help/exports.textile index 8f4511365..57ceb65c3 100644 --- a/app/views/help/exports.textile +++ b/app/views/help/exports.textile @@ -7,15 +7,6 @@ h3. Rôle  p. L'export permet d'extraire de la base un ensemble de données selon un format  -h3. Formats disponibles - -- Neptune := format d'échange 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 future 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 le format 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://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 Transdev -  h3. Options des formats  Les options des différents formats apparaissent en fonction de celui qui a été choisi. diff --git a/app/views/help/group_of_lines.textile b/app/views/help/group_of_lines.textile index 0b1f0975b..9ab7d440a 100644 --- a/app/views/help/group_of_lines.textile +++ b/app/views/help/group_of_lines.textile @@ -9,7 +9,7 @@ Un groupe de lignes regroupe un ensemble de lignes assurant un type de service c  Dans le format NeTex, le réseau est un groupe de lignes parmi les autres.
 -Dans le format Neptune, une lignes ne peut appartenir qu'à un seul groupe de lignes ; donc dans l'export Neptune, un seul groupe sera exporté.
 +Dans le format Neptune, une ligne ne peut appartenir qu'à un seul groupe de lignes ; donc dans l'export Neptune, un seul groupe sera exporté.
  h4. Liste des groupes de lignes
 @@ -19,7 +19,8 @@ h4. Ajouter un groupe de lignes  Depuis la liste des groupe de lignes, cliquer sur  _"Ajouter un groupe de lignes"_ dans la partie droite de l'écran. Il est également possible de créer un nouveau groupe de lignes depuis la page de n'importe quel groupe de lignes.
 -!2014-10-30_182229.png! Création d'un nouveau groupe de lignes depuis la liste des lignes
 +!2014-10-30_182229.png! 
 +Création d'un nouveau groupe de lignes depuis la liste des lignes
  Un formulaire s'affiche. Les champs obligatoires sont signalés par des astérisques. 
 @@ -27,7 +28,7 @@ Dans le champs, _"Lignes associées"_, saisir les premiers caractères d'une lig  h4. Afficher un groupe de lignes existant
 -Pour afficher un groupe de lignes existant il suffit de cliquer sur le nom du groupe de lignes depuis la liste des groupes de lignes existants.
 +Pour afficher un groupe de lignes existant, il suffit de cliquer sur le nom du groupe de lignes depuis la liste des groupes de lignes existants.
  Les arrêts des lignes du groupe sont affichés sur la cartographie. 
 diff --git a/app/views/help/hubexport.textile b/app/views/help/hubexport.textile new file mode 100644 index 000000000..6ddafceab --- /dev/null +++ b/app/views/help/hubexport.textile @@ -0,0 +1,27 @@ +---
 +layout: default
 +title: Contraintes de l'export HUB
 +---
 +
 +CHOUETTE est en mesure d'exporter la base au format HUB qui est un format spécifique aux outils métiers Transdev. Le format HUB comprend des contraintes plus importantes que les formats Neptune, notamment sur la longueur de certains noms. Pour que la base puisse être exportée sans difficulté, il faut donc se conformer à ces contraintes de longueur de noms, ainsi que utiliser certaines fonctions comme les groupes de lignes qui sont facultatives pour leur seul format Neptune mais qui sont obligatoire dans le format HUB. 
 +
 +h3. Liste des champs contraints
 +
 +[rédaction en cours ...]
 +
 +h3. Correspondances
 +
 +CHOUETTE permet de faire des correspondances entre différents types d'arrêts. Dans le format HUB en revanche, seules les correspondances entre les arrêts physiques sont prises en compte. Il convient donc de vérifier que les correspondances sont bien paramétrées entre les arrêts de type _"point d'arrêt"_ et _"quai"_. 
 +
 +h3. Lignes et séquences d'arrêts
 +
 +Lors de la création de lignes et des séquences d'arrêts, il est nécessaire de respecter deux contraintes pour permettre la compatibilité de l'export HUB :
 +
 +* Ne pas créer plus de deux séquences d'arrêts pour une même ligne. 
 +* Renseigner impérativement le sens de la ligne :
 +**Dans le cas où il n'existe qu'une séquence d'arrêts, choisir le sens aller
 +**Dans le cas où il existe deux séquences d'arrêts, définir un sens aller et un sens retour
 +
 +h3. Créer des groupes de lignes
 +
 +Les lignes à exporter doivent impérativement faire partie d'un groupe de lignes pour pouvoir être exportées en HUB.
 diff --git a/app/views/help/import_formats.textile b/app/views/help/import_formats.textile index 0cd3b63b0..2a6c5014e 100644 --- a/app/views/help/import_formats.textile +++ b/app/views/help/import_formats.textile @@ -5,21 +5,25 @@ title: Formats d'imports  h3(#fmt). Formats disponibles
 -* Neptune : format d'échange de données de transport en commun pour la France (cf "Normalisation":normalisation)
 +* Neptune : format d'échange de données de transport en commun pour la France (cf ["Normalisation":http://www.normes-donnees-tc.org/format-dechange/donnees-theoriques/])
  * NeTEx : format d'échange de données de transport en commun expérimental sur la future 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 le format 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://www.normes-donnees-tc.org/format-dechange/autres-normes/] 
 -p(olnext). - l'import limité au sous ensemble des arrêts permet de n'importer que les arrêts et les correspondances
 +p(olnext). - l'import GTFS limité au sous ensemble des arrêts permet de n'importer que les arrêts et les correspondances
  h3(#com). Paramètres communs
  * 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é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
 +
  * Fichier à importer := fichier (plat ou zip selon format)
  h3(#opt). Options des formats
 @@ -30,10 +34,10 @@ Les options des différents formats apparaissent en fonction de celui qui a étà * *NeTex* : pas d'option particulière
  * *GTFS* :  
  ** Préfixe d'identifiants : préfixe à utiliser pour générer les identifiants Neptune des objets importés, initialisé à la valeur définie pour l'espace de données.
 -** Distance max pour créer les zones : distance maximale entre deux arrêts homonymes pour les regrouper au sein d'un arrêt commercial de même nom, ces zones viennent en supplément de celles définies dans GTFS, une distance de 0 ne génère aucune zone.
 +** Distance max pour créer les zones : distance maximale entre deux arrêts homonymes pour les regrouper au sein d'un arrêt commercial de même nom, ces zones viennent en supplément de celles définies dans GTFS; une distance de 0 ne génère aucune zone.
  ** ignorer le dernier mot : lors de la comparaison des noms d'arrêts, cette option permet de ne pas prendre en compte le dernier mot du nom de l'arrêt (sauf si celui-ci n'est composé que d'un seul mot).
  ** ignorer les n derniers caractères : lors de la comparaison des noms d'arrêts, cette option permet de ne pas prendre en compte les derniers caractères du nom de l'arrêt (sauf si celui-ci n'a pas assez de caractères pour cela)
 -** Distance max pour créer les correspondances : distance maximale entre deux arrêts pour les lier par une correspondance, ces correspondances sont hors zone d'arrêt. Elles viennent en supplément de celles définies dans GTFS (ce mécanisme tient compte des correspondances exclues), une distance de 0 ne génère aucune correspondance.
 +** Distance max pour créer les correspondances : distance maximale entre deux arrêts pour les lier par une correspondance, ces correspondances sont hors zone d'arrêt: elles viennent en supplément de celles définies dans GTFS (ce mécanisme tient compte des correspondances exclues), une distance de 0 ne génère aucune correspondance.
  ** Sous-ensemble : choix permettant de limiter l'import aux seuls fichiers stops.txt et transfers.txt. Lors de l'import, les attributs d'adresse, localité et code postal ajoutés à l'export associé sont exploités :
  * *CSV* : 
  ** Préfixe d'identifiants : préfixe à utiliser pour générer les identifiants Neptune des objets importés, initialisé à la valeur définie pour l'espace de données.
\ No newline at end of file diff --git a/app/views/help/imports.textile b/app/views/help/imports.textile index ddc93edc0..ca085532d 100644 --- a/app/views/help/imports.textile +++ b/app/views/help/imports.textile @@ -7,16 +7,17 @@ title: Imports  * "Validation":#val  * "l’onglet IMPORTS":#imp  * "Nouvel Import":#new -* "Paramètres de validation":pvl +* "Paramètres de validation":#pvl  * "Consultation des résultats":#res  * "Résultats de validation":#rvl  h3(#rol). Rôle -p. L’import permet d’enregistrer dans la base un jeu de données d'offre TC, selon un format au choix. Des tests de validation des données sont exécutés avant l'import en base de données (plus détaillées dans le cas du format Neptune). Il est possible d'importer sans sauver en base, uniquement pour jouer les tests de vérification de conformité. Dans ce cas les tests en base de données (auxquels sont associés les jeux de paramètres) ne seront pas exécutés (et donc aucun test ne sera exécuté, pour des données CSV, GTFS, ou Netex). +p. L’import permet d’enregistrer dans la base un jeu de données d'offre TC, selon un format au choix. Des tests de validation des données sont exécutés avant l'import en base de données (plus détaillées dans le cas du format Neptune). Il est possible d'importer sans sauver en base, uniquement pour jouer les tests de vérification de conformité. Dans ce cas, les tests en base de données (auxquels sont associés les jeux de paramètres) ne seront pas exécutés (et donc aucun test ne sera exécuté, pour des données CSV, GTFS, ou Netex). -!2014-10-31_151613.png! Page des imports +p=. !2014-10-31_151613.png!  +Page des imports  h3(#val). Validation @@ -26,9 +27,9 @@ p. Lors de l'import, des tests sont effectués :  # sur la complétude et la cohérence des relations exprimées dans le format d'échange  # optionnellement sur la qualité des données en vue de son exploitation dans une centrale de mobilité -p(olnext). - nécessite la fourniture d'un jeu de paramètres définissant les seuils (cf "Validation":validations)  +p(olnext). - la validation nécessite la fourniture d'un jeu de paramètres définissant les seuils (cf "Validation":validations)  -p(note). Les tests de niveau 1 et 2 ne sont actuellement implémentés que pour le format Neptune +p(note). Les tests de niveau 1 et 2 ne sont actuellement implémentés que pour le format Neptune.  h3(#imp). l'onglet IMPORTS @@ -43,20 +44,20 @@ p. Comme les fichiers importés restent stockés en base, il est opportun que  l  p. Dans la partie droite de l'écran,  -* créer un nouvel Import +* Créer un nouvel Import  * Jeu de paramètres  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é sauvegardé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 supprime é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 ».  h3(#pvl). Paramètres de validation -p. Il est possible de modifier le jeu de paramètres par défaut ou de créer un nouveau Jeu de paramètres. Les paramètres de vitesses et durée entre arrêts successifs sont définis mode par mode. +p. Il est possible de modifier le jeu de paramètres par défaut, ou de créer un nouveau Jeu de paramètres. Les paramètres de vitesses et durée entre arrêts successifs sont définis mode par mode.  h3(#res). Consultation des résultats : détail de l'objet Import @@ -98,13 +99,13 @@ p(border_image). !import_line_result.png!  * courses  * missions -p. La sélection de l'histogramme affiche le détail des lignes lues : +p. La sélection de l'histogramme (clic) affiche le détail des lignes lues :  p(border_image). !import_line_detail.png! -p. un survol affiche le nombre de données concernées par type. +p. Un survol affiche le nombre de données concernées par type. -p. la sélection du graphique affiche le détail par ligne +p. La sélection du graphique affiche le détail par ligne.  h3(#rvl). Résultats de validation diff --git a/app/views/help/index.textile b/app/views/help/index.textile index 79d3b02e9..a94fa7f89 100644 --- a/app/views/help/index.textile +++ b/app/views/help/index.textile @@ -27,10 +27,9 @@ h3. Notes de version  h4. Version 2.5.1  * Nouvelles foctionnalités : -** refonte de l'import/export GTFS -** ajout des couleurs de lignes -** ajout de l'URL d'une page web pour les transporteurs, lignes et les arrêts -** ajout du fuseau horaire pour les transporteurs et les arrêts. +** Reprise des imports/exports GTFS +** Ajout des couleurs de lignes +** Ajout de champs pour les échanges GTFS   h4. Version 2.5.0 diff --git a/app/views/help/introduction.textile b/app/views/help/introduction.textile index b9c6e0f02..78fdfa561 100644 --- a/app/views/help/introduction.textile +++ b/app/views/help/introduction.textile @@ -7,7 +7,7 @@ CHOUETTE est un logiciel libre développé à l'initiative du ministère frança  !2014-10-30_172801.png! -CHOUETTE est une application web. Elle permet de saisir, éditer, tester des données théoriques de transport public depuis un navigateur internet. Afin de faciliter la création de réseaux complets. Elle est dotée de fonctions d'import, soit depuis d'autres formats d'applications équivalentes, soit au travers d'un fichier CSV qui permet de mener des imports massifs plutôt que de saisir tous les éléments un a un dans les formulaires adhoc. +CHOUETTE est une application web. Elle permet de saisir, éditer, tester des données théoriques de transport public depuis un navigateur internet. Afin de faciliter la création de réseaux complets, elle est dotée de fonctions d'import, soit depuis d'autres formats d'applications équivalentes, soit au travers d'un fichier CSV qui permet de mener des imports massifs plutôt que de saisir tous les éléments un à un dans les formulaires adhoc.  h3. A qui s'adresse ce manuel ? diff --git a/app/views/help/journey_patterns.textile b/app/views/help/journey_patterns.textile index 1eb45b5fe..7224d1f6c 100644 --- a/app/views/help/journey_patterns.textile +++ b/app/views/help/journey_patterns.textile @@ -5,7 +5,7 @@ title: Missions  h3. Définition
 -Une _"Mission"_ est une sélection ordonnée d'arrêts issue d'une séquence d'arrêts de à partir de laquelle il sera possible de créer des courses, c'est à dire d'associer différents horaires à la mission. Les arrêts de la mission sont toute ou partie des arrêts de la séquence d'arrêts.
 +Une _"Mission"_ est une sélection ordonnée d'arrêts issue d'une séquence d'arrêts de à partir de laquelle il sera possible de créer des courses, c'est à dire d'associer différents horaires à la mission. Les arrêts de la mission sont tout ou partie des arrêts de la séquence d'arrêts.
  Une mission est spécifique à une _"séquence d'arrêts"_. Une même séquence d'arrêts peut contenir plusieurs missions différentes. 
 @@ -17,7 +17,8 @@ La création d'une mission se fait depuis la page d'une séquence d'arrêt. Pour  En bas du formulaire les arrêts sélectionnés dans la séquence d'arrêts sont sélectionnables par des cases à cocher.
 -!2014-10-31_113803.png! Sélection des arrêts d'une mission
 +!2014-10-31_113803.png! 
 +Sélection des arrêts d'une mission
  h3. Modifier une mission
 @@ -31,10 +32,10 @@ La suppression de la mission est également possible depuis la page de la séque  h3. Attributs
 -* Nom := nom de la mission
 -* Nom public := nom public pour les voyageurs
 -* Numéro d'enregistrement := Le numéro d'enregistrement est unique. Aucune règle de nommage ne s'applique sur ce numéro. Celui-ci doit être unique sur l'ensemble des missions de la ligne.
 -* Commentaire := zone de texte libre 
 +* Nom : nom de la mission
 +* Nom public : nom public pour les voyageurs
 +* Numéro d'enregistrement : Le numéro d'enregistrement est unique. Aucune règle de nommage ne s'applique sur ce numéro. Celui-ci doit être unique sur l'ensemble des missions de la ligne.
 +* Commentaire : zone de texte libre 
 diff --git a/app/views/help/lines.textile b/app/views/help/lines.textile index 2415b5ace..44f6f049b 100644 --- a/app/views/help/lines.textile +++ b/app/views/help/lines.textile @@ -11,7 +11,7 @@ La ligne dispose d'un identifiant fonctionnel, une sorte de _"numéro d'enregist  h4. Liste des groupes de lignes
 -Sélectionner _"Lignes"_ dans le menu _"Données"_ affiche la liste des lignes existants dans l'espace de données. 
 +Sélectionner _"Lignes"_ dans le menu _"Données"_ affiche la liste des lignes existantes dans l'espace de données. 
  h4. Ajouter une ligne
 @@ -19,7 +19,7 @@ Depuis la liste des groupe de lignes, cliquer sur  _"Ajouter une ligne"_ dans la  Un formulaire s'affiche. Les champs obligatoires sont signalés par des astérisques. 
 -Dans le champs, _"Groupes de lignes associés"_, saisir les premiers caractères d'une ligne. L'auto-complétion présentera les groupes de lignes correspondant à la saisie. Taper sur _"Entrée"_ valide la proposition. Il est à noter que ces associations fonctionne dans les deux sens et qu'il est également possible de rajouter une ligne dans un groupe de ligne depuis la page d'un groupe de lignes. 
 +Dans le champ, _"Groupes de lignes associés"_, saisir les premiers caractères d'une ligne. L'auto-complétion présentera les groupes de lignes correspondant à la saisie. Taper sur _"Entrée"_ valide la proposition. Il est à noter que ces associations fonctionnent dans les deux sens et qu'il est également possible de rajouter une ligne dans un groupe de lignes depuis la page d'un groupe de lignes. 
  h4. Afficher une ligne existante
 @@ -37,17 +37,18 @@ En bas de la page, un lien _"Liste des arrêts de la ligne"_ affiche la liste de  Les arrêts des différentes séquences d'arrêts apparaissent sur la cartographie. Une infobulle permet de connaître le nom de l'arrêt et rappelle le type d'arrêt.
 -!2014-10-31_112140.png! Vue d'une ligne.
 +!2014-10-31_112140.png! 
 +Vue d'une ligne.
 -h4. Modifier une lignes
 +h4. Modifier une ligne
  On peut modifier une ligne en cliquant sur le bouton de modification directement depuis la liste des lignes ou depuis la page d'une ligne particulière. 
  h4. Supprimer une ligne
 -On peut supprimer une ligne en cliquant sur le bouton de suppression directement depuis la liste des lignes ou depuis la page d'une ligne particulière. Il est à noter que les itinéraires rattachés à ce groupe de lignes ne seront pas supprimés [à vérifier]. Il sera toujours possible de les rattacher à une autre ligne par la suite. 
 +On peut supprimer une ligne en cliquant sur le bouton de suppression directement depuis la liste des lignes ou depuis la page d'une ligne particulière. Il sera toujours possible de les rattacher à une autre ligne par la suite. 
 -Dans le menu latéral situé à droite, un lien _"activer la sélection multiple"_ permet d'afficher des cases à cocher sur chacun des éléments de la liste. Ces cases permettent de définir les lignes qui pourront être supprimées en même temps. Une fois la sélection multiple activiée, deux raccourcis permettent de tout sélectionner et de tout déselectionner. 
 +Dans le menu latéral situé à droite, un lien _"activer la sélection multiple"_ permet d'afficher des cases à cocher sur chacun des éléments de la liste. Ces cases permettent de définir les lignes qui pourront être supprimées en même temps. Une fois la sélection multiple activée, deux raccourcis permettent de tout sélectionner et de tout désélectionner. 
  h3. Attributs d'une ligne
 @@ -56,13 +57,13 @@ h3. Attributs d'une ligne  * Nom : nom de la ligne 
  * Nom public : nom de la ligne connu des usagers
  * Numéro d'enregistrement : code référençant une ligne au sein d'une autorité supérieure
 -* Indice : indice ou numéro de la ligne (ce champ n'est pas obligatoirement numérique)
 -* Mode de transport : mode de transport principal de la ligne. Le cas échéant, d'autres modes de transports particuliers peuvent être indiqués au niveau de chaque course. 
 +* Indice : indice ou numéro de la ligne (ce champ n'est pas obligatoirement numérique). Il s'agit de la désignation simple de la ligne comme par exemple un numéro, une lettre etc...
 +* Mode de transport : mode de transport principal de la ligne. Le cas échéant, d'autres modes de transport particuliers peuvent être indiqués au niveau de chaque course. 
  * Couleur du tracé	: couleur en rvb hexadécimal du tracé de ligne et du fond de texte
  * Couleur de texte	: couleur en rvb hexadécimal du texte du nom de la ligne
  * Page web associée	: adresse http ou https de la page du site public décrivant la ligne
  * Accessibilité PMR	: précise si la ligne est équipée PMR
 -* Transport à la demande : précise si la ligne est en exploitation à la demande ou pas [préciser si c'est également définissable au niveau de la course]
 +* Transport à la demande : précise si la ligne est en exploitation à la demande ou pas
  * Commentaire : zone de texte libre sur la ligne
  * Groupes de lignes : _"groupes de lignes"_ auxquels appartient la ligne
 diff --git a/app/views/help/metadata.textile b/app/views/help/metadata.textile index a405db3f3..a8c1cf405 100644 --- a/app/views/help/metadata.textile +++ b/app/views/help/metadata.textile @@ -5,19 +5,20 @@ title: Métadonnées  Tous les éléments définis dans CHOUETTE sont identifiés par des métadonnées Neptune spécifiques. Ces métadonnées peuvent être générées automatiquement à la création de l'objet de telle sorte qu'il n'est pas nécessaire de les renseigner. Il reste toutefois possible de leur attribuer une valeur manuellement si nécessaire. 
 -Chaque type est identifié par une clé qui permet de déterminer quel est sa nature (arrêt, ligne, transporteur etc...). La norme suggère des clés types qui sont résumées dans le tableau ci-dessous.
 +Chaque type est identifié par une clé qui permet de déterminer quel est sa nature (arrêt, ligne, transporteur etc...). La norme propose des clés types qui sont résumées dans le tableau ci-dessous.
  h3. Métadonnées d'un transporteur
  * Identifiant Neptune : Il s'agit d'un clé unique pérenne identifiant le transporteur pour les échanges Neptune. Cet identifiant est composé de 3 parties : 
  ** préfixe : clé identifiant un producteur de données unique
 -** type = Company : clé identifiant le type d'objet (valeur imposée)
 +** 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.
  * Date de création : date à laquelle l'objet a été créé ou modifié pour la dernière fois
  * Version : version de l'objet (auto incrémenté à chaque modification)
  * Créé par : compte utilisateur ayant procédé à la dernière modification
 -!2014-10-30_175715.png! Exemple d'identifiant Neptune
 +!2014-10-30_175715.png! 
 +Exemple d'identifiant Neptune
  h3. Clés
 diff --git a/app/views/help/navigation.textile b/app/views/help/navigation.textile index fa51bd5d9..38a6027d2 100644 --- a/app/views/help/navigation.textile +++ b/app/views/help/navigation.textile @@ -15,15 +15,19 @@ Le bandeau supérieur regroupe l'essentiel des liens de navigation :  * L'accès à la page d'aide qui s'ouvre un nouvel onglet.
  * Les préférences utilisateurs, notamment le choix de langue et les paramètres du compte.
 -!2014-10-30_173410.png! Bandeau supérieur de CHOUETTE
 +!2014-10-30_173410.png!
 +Bandeau supérieur de CHOUETTE
  h3. Listes d'éléments
  Les listes prennent la forme de "_boites_" rangées côte à côte. Dans le cas où le titre de l'élément est trop long pour être affiché entièrement, une infobulle complète apparaît au survol du titre. 
 -Les éléments de l'application qui apparaissent sous la forme de liens sont ceux qui peuvent faire l'objet d'un paramétrage détaillés. Il s'accompagnent dans les listes de pictogramme de modification et de suppression. Le pictogramme de modification ne concerne que les propriétés générales de l'élément et non pas les informations spécifiques qu'il regroupe. Il faut cliquer sur le lien proprement dit pour pouvoir consulter et éditer les informations correspondantes. Le pictogramme de suppression permet de supprimer effectivement toutes les informations correspondant à l'élément.
 +Les éléments de l'application qui apparaissent sous la forme de liens sont ceux qui peuvent faire l'objet d'un paramétrage détaillé. Ils s'accompagnent dans les listes de pictogrammes de modification et de suppression. 
 -!2014-10-30_173506.png! Exemple de liste d'éléments
 +Le pictogramme de modification ne concerne que les propriétés générales de l'élément et non pas les informations spécifiques qu'il regroupe. Il faut cliquer sur le lien proprement dit pour pouvoir consulter et éditer les informations correspondantes. Le pictogramme de suppression permet de supprimer effectivement toutes les informations correspondant à l'élément.
 +
 +!2014-10-30_173506.png! 
 +Exemple de liste d'éléments
  Les listes d'éléments peuvent dans certains cas être réduites afin de ne pas surcharger la page. Cliquer sur le titre de la liste permet d'afficher la liste des éléments.
 @@ -31,9 +35,10 @@ h3. Fonctions d'édition  Les fonctions d'édition des données proprement dites se situent à droite de l'affichage principal. 
 -!2014-10-30_173604.png! Fonctions d'édition des arrêts
 +!2014-10-30_173604.png! 
 +Fonctions d'édition des arrêts
 -h3. Déplacement d'un objet sur la cartographie
 +h3. Pointage et déplacement d'un objet sur la cartographie
  CHOUETTE permet de déplacer élément, arrêt ou accès par exemple, sur la cartographie. Pour cela il convient :
 @@ -42,19 +47,22 @@ CHOUETTE permet de déplacer élément, arrêt ou accès par exemple, sur la car  * de relâcher le bouton, l'arrêt est positionné sur une nouvelle position fixe.
  * de cliquer sur la carte permet de sortir du mode déplacement et de finaliser le déplacement en mettant les coordonnées à jour dans le formulaire
 -!2014-10-30_173740.png! Déplacement d'un arrêt sur la cartographie
 +!2014-10-30_173740.png! 
 +Déplacement d'un arrêt sur la cartographie
  h3. Auto-complétion
 -De nombreux champs de CHOUETTE font appel à des fonctions d'auto-complétion de telle sorte que des éléments tapés dans le champs font automatiquement remonter des éléments pertinents déjà connus du système. 
 +De nombreux champs de CHOUETTE font appel à des fonctions d'auto-complétion de telle sorte que des caractères saisis dans le champ font automatiquement remonter des éléments pertinents déjà connus du système. 
 -!2014-10-30_173913.png! Auto-complétion sur la sélection d'un arrêt.
 +!2014-10-30_173913.png! 
 +Auto-complétion sur la sélection d'un arrêt.
  h3. Architecture de l'interface de CHOUETTE
 -Un certain nombre d'éléments constitutifs de la base de données sont accessibles en tant que sous éléments de menus accessibles depuis la page. Il en va ainsi par exemple des horaires qui sont accessibles au travers des lignes puis des séquences d'arrêts. Il est conseillé à l'utilisateur débutant de se reporter au chapitre _"Créer un réseau à partir de zéro"_ situé en annexe pour un rappel de l'ordre dans lequel il faut créer les éléments du réseau.
 +Un certain nombre d'éléments constitutifs de la base de données sont accessibles en tant que sous éléments de menus accessibles depuis une page. Il en va ainsi par exemple des horaires, qui sont accessibles au travers des lignes puis des séquences d'arrêts. Il est conseillé à l'utilisateur débutant de se reporter au chapitre _"Créer un réseau à partir de zéro"_ situé en annexe pour un rappel de l'ordre dans lequel il faut créer les éléments du réseau.
 -!navigation.png! Navigation au sein de l'application CHOUETTE
 +!navigation.png! 
 +Navigation au sein de l'application CHOUETTE
 diff --git a/app/views/help/networks.textile b/app/views/help/networks.textile index e91ac0f19..d4faf70aa 100644 --- a/app/views/help/networks.textile +++ b/app/views/help/networks.textile @@ -12,7 +12,7 @@ Chaque réseau dispose d'un identifiant fonctionnel (<< numéro d'enregistrement  h3. Attributs  * Nom :nom du réseau  -* Numéro d'enregistrement : code référençant un réseau au sein d'une autorité supérieure +* Numéro d'enregistrement : code référençant un réseau au sein d'une autorité organisatrice  * Commentaire : zone de texte libre sur le réseau  * Date de version : date de mise en référence de l'ensemble des constituants du réseau  * Description : description du réseau diff --git a/app/views/help/parametersets.textile b/app/views/help/parametersets.textile index f3cc61e87..733f0bb75 100644 --- a/app/views/help/parametersets.textile +++ b/app/views/help/parametersets.textile @@ -5,18 +5,18 @@ title: Jeux de paramètres de validation  h3. Définition
 -CHOUETTE intègre un outil de validation de la base de données qui permet de détecter les erreurs les plus grossières qui auraient pu être laissée dans la base de données. Un ensemble de tests est disponible mais il n'est pas obligatoire de les passer tous. L'utilisateur peut créer son propre jeu de tests au travers d'un _"jeu de paramètres"_ dans le menu validation. 
 +CHOUETTE intègre un outil de validation de la base de données qui permet de détecter les erreurs les plus grossières qui auraient pu être laissées dans la base de données. Un ensemble de tests est disponible mais il n'est pas obligatoire de les passer tous. L'utilisateur peut créer son propre jeu de tests au travers d'un _"jeu de paramètres"_ dans le menu validation. 
  Les paramètres de tests peuvent donc être choisis afin d'adapter les tests à 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é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.
 +Un jeu de paramètres 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.
  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 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. Il s'agit du format WGS84 normé également utilisé dans googlemaps ou open street map.
 +* 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 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és, décimaux, positifs à l'est et au nord. Il s'agit du format WGS84 normé également utilisé dans GoogleMaps ou Open Street Map.
  * Durée maximum de stationnement à un arrêt (en secondes) := écart de temps maximal autorisé entre l'heure d'arrivée et l'heure de départ à un arrêt
  p. *Distance minimum entre :* (en mètres)
 @@ -34,7 +34,7 @@ p. *Distance maximum entre :* (en mètres)  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 : voyageur qui a un connaissance théorique du réseau
 +* un voyageur ordinaire : voyageur qui a une connaissance théorique du réseau
  * un voyageur occasionnel : voyageur qui ne connaît pas le réseau
  * un voyageur habituel : voyageur qui connaît bien le réseau
  * un voyageur à mobilité réduite : voyageur qui a des difficultés de déplacement
 diff --git a/app/views/help/relationship.textile b/app/views/help/relationship.textile index dce0e7acf..41bbf756f 100644 --- a/app/views/help/relationship.textile +++ b/app/views/help/relationship.textile @@ -7,7 +7,7 @@ h3. Regroupements des différents niveaux d'arrêts  Les arrêts de différents niveaux hiérarchiques peuvent être liés ensemble. 
 -Ainsi on obtient les possibilités de regroupements suivants:
 +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).
 @@ -18,11 +18,12 @@ Pour ne pas aboutir à un système trop complexe, les règles suivantes sont pos  * 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.
 -!2014-10-30_180536.png! Exemple d'arrêt commercial contenant un arrêt physique
 +!2014-10-30_180536.png! 
 +Exemple d'arrêt commercial contenant un arrêt physique
  h3. Création et modification des relations de parenté
 -Les liens de parentalité entre les arrêts se créent depuis un arrêt déjà existant, qu'il soit parent ou fils. Il peut s'agir de mettre en relation deux arrêts déjà existants ou bien de créer un nouvel arrêt en relation à partir de l'arrêt courant. 
 +Les liens de parenté entre les arrêts se créent depuis un arrêt déjà existant, qu'il soit parent ou fils. Il peut s'agir de mettre en relation deux arrêts déjà existants ou bien de créer un nouvel arrêt en relation à partir de l'arrêt courant. 
  * Gérer le parent : Cette fonction affiche soit un champ de recherche pour rechercher et définir le parent si le lien n'existe pas encore, soit le nom du parent pour consultation avec une petite croix pour supprimer le lien de parenté si le lien est déjà établi. Supprimer le lien de parenté ne supprime pas l'arrêt proprement dit. 
  * Cloner pour créer un père : Cette fonction crée un arrêt identique de niveau hiérarchique supérieur. 
 @@ -35,12 +36,14 @@ h4. Depuis les niveaux _"point d'embarquement"_ ou _"quai"_  Les niveaux _"point d'embarquement"_ et _"quai"_ étant les plus bas, ils ne peuvent pas être reliés à des arrêts fils. En conséquence seul un bouton _"Gérer le parent"_ est systématiquement disponible. Le bouton _"cloner pour créer un père"_ apparaît s'il existe déjà un arrêt parent. 
 -!2014-10-30_180955.png! Gestion d'un arrêt parent
 +!2014-10-30_180955.png! 
 +Gestion d'un arrêt parent
  h4. Depuis le niveau _"arrêt commercial"_ ou _"Pôle d'échange"_
  !commercialstoppoint.png! ou !stopplace.png!
 -Ces deux niveaux permettent à la fois de définir de nouveaux fils et de rattacher l'arrêt commercial à un parent de type "pôle d'échange". Ils disposent donc à la fois des fonctions de gestion et de clonage de parents et de fils. A noter que les arrêts de niveaux pôle d'échange qui sont hiérarchiquement les plus élevés peuvent avoir un et un seul autre pôle d'échange comme parent. Deux pôles d'échange peuvent être parents l'un de l'autre. 
 +Ces deux niveaux permettent à la fois de définir de nouveaux fils et de rattacher l'arrêt commercial à un parent de type "pôle d'échange". Ils disposent donc à la fois des fonctions de gestion et de clonage de parents et de fils. A noter que les arrêts de niveaux pôle d'échange (qui sont hiérarchiquement les plus élevés) peuvent avoir un et un seul autre pôle d'échange comme parent. Deux pôles d'échange peuvent être parents l'un de l'autre. 
 -!2014-10-30_181044.png! Gestion de relation père-fils depuis un arrêt commercial
\ No newline at end of file +!2014-10-30_181044.png! 
 +Gestion de relation père-fils depuis un arrêt commercial
\ No newline at end of file diff --git a/app/views/help/routes.textile b/app/views/help/routes.textile index f15c390a7..eb1093340 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
 -Une _"séquence d'arrêts"_ est une sélection ordonnée d'arrêts à partir de laquelle il sera possible de créer des missions comprenant tout ou partie des arrêts de la séquence. Sur ces missions, se rajouterons pour finir les horaires des différentes courses. 
 +Une _"séquence d'arrêts"_ est une sélection ordonnée d'arrêts à partir de laquelle il sera possible de créer des missions comprenant tout ou partie des arrêts de la séquence. Sur ces missions, se rajouteront pour finir les horaires des différentes courses. 
  Une séquence d'arrêts est spécifique à une _"ligne"_. Une même ligne peut contenir plusieurs séquences d'arrêts différentes. On retrouve les séquences d'arrêts d'une ligne en bas de la page de la ligne en question. Les séquences d'arrêts n’apparaissent donc pas dans le menu de navigation de CHOUETTE. Il convient de se rendre sur la page de la ligne pour les consulter et les éditer. 
 @@ -13,7 +13,8 @@ Une séquence d'arrêts est spécifique à une _"ligne"_. Une même ligne peut c  Dans la page de la ligne, la séquence d'arrêts apparaît sur la cartographie. Le nom et le type de chaque arrêt est accessible par une infobulle. Le premier arrêt de la ligne est signalé par la couleur verte, le dernier par du rouge. 
 -!2014-10-31_113648.png! Vue cartographique des séquences d'arrêts
 +!2014-10-31_113648.png!
 +Vue cartographique des séquences d'arrêts
  Les différentes séquences d'arrêts peuvent regrouper des arrêts communs et comporter des doublons d'arrêts.
 @@ -21,13 +22,13 @@ Les différentes séquences d'arrêts peuvent regrouper des arrêts communs et c  h3. Créer une séquence d'arrêts
 -La création d'une séquence d'arrêt se fait depuis la page d'une ligne. Pour créer une séquence d'arrêt il convient de cliquer sur _"Ajouter une séquence d'arrêts"_ dans le menu latéral à droite. Un formulaire de création s'affiche alors.
 +La création d'une séquence d'arrêts se fait depuis la page d'une ligne. Pour créer une séquence d'arrêt il convient de cliquer sur _"Ajouter une séquence d'arrêts"_ dans le menu latéral à droite. Un formulaire de création s'affiche alors.
 -En bas du formulaire deux liens permettent soit de rajouter des arrêts à la séquence, soit de créer un nouvel arrêt pour le rajouter à la séquence.
 +En bas du formulaire, deux liens permettent soit de rajouter des arrêts à la séquence, soit de créer un nouvel arrêt pour le rajouter à la séquence.
  h4. Créer un nouvel arrêt pour l'ajouter
 -Cliquer sur créer un nouvel arrêt renvoie l'utilisateur à la page de création d'arrêt. Il est à noter qu'il devra retourner par lui même dans sur l'interface de création de séquence d'arrêt pour reprendre son travail. La création d'un arrêt depuis la page de création de séquence d'arrêt ne s'inscrit pas dans un workflow intégré. Il est donc préférable de s'assurer que tous les arrêts nécessaires à la création de la séquence sont déjà saisis avant de commencer à créer la séquence. 
 +Cliquer sur créer un nouvel arrêt renvoie l'utilisateur à la page de création d'arrêt. Il est à noter qu'il devra retourner par lui même dans sur l'écran de création de séquence d'arrêt pour reprendre son travail. 
  h4. Ajouter un arrêt
 @@ -37,17 +38,18 @@ Le pictogramme en forme de poubelle en début de ligne permet de supprimer l'ét  Le pictogramme en forme de flèches (dans les 4 directions) permet de modifier l'ordre des arrêts dans la séquence. Il faut bien entendu au moins deux arrêts pour pouvoir modifier l'ordre des arrêts. 
 -Une fois qu'un arrêt est sélectionné, une petite croix apparait au bout de la zone contenant le nom de l'arrêt. Cliquer sur cette croix efface l'arrêt sélectionné et permet d'en saisir un nouveau. 
 +Une fois qu'un arrêt est sélectionné, une petite croix apparaît au bout de la zone contenant le nom de l'arrêt. Cliquer sur cette croix efface l'arrêt sélectionné et permet d'en saisir un nouveau. 
  h3. Modifier une séquence d'arrêts
  On peut modifier une séquence d'arrêts en cliquant sur le bouton de modification directement depuis la liste des lignes ou depuis la page de la séquence d'arrêts que l'on souhaite modifier. L'ordre des arrêts de la séquence peut être modifié par glisser-déposer.
 -!2014-10-31_112543.png! Modification des arrêts d'une séquence
 +!2014-10-31_112543.png! 
 +Modification des arrêts d'une séquence
  h3. Supprimer une séquence d'arrêts
 -Il est possible de supprimer une séquence d'arrêt depuis la page de la ligne. Chaque élément de la liste des séquences d'arrêt en bas de la page est dotée d'un pictogramme de suppression. Il est à noter que la suppression de la séquence d'arrêts ne supprime par les arrêts qu'elle contient. 
 +Il est possible de supprimer une séquence d'arrêts depuis la page de la ligne. Chaque élément de la liste des séquences d'arrêts en bas de la page est dotée d'un pictogramme de suppression. Il est à noter que la suppression de la séquence d'arrêts ne supprime par les arrêts qu'elle contient. 
  La suppression de la séquence est également possible depuis la page de la séquence elle-même. Le lien _"Supprimer cette séquence d'arrêts"_ efface la séquence courante. 
 diff --git a/app/views/help/search_filter.textile b/app/views/help/search_filter.textile index 56488db4b..ca8228903 100644 --- a/app/views/help/search_filter.textile +++ b/app/views/help/search_filter.textile @@ -5,14 +5,16 @@ title: Recherche et filtrage  h3. Étiquettes
 -Afin d'organiser les calendriers dont le nombre peut être assez important, une fonction permet d'y adjoindre une ou plusieurs étiquettes. Pour créer une nouvelle étiquettes, il suffit de taper son nom dans le champ "_étiquettes_" puis de cliquer sur entrée. Il est possible de les supprimer en cliquant sur la petite croix de l'étiquette déjà existante. Pour adjoindre une étiquette déjà existante, taper les premières lettres de l'étiquette permettra de la faire apparaître par auto-complétion et de la sélectionner. 
 +Afin d'organiser les calendriers (dont le nombre peut être assez important), une fonction permet d'y adjoindre une ou plusieurs étiquettes. Pour créer une nouvelle étiquette, il suffit de taper son nom dans le champ "_étiquettes_" puis d'appuyer sur entrée. Il est possible de les supprimer en cliquant sur la petite croix de l'étiquette déjà existante. 
 -!2014-10-30_173913.png! Sélection et création d'étiquettes
 +!2014-10-30_173913.png! 
 +Sélection et création d'étiquettes
  h3. Recherche et filtrage
 -Certaines listes sont trop longues, notamment pour les arrêts, pour être affichées sur une seule page. CHOUETTE propose alors des champs de recherche et de filtrage permettant de retrouver l'élément rechercher. Afin d'offrir une vue compacte, les fonctions avancées sont cachées et se révèlent lorsque l'on clique sur le lien de "_recherche avancée_".
 +Certaines listes (notamment pour les arrêts) sont trop longues pour être affichées sur une seule page. CHOUETTE propose alors des champs de recherche et de filtrage permettant de retrouver l’élément recherché. Afin d’offrir une vue compacte, les fonctions avancées sont cachées et se révèlent lorsque l’on clique sur le lien de "_recherche avancée_".
 -La recherche des périodes permet de rechercher par plage de dates de validité et par étiquette. Il suffit pour cela de sélectionner la ou les étiquette souhaitées en utilisant l'auto-complétion dans le champ correspondant.
 +La recherche des périodes permet de rechercher par plage de dates de validité et par étiquette. Il suffit pour cela de sélectionner la ou les étiquettes souhaitées en utilisant l'auto-complétion dans le champ correspondant.
 -!2014-10-30_174251.png! Filtre de recherche des arrêts
\ No newline at end of file +!2014-10-30_174251.png! 
 +Filtre de recherche des arrêts
\ No newline at end of file diff --git a/app/views/help/startingfromscratch.textile b/app/views/help/startingfromscratch.textile index 7b003d1f9..ef5586eb3 100644 --- a/app/views/help/startingfromscratch.textile +++ b/app/views/help/startingfromscratch.textile @@ -5,7 +5,7 @@ title: Créer un réseau à partir de zéro  h3. Créer un nouvel espace de données
 -Chaque réseau est généralement intégré dans un espace de donnée spécifique. Dans le cas où l'on cherche à créer une nouvelle ligne par exemple, on devra créer les éléments dans l'espace de données correspondant. 
 +Chaque réseau est généralement intégré dans un espace de données spécifique. Dans le cas où l'on cherche à créer une nouvelle ligne par exemple, on devra créer les éléments dans l'espace de données correspondant. 
  h3. Définir les attributs du réseau
 @@ -16,25 +16,26 @@ La première étape passe par la création dans un premier temps des attributs g  Chacun des ces éléments est indépendant de l'autre. On peut définir plusieurs réseaux et plusieurs transporteurs. 
 -!navigation.png! Navigation au sein de l'application CHOUETTE
 +!navigation.png! 
 +Navigation au sein de l'application CHOUETTE
  h3. Création des calendriers
 -Les calendriers sont associés aux courses. Ils devront donc être créés avant l'étape de création des courses. Ils nécessitent généralement un travail de mise à plat en fonction des horaires tels qu'ils ont été conçus. Un calendrier étant une série de date permettant de couvrir à la fois les plages de dates et les jours de la semaine auxquels la course fonctionne, il n'est pas rare que la création d'un nouveau réseau nécessite un nombre important de calendriers. Les fonctions d'étiquettes permettent de mieux les organiser dans CHOUETTE, toutefois, une étape préalable de conception des calendriers est généralement nécessaire pour saisir un nouveau réseau avec rigueur. 
 +Les calendriers sont associés aux courses. Ils devront donc être créés avant l'étape de création des courses. Ils nécessitent généralement un travail de mise à plat en fonction des horaires tels qu'ils ont été conçus. Un calendrier étant une série de dates permettant de couvrir à la fois les plages de dates et les jours de la semaine auxquels la course fonctionne, il n'est pas rare que la création d'un nouveau réseau nécessite un nombre important de calendriers. Les fonctions d'étiquettes permettent de mieux les organiser dans CHOUETTE, toutefois, une étape préalable de conception des calendriers est généralement nécessaire pour saisir un nouveau réseau avec rigueur. 
  h3. Création des arrêts et des correspondances
 -Les arrêts du réseaux peuvent ensuite être créés, soit directement par saisie dans le formulaire de CHOUETTE,soit par import. Dans l'hypothèse où le nouvel espace de donnée reprend des arrêts déjà existants dans un autre espace de données, il est possible de les exporter, de les compléter pour les réimporter ensuite. 
 +Les arrêts du réseaux peuvent ensuite être créés, soit directement par saisie dans le formulaire de CHOUETTE, soit par import. Dans l'hypothèse où le nouvel espace de données reprend des arrêts déjà existants dans un autre espace de données, il est possible de les exporter, de les compléter pour les réimporter ensuite. 
 -Les correspondances étant des liens entre deux arrêts il est possible de les déclarer dès l'étape de création des arrêts. 
 +Les correspondances étant des liens entre deux arrêts, il est possible de les déclarer dès l'étape de création des arrêts. 
  h3. Création des lignes 
 -La création des lignes en elle même n'est pas conditionnée à l'existence d'arrêts. La ligne permet de nommer la ligne et de définir un ensemble de paramètres de la ligne. 
 +La création des lignes permet de définir les grands paramètres généraux de la ligne, notamment son nom. Les arrêts proprement dits sont définis dans les séquences d'arrêts. 
  h4. Séquences d'arrêts
 -A l'intérieur de l'interface de ligne, l'étape suivante consiste à définir les séquences d'arrêts . Celles-ci sont constituées d'un ensemble d'arrêts ordonnés qui permettront de déterminer une ou plusieurs missions , c'est à dire un sous-ensemble de la séquence d'arrêts comportant tout ou partie de ses arrêts.
 +A l'intérieur de l'écran pour la ligne, l'étape suivante consiste à définir les séquences d'arrêts . Celles-ci sont constituées d'un ensemble d'arrêts ordonnés qui permettront de déterminer une ou plusieurs missions , c'est à dire un sous-ensemble de la séquence d'arrêts comportant tout ou partie de ses arrêts.
  Typiquement, une ligne aura deux séquences d'arrêts, une par sens de circulation. Il est tout à fait possible d'en créer d'autres, y compris avec des arrêts totalement différents d'une séquence à l'autre.  
 @@ -42,17 +43,17 @@ h4. Missions  Les missions définissent des trajets effectifs réalisés par les véhicules. Elles se définissent à l'intérieur de l'interface de gestion des séquences d'arrêts, elle-même étant un sous-élément de l'interface des lignes.
 -On peut créer autant de mission que nécessaire au sein d'une séquence d'arrêts. Chaque mission est néanmoins contrainte par les arrêts composant la séquence d'arrêts. On peut ne pas en retenir certains mais pas en rajouter qui ne serait pas dans la séquence. Par ailleurs, l'ordre des arrêts est contraint par celui défini dans la séquence d'arrêts. 
 +On peut créer autant de missions que nécessaire au sein d'une séquence d'arrêts. Chaque mission est néanmoins contrainte par les arrêts composant la séquence d'arrêts, à la fois en ce qui concerne les arrêts eux-mêmes que l'ordre dans lequel ils sont agencés. 
  h3. Horaires
 -Les horaires ne peuvent être définis qu'à la condition d'avoir paramétré les autres critères. L'interface de consultation et de saisie des horaires se situe au niveau de la mission. Pour retrouver les horaires, il convient donc de sélectionner Ligne>Séquence d'arrêts>horaire des courses.
 +Les horaires ne peuvent être définis qu'à la condition d'avoir paramétré les éléments précédents. L'interface de consultation et de saisie des horaires se situe au niveau de la mission. Pour retrouver les horaires, il convient donc de sélectionner Ligne>Séquence d'arrêts>Horaire des courses.
 -Les horaires des courses peuvent être saisis directement dans l'interface Chouette ou bien encore être édité dans un tableau par le biais d'une fonction "d'import / export" spécifique. Disponible depuis l'interface des horaires, elle ne concerne que ceux-ci. Il ne faut pas la confondre avec les imports / export de base de données dans le système. Il s'agit d'une fonction qui permet l'édition externe et les copier/coller massifs depuis un tableur. 
 +Les horaires des courses peuvent être saisis directement dans l'interface Chouette ou bien encore être édités dans un tableau par le biais d'une fonction "d'import / export" spécifique. Disponible depuis l'interface des horaires, elle ne concerne que ceux-ci. Il ne faut pas la confondre avec les imports / export de base de données dans le système. Il s'agit d'une fonction qui permet l'édition externe et les copier/coller massifs depuis un tableur. 
  A noter que l'édition directement dans CHOUETTE peut se faire au clavier. Le curseur placé dans le premier champ, la saisie sur le pavé numérique permet de saisir la valeur voulue. La touche tabulation permet passer du champ heure au champ minute puis de renseigner la suite de la fiche en colonne. Les liens _"Copier  arrivées vers départs"_ ou inversement permettent de dupliquer les données saisies dans le cas le plus fréquent où les horaires de départ et d'arrivé à l'arrêt sont confondus. 
 -L'export se fait au format .zip et comporte des fichier .csv des calendriers et des courses. Les versions modifiées doivent être uploadées en retour individuellement au format .csv. Il convient de ne surtout pas changer la structure des fichiers et de s'assurer que le format .csv n'ait pas été modifié par le tableur. Les saisies manuelles augmentant le risque d'erreur de saisie, il est fortement recommander de valider les données après un import .csv dans le menu _"Validations"_. 
 +L'export se fait au format .zip et comporte des fichiers CSV (.csv) des calendriers et des courses. Les versions modifiées doivent être uploadées en retour individuellement au format CSV. Il convient de ne surtout pas changer la structure des fichiers et de s'assurer que le format CSV n'ait pas été modifié par le tableur. Les saisies manuelles augmentant le risque d'erreur de saisie, il est fortement recommandé de valider les données après un import CSV dans le menu _"Validations"_. 
  h3. Groupe de lignes
 diff --git a/app/views/help/stop_areas.textile b/app/views/help/stop_areas.textile index 70d0f904c..77a07f493 100644 --- a/app/views/help/stop_areas.textile +++ b/app/views/help/stop_areas.textile @@ -9,21 +9,19 @@ Le référentiel des arrêts constitue un maillon essentiel du réseau, et se co  On recense tout d'abord les arrêts physiques, qualifiés de _"point d'embarquement"_ ou de _"quai"_.  
 -Du fait de l'existence de deux concepts dans le schéma TRIDENT, cet arrêt physique sera considéré par l'application comme une _"zone d'arrêt de premier niveau"_. Cette notion est nécessaire pour gérer les _"points d'arrêts sur itinéraire"_ utilisés par certains réseaux. 
 +Du fait de l'existence de deux concepts dans le schéma TRIDENT, cet arrêt physique sera considéré par l'application comme une _"zone d'arrêt de premier niveau"_. Cette notion est nécessaire pour gérer les _"points d'arrêt sur itinéraire"_ utilisés par certains réseaux. 
 -L'application gère ensuite les points d'arrêts sur itinéraire à partir de ces arrêts physiques, en assurant le regroupement des points d'arrêt sur itinéraire dans un arrêt physique. Cela permet notamment de prendre en compte les cas de plusieurs lignes passant par le même arrêt physique.
 +L'application gère ensuite les points d'arrêt sur itinéraire à partir de ces arrêts physiques, en assurant le regroupement des points d'arrêt sur itinéraire dans un arrêt physique. Cela permet notamment de prendre en compte les cas de plusieurs lignes passant par le même arrêt physique.
 -Par la suite, on peut regrouper deux (ou plus) arrêts physiques au sein d'un _"arrêt commercial"_. Cela permet par exemple de regrouper les points d'arrêt physiques correspondant à deux poteaux d'arrêt de la même ligne situés de part et d'autre d'une chaussée mais aussi de regrouper l'ensemble des points d'arrêt physiques d'un quai de gare routière pour lesquels on considère que le temps de correspondance est nul. Un tel cas correspond à une _"zone d'arrêt"_, avec qualification _"arrêt commercial"_, de deuxième niveau.
 +Par la suite, on peut regrouper deux (ou plus) arrêts physiques au sein d'un _"arrêt commercial"_. Cela permet par exemple de regrouper les points d'arrêt physiques correspondant à deux poteaux d'arrêt de la même ligne situés de part et d'autre d'une chaussée mais aussi de regrouper l'ensemble des points d'arrêt physiques d'une gare routière, pour lesquels on considère que le temps de correspondance est nul. Un tel cas correspond à une _"zone d'arrêt"_, avec qualification _"arrêt commercial"_, de deuxième niveau.
  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"_.
 -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) .
 +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).
 -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. Il ne s'agit pas à proprement parler d'un type d'arrêt mais bien d'un regroupement d'arrêts. [pourquoi ne pas le traiter dans les groupes d'arrêts du coup ?]
 +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. Il ne s'agit pas à proprement parler d'un type d'arrêt mais bien d'un regroupement d'arrêts.
 -[Créer diagramme hiérarchique des arrêts]
 -
 -Des pictogrammes permettent d'identifier les différents types de d'arrêts.
 +Des pictogrammes permettent d'identifier les différents types d'arrêts.
  * !boardingposition.png! point d'embarquement
  * !quay.png! quai
 @@ -47,17 +45,19 @@ Saisir l'adresse postale de l'arrêt proposera une géolocalisation qu'il sera t  h3. Consultation et édition d'un arrêt
 -Le nombre d'arrêts étant la plus part du temps assez important, il est probable que tous les arrêts ne puissent pas s'afficher sur la page des lignes. Des fonctions de recherche situées en haut de la page permettent de faire une recherche par le nom. Cliquer sur _"recherche avancée"_ permet de sélectionner des critères de recherche spécifiques par code postal et type d'arrêt.
 +Le nombre d'arrêts étant la plupart du temps assez important, il est probable que tous les arrêts ne puissent pas s'afficher sur la page des lignes. Des fonctions de recherche situées en haut de la page permettent de faire une recherche par le nom. Cliquer sur _"recherche avancée"_ permet de sélectionner des critères de recherche spécifiques par code postal et type d'arrêt.
  Pour afficher un arrêt existant, il suffit de cliquer sur le nom de l'arrêt depuis la liste des lignes existantes.
 -!2014-10-30_180447.png! Sélection d'un arrêt dans la liste des arrêts
 +!2014-10-30_180447.png!
 +Sélection d'un arrêt dans la liste des arrêts
  Une fois sur la page d'un arrêt, les arrêts de niveau hiérarchique différent et liés à l'arrêt consulté sont affichés sur la cartographie. Au survol des arrêts avec le curseur le nom de l'arrêt s'affiche dans une infobulle. 
 -!2014-10-30_180536.png! Hiérarchie des arrêts
 +!2014-10-30_180536.png! 
 +Hiérarchie des arrêts
 -On retrouve également en bas de la page, un lien _"Liens entre arrêts"_ qui affiche les liens hiérarchiques entre l'arrêt consulté et les autres arrêts auquel il est lié. Cet affichage permet d'accéder aux autres arrêts liés en cliquant les arrêts. Dans le cas d'un arrêt physique, il affiche également la séquence d'arrêt à laquelle il est rattaché. Autant les liens de parentalité sont définis dans les pages arrêts, autant la séquence d'arrêt est définie dans les pages _"lignes"_.
 +On retrouve également en bas de la page, un lien _"Liens entre arrêts"_ qui affiche les liens hiérarchiques entre l'arrêt consulté et les autres arrêts auquel il est lié. Cet affichage permet d'accéder aux autres arrêts liés en cliquant les arrêts. Dans le cas d'un arrêt physique, il affiche également la séquence d'arrêts à laquelle il est rattaché. 
  h4. Modifier un arrêt
 @@ -65,7 +65,7 @@ On peut modifier un arrêt en cliquant sur le bouton de modification directement  h4. Supprimer un arrêt
 -On peut supprimer une ligne en cliquant sur le bouton de suppression directement depuis la liste des lignes ou depuis la page d'une ligne particulière. Il est à noter que les itinéraires rattachés à ce groupe de lignes ne seront pas supprimés [à vérifier]. Il sera toujours possible de les rattacher à une autre ligne par la suite. 
 +On peut supprimer une ligne en cliquant sur le bouton de suppression directement depuis la liste des lignes ou depuis la page d'une ligne particulière. 
  h3. Attributs d'un arrêt
 @@ -83,7 +83,7 @@ h3. Attributs d'un arrêt  * Position X : coordonnée horizontale de l'arrêt dans le référentiel de projection de l'espace de données
  * Position Y : coordonnée verticale de l'arrêt dans le référentiel de projection de l'espace de données
  * Longitude : longitude de l'arrêt dans le référentiel WGS84
 -* latitude : latitude de l'arrêt dans le référentiel WGS84
 +* Latitude : latitude de l'arrêt dans le référentiel WGS84
 diff --git a/app/views/help/stopsmanagement.textile b/app/views/help/stopsmanagement.textile index 40b170d4f..f4022dec8 100644 --- a/app/views/help/stopsmanagement.textile +++ b/app/views/help/stopsmanagement.textile @@ -5,15 +5,15 @@ title: Modification des arrêts d'une ligne  h3. Nouvel arrêt ou modification d'arrêt existant 
 -Avec le temps, un ou plusieurs arrêts sont susceptibles de changer au sein d'une même ligne. Il est conseillé de faire la distinction entre les nouveaux arrêts et les arrêts modifiés. Si un arrêt est retiré d'une ligne et remplacé par un autre arrêt, il est conseillé de créer un nouvel arrêt correspondant et de faire la substitution dans la ligne. Il serait certes plus rapide de simplement changer le nom et la géolocalisation de l'arrêt désormais obsolète, mais la modification sera plus difficile à suivre et à comprendre. Il est également possible que cet arrêt resserve ultérieurement ou bien encore qu'il apparaisse dans d'autres bases de données exploitées par d'autres systèmes. Une simple modification de nom générerait alors de l’ambiguïté et des problèmes potentiels d'exploitations de ces données.
 +Avec le temps, un ou plusieurs arrêts sont susceptibles de changer au sein d'une même ligne. Il est conseillé de faire la distinction entre les nouveaux arrêts et les arrêts modifiés. Si un arrêt est retiré d'une ligne et remplacé par un autre arrêt, il est conseillé de créer un nouvel arrêt correspondant et de faire la substitution dans la ligne. Il serait certes plus rapide de simplement changer le nom et la géolocalisation de l'arrêt désormais obsolète, mais la modification sera plus difficile à suivre et à comprendre. Il est également possible que cet arrêt resserve ultérieurement ou bien encore qu'il apparaisse dans d'autres bases de données exploitées par d'autres systèmes. Une simple modification de nom générerait alors une ambiguïté et des problèmes potentiels d'exploitations de ces données.
  Dans le cas où il s'agit bien du même arrêt mais qui change soit de nom, soit de localisation, la modification est effectivement la marche à suivre. Il est conseillé de noter ces modifications en commentaire. En effet, il n'est pas rare qu'un même arrêt partagé par plusieurs réseaux possède plusieurs noms commerciaux et qu'un changement de nom ne soit pas connu de tous les partenaires transports. Annoter les modifications dans CHOUETTE facilitera la levée des ambiguïtés. 
  h3. Vérifier la cohérence des données de géolocalisation
 -L'une des erreurs les plus fréquentes sont les erreurs de géolocalisation. Dès lors qu'un arrêt fait partie d'une ligne, des vérifications automatiques seront menées, notamment pour vérifier que l'arrêt est effectivement géolocalisé et qu'il n'y a pas de distance aberrante entre deux arrêts. Une vérification visuelle permet également de vérifier la cohérence des données :
 +Les erreurs les plus fréquentes sont les erreurs de géolocalisation. Dès lors qu'un arrêt fait partie d'une ligne, des vérifications automatiques seront menées, notamment pour vérifier que l'arrêt est effectivement géolocalisé et qu'il n'y a pas de distance aberrante entre deux arrêts. Une vérification visuelle permet également de vérifier la cohérence des données :
  * L'arrêt est-il bien placé sur une voirie sur le fond cartographique ?
  * Les arrêts sont-ils bien placés sur la bonne commune ?
 -* La séquence d'arrêt visible depuis l'interface des lignes dessine-t-elle un trajet cohérent ? 
 +* La séquence d'arrêts visible depuis l'interface des lignes dessine-t-elle un trajet cohérent ? 
 diff --git a/app/views/help/temporaryline.textile b/app/views/help/temporaryline.textile index 6b71a0748..d14de7033 100644 --- a/app/views/help/temporaryline.textile +++ b/app/views/help/temporaryline.textile @@ -1,6 +1,6 @@  ---
  layout: default
 -title: Itinéraire valables le temps d'une saison
 +title: Itinéraires valables le temps d'une saison
  ---
  h3. Nouvelle ligne ou nouvelle séquence d'arrêts
 @@ -10,11 +10,11 @@ Certains réseaux mettent parfois en œuvre des lignes spécifiques à un évén  * Il s'agit d'une ligne à part entière disposant de son propre nom
  * Il s'agit d'un service rattaché à une ligne commerciale existante, même si l'itinéraire est différent.
 -Le traitement de cette nouvelle ligne se fera en accord avec le type de cas rencontré. Dans le premier cas, une nouvelle ligne devra être créée avec des calendriers adaptés. Ce faisant, il faudra anticiper l'emploi de la base de donnée dans les systèmes situés en aval de CHOUETTE. S'il s'agit par exemple d'un site internet, une nouvelle ligne, dotée d'identifiants neptune spécifique nécessitera une prise en compte dans le site internet avec probablement un macaron spécifique. 
 +Le traitement de cette nouvelle ligne se fera en accord avec le type de cas rencontré. Dans le premier cas, une nouvelle ligne devra être créée avec des calendriers adaptés. Ce faisant, il faudra anticiper l'emploi de la base de donnée dans les systèmes situés en aval de CHOUETTE. S'il s'agit par exemple d'un site internet, une nouvelle ligne, dotée d'identifiants Neptune spécifiques nécessitera une prise en compte dans le site internet avec probablement un macaron spécifique. 
 -Dans le second cas, la définition d'une séquence d'arrêts spécifique permettra de traiter le cas particulier au sein d'une même ligne, même si les itinéraires sont très différents des trajets commerciaux. Créer une séquence d'arrêt spécifique est préférable à la création d'une nouvelle ligne qui porterait un suffixe "été" par exemple car les identifiants de la ligne seront les mêmes et l'intégration de ce nouveau parcours au sein de la ligne dans les systèmes exploitant la base de données se fera plus facilement.
 +Dans le second cas, la définition d'une séquence d'arrêts spécifique permettra de traiter le cas particulier au sein d'une même ligne, même si les itinéraires sont très différents des trajets commerciaux. Créer une séquence d'arrêts spécifique est préférable à la création d'une nouvelle ligne qui porterait un suffixe "été" par exemple, car les identifiants de la ligne seront les mêmes et l'intégration de ce nouveau parcours au sein de la ligne dans les systèmes exploitant la base de données se fera plus facilement.
 -L'avantage de pouvoir définir autant de séquences d'arrêts que nécessaire, est de pouvoir traiter tous les cas spécifiques sans alourdir les données du cas standard. 
 +L'avantage de pouvoir définir autant de séquences d'arrêts que nécessaire est de pouvoir traiter tous les cas spécifiques sans alourdir les données du cas standard. 
  h3. Création de calendriers spécifiques
 diff --git a/app/views/help/terms.textile b/app/views/help/terms.textile index aa6c345d3..06192c084 100644 --- a/app/views/help/terms.textile +++ b/app/views/help/terms.textile @@ -3,5 +3,30 @@ layout: default  title: Glossaire
  ---
 -p. à renseigner
 +* Arrêt : Il existe différentes catégories d'arrêts qui permettent de décrire le réseau. Ils s'organisent hiérarchiquement.
 +* Arrêt Physique : Il s'agit d'une catégorie qui regroupe les points d'arrêt et les quais. Les _"arrêts physiques"_ ne sont pas un type d'arrêt paramétrable dans CHOUETTE. Un arrêt physique est un lieu géographique réel.
 +* Point d'arrêt : Les points sont des arrêts physiques sur la voirie ou au sein d'une gare routière, classiquement signalés par un poteau.
 +* Quai : Les quais sont des arrêts physiques de transports ferrés ou en site propre. 
 +* Arrêt commercial : Un arrêt commercial est un regroupement d'arrêts physiques (au moins un) desservant une même zone. Il est défini par un nom d'arrêt comme par exemple, "Mairie" ou bien encore "Gare routière".
 +* Pôle d'échange : Un pôle d'échange est un regroupement de un ou plusieurs arrêts commerciaux. Un pôle d'échange peut aussi contenir un autre pôle d'échange.
 +* Accès : Type d'accès physique (escalier, ascenseur, escalator) d'un arrêt.
 +* Correspondance : Les correspondances permettent de déterminer la possibilité de couvrir la distance entre deux arrêts proches à pied et de préciser les temps de parcours.
 +* Code INSEE : Code unique par commune. Contrairement au code postal qui peut être partagé par plusieurs petites communes ou au contraire ne concerner qu'une partie d'une grosse commune, le code INSEE est unique pour chaque commune.
 +* Ligne : Éléments généraux descriptifs d'une ligne, comme le nom, le transporteur, l'indice... Une ligne contient une ou plusieurs séquences d'arrêts
 +* Séquence d'arrêts : Ensemble ordonné d'arrêts qui permet de déterminer les trajets d'une ligne.
 +* Mission : itinéraire spécifique au sein d'une séquence d'arrêts.
 +* Course : horaires desservant une mission à certains jours définis par un calendrier. 
 +* ITL : Interdiction de trafic local, ensemble d'arrêts d'une ligne au sein duquel il est interdit de faire un trajet. 
 +* Indice : Nom raccourci d'un élément. Le numéro d'une ligne par exemple.
 +* Réseau : Identité d'un service de transport public.
 +* Transporteur : Service d'exploitation de véhicules de transport public au sein d'un réseau ou pour une ligne. 
 +* Calendrier : ensemble de dates associées à une course qui permet de déterminer les jours de fonctionnement des différentes courses. 
 +* GTFS : Format de données Google Transit. Il s'agit d'un format simple composé d'une série de fichiers CSV
 +* Neptune : Format d'échange de données transport XML normalisé (NFP 99-506)
 +* CSV : Type de fichier où l'information est enregistrée de façon simple, en utilisant des séparateurs pour distinguer les différentes information. Les fichiers CSV s'éditent avec un tableur.
 +* Netex : Nouveau format européen d'échange de données transport XML normalisé.
 +* HUB : Format d'échange Transdev composer d'un ensemble de fichiers au format txt mais dont les données sont organisées comme dans un fichier csv. 
 +* Transport à la demande : Dans CHOUETTE, ligne régulière dont les services ne sont déclenchés que sur réservation des utilisateurs. 
 +
 +
 diff --git a/app/views/help/time_tables.textile b/app/views/help/time_tables.textile index 114b0509f..a8bff2a6f 100644 --- a/app/views/help/time_tables.textile +++ b/app/views/help/time_tables.textile @@ -24,13 +24,15 @@ Ainsi, il est possible de construire des calendriers d'application qui sont ensu  Une même course peut également posséder plusieurs calendriers. Ainsi, si une ligne possède des courses fonctionnant du lundi au vendredi, d'autres fonctionnant les samedis dimanches et fêtes et d'autre fonctionnant tous les jours, le troisième type de course ne nécessitera pas une période spécifique, lui associer les deux calendriers permettra de définir son fonctionnement.  -!2014-10-31_120428.png! Définition d'un calendrier +!2014-10-31_120428.png!  +Définition d'un calendrier  h3. Étiquettes  Afin de faciliter la gestion des calendriers qui peuvent être nombreux, CHOUETTE permet d'identifier les calendriers par une ou plusieurs étiquettes. L'auto-complétion permet de choisir des étiquettes déjà existantes pour les associer au calendrier. Une nouvelle étiquette peut être créée à tout moment en saisissant un nouveau texte et en tapant sur _"entrée"_. Les étiquettes permettent ensuite de faire des recherches au sein des calendriers sur ces étiquettes. -!2014-10-31_120905.png! Exemple d'étiquette +!2014-10-31_120905.png!  +Exemple d'étiquette  h3. Attributs @@ -39,7 +41,7 @@ h3. Attributs  * Étiquettes : Marqueurs caractérisant le calendrier (pour simplifier la recherche). Afin d'être enregistrées, les étiquettes doivent être saisies séparées par une ',' (virgule) et la touche 'tab' permet d'activer la dernière. Un assistant propose les étiquettes déjà saisies sur d'autres calendriers.  * Périodes d'application : périodes calendaires durant lesquelles le calendrier est applicable  * Jours d'application : jours de la semaine effectivement applicables dans le cas où des périodes sont définies dans le calendrier -* Dates particulières : dates spécifiques pour lesquelles le calendrier est applicable ; ces dates peuvent être ajoutées dans ou en dehors des périodes calendaires. Un calendrier peut n'avoir que des dates calendaires, auquel cas les jours d'applications n'ont pas de signification. +* Dates particulières : dates spécifiques pour lesquelles le calendrier est applicable ; ces dates peuvent être ajoutées dans ou en dehors des périodes calendaires. Un calendrier peut n'avoir que des dates calendaires, auquel cas les jours d'application n'ont pas de signification.  * Dates exclues : dates spécifiques à retirer des dates définies par les périodes et les jours d'application ; une même date calendaire ne peut pas être à la fois particulière et exclue;  une date exclue hors périodes et jours d'application n'a aucun effet. diff --git a/app/views/help/toc.textile b/app/views/help/toc.textile index ffe99da9d..f6cb389e4 100644 --- a/app/views/help/toc.textile +++ b/app/views/help/toc.textile @@ -28,7 +28,7 @@ h3. Sommaire  ## "Missions":journey_patterns
  ## "Courses et horaires":vehicle_journeys
  ## "Correspondances":connection_links
 -## "Calendrier":time_tables
 +## "Calendriers":time_tables
  # Imports
  ## "Imports":imports
  ## "Formats d'import":import_formats
 @@ -41,5 +41,7 @@ h3. Sommaire  # Annexes
  ## "Créer un réseau à partir de zéro":startingfromscratch
  ## "Modification des arrêts d'une ligne":stopsmanagement
 -## "Itinéraire valables le temps d'une saison":temporaryline
 -## "glossaire":terms
 +## "Itinéraires valables le temps d'une saison":temporaryline
 +## "Contraintes de l'export HUB":hubexport
 +## "Format CSV chouette":csv
 +## "Glossaire":terms
 diff --git a/app/views/help/validations.textile b/app/views/help/validations.textile index c2927cdbf..68a1b4775 100644 --- a/app/views/help/validations.textile +++ b/app/views/help/validations.textile @@ -22,7 +22,7 @@ p. Les tests (« points de contrôle ») de validation Neptune sont décrits sur  h3(#fmt). Formats disponibles  -- Neptune := format normalisé des échanges de données de transport en commun pour la France (cf "Normalisation":normalisation) +- Neptune := format normalisé des échanges de données de transport en commun pour la France  - Données internes Chouette := tests sur les objets déjà importés ou créés/modifiés en base (Phase 3 uniquement)  h3(#val). Onglet VALIDATIONS @@ -35,7 +35,7 @@ p=. !validation.png!  p. Dans la partie droite de l'écran : -* ajouter une Validation +* Ajouter une Validation  * Jeu de paramètres  h3(#new). Ajouter une Validation @@ -47,7 +47,7 @@ p. A chaque objet Import est associé un objet Validation, mais l'inverse est fa  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: +p. La validation est lancée en différé; son état d'avancement est affiché sous la forme d'une icône dont la couleur dépend de l'état:  * bleu : en cours  * vert : terminé correctement @@ -97,11 +97,11 @@ Une bulle d'information s'affiche en sélectionnant une icône bleue !notice.png  p(border_image). !validation_bulle.png! -p. La spécification 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':   * pour les tests des phases 1 et 2, par l'emplacement (nom du fichier, ligne et colonne) de l'objet en erreur, -* pour les tests de la phase 3, par un lien vers la page de consultation de l'objet en erreur. +* pour les tests de la phase 3, par un lien vers la page de consultation de l'objet en base qui est en erreur.  p(border_image). !validation_location.png!
\ No newline at end of file diff --git a/app/views/help/vehicle_journeys.textile b/app/views/help/vehicle_journeys.textile index 1c5de220f..ec8aef8cf 100644 --- a/app/views/help/vehicle_journeys.textile +++ b/app/views/help/vehicle_journeys.textile @@ -10,6 +10,8 @@ La course est rattachée à un nombre variable de "calendriers d'application" qu  h3. Consulter les courses
 +h4. Filtrer les courses
 +
  L'accès à la page des courses se fait depuis la page de la séquence d'arrêts. Dans le menu latéral, cliquer sur _"horaire des courses"_ affiche la page des courses de la séquence d'arrêts courante. Un tableau présente les horaires de passage aux arrêts pour chacune des courses. 
  Un filtre de recherche permet de sélectionner les courses en fonction de différents critères :
 @@ -20,7 +22,13 @@ Un filtre de recherche permet de sélectionner les courses en fonction de diffé  * Les courses sans horaires
  * Sur l'heure de départ de la course
 -Dans le tableau des courses, le lien en en-tête de colonne permet de sélectionner un autre séquence d'arrêt de la ligne ce qui permet de passer d'une séquence à l'autre directement sans avoir besoin de revenir à la page de la séquence d'arrêt. Cela permet par exemple d'accéder directement à la séquence d'arrêt retour de la séquence d'arrêt courante.
 +h4. Changer de séquence d'arrêts
 +
 +Un bouton _"séquence d'arrêts"_ est positionné au-dessus de la liste des arrêts. Il permet de naviguer vers une autre séquence d'arrêts de la ligne dans l'hypothèse où la séquence ouverte ne corresponde pas à la séquence voulue.
 +
 +h4. Consulter le détail d'une course
 +
 +Dans le tableau des courses, le lien en en-tête de colonne permet de sélectionner une autre séquence d'arrêt de la ligne ce qui permet de passer d'une séquence à l'autre directement sans avoir besoin de revenir à la page de la séquence d'arrêts. Cela permet par exemple d'accéder directement à la séquence d'arrêts retour.
  L'en-tête de chaque course propose un bouton qui permet d'accéder à des fonctions relative à la course :
 @@ -29,7 +37,8 @@ L'en-tête de chaque course propose un bouton qui permet d'accéder à des fonct  * Consulter la mission assurée par la course et accéder directement à sa page.
  * Consulter les calendriers associés à la course et accéder directement à leur page.
 -!2014-10-31_113958.png! Affichage des raccourcis de modification d'une course
 +!2014-10-31_113958.png! 
 +Affichage des raccourcis de modification d'une course
  h3. Créer une course
 @@ -45,13 +54,17 @@ Dans le champ calendrier, saisir quelques lettres du nom d'un calendrier à affe  Dès lors que la mission est sélectionnée, la liste des arrêts à desservir s'affiche en bas de la page. Elle comprend deux rangées d'horaires, l'un pour le départ, l'autre pour l'arrivée. Pour faciliter la saisie, il est possible de passer d'un champ de saisie horaire avec la touche tabulation et de saisir les données horaires avec le pavé numérique du clavier. Dans le cas où les horaires de départ et d'arrivée à l'arrêt sont confondus, les liens _"Copier vers départs"_ et _"Copier vers arrivée"_ permettent de ne saisir les horaires qu'une seule fois. 
 -!2014-10-31_114336.png! Edition des horaires dans CHOUETTE
 +!2014-10-31_114336.png! 
 +Édition des horaires dans CHOUETTE
  h4. Ajouter une course par import .csv
 -L'import d'une ou plusieurs courses par un fichier .csv permet d'ajouter des courses éditées dans un tableur. La forme du tableau étant très spécifique, il convient de récupérer le modèle en cliquant sur _"Export des horaires aux arrêts"_ puis de compléter les horaires dans le tableur. Le séparateur retenu pour le fichier .csv est le point-virgule. L'export fournit un fichier .zip comprenant le fichier des horaires et les calendrier.
 +L'import d'une ou plusieurs courses par un fichier .csv permet d'ajouter des courses éditées dans un tableur. La forme du tableau étant très spécifique, il convient de récupérer le modèle en cliquant sur _"Export des horaires aux arrêts"_ puis de compléter les horaires dans le tableur. Le séparateur retenu pour le fichier .csv est le point-virgule. L'export fournit un fichier .zip comprenant le fichier des horaires et les calendriers.
 +
 +Le fichier calendrier permet de connaître le code de chaque calendrier et de le reporter dans le fichier des horaires dans la ligne _"calendriers"_. Dans le cas où plusieurs calendriers doivent être associés à une course, le code de chaque calendrier doit être séparé par une virgule. 
 -!2014-10-31_114422.png! Import des horaires au format .csv
 +!2014-10-31_114422.png! 
 +Import des horaires au format .csv
  Les données horaires peuvent être rajoutées dans le fichier .csv, en revanche, il convient de laisser le champ _"id course"- vide. CHOUETTE se chargera de lui attribuer un numéro valide lors de l'import. 
 @@ -73,17 +86,18 @@ h4. Modification d'une course par import .csv  L'import d'un fichier .csv permet de modifier des courses éditées dans un tableur. Cliquer sur _"export des horaires aux arrêts"_  permet de récupérer le fichier des courses. Les modifications ou même les ajouts de courses seront pris en compte après import dans la base. Le séparateur retenu pour le fichier .csv est le point-virgule. Il ne faut pas saisir _"d'id de course"_ lorsque l'on saisit au travers d'un fichier .csv. CHOUETTE génèrera un numéro valide à l'import. Saisir un numéro fera échouer l'import.
 -!2014-10-31_114639.png! Saisie d'horaire dans un tableur. 
 +!2014-10-31_114639.png! 
 +Saisie d'horaire dans un tableur. 
 -L'export fournit un fichier .zip comprenant le fichier des horaires et les calendrier.
 +L'export fournit un fichier .zip comprenant le fichier des horaires et les calendriers.
 -L'import en retour ne concerne que le fichier .csv proprement dit. Importer un fichier .zip identique au fichier exporté, génèrera une erreur. 
 +L'import, en retour, ne concerne que le fichier .csv proprement dit. Importer un fichier .zip identique au fichier exporté générera une erreur. 
  h4. Cloner une course
 -Depuis la page d'une course, il est possible de cloner la course en cliquant dans le menu latéral sur _"Cloner la course"_. Une boite de dialogue s'affiche et permet de choisir les paramètres de clonage. Le clonage n'est pas une duplication à l'identique. Il ne permet pas de créer une deuxième course en tout point identique mais de créer une course ayant les mêmes paramètres, les mêmes temps de trajet inter-arrêts mais à un horaire différent comme le fait la fonction de décalage présente au-dessus des horaires de la course.
 +Depuis la page d'une course, il est possible de cloner la course en cliquant dans le menu latéral sur _"Cloner la course"_. Une boite de dialogue s'affiche et permet de choisir les paramètres de clonage. Le clonage n'est pas une duplication à l'identique. Il ne permet pas de créer une deuxième course en tout point identique mais de créer une course ayant les mêmes paramètres, les mêmes temps de trajet inter-arrêts, *mais à un horaire différent*, comme le fait la fonction de décalage présente au-dessus des horaires de la course.
 -Contrairement au décalage qui modifie les horaires de la course existante, le clonage crée une nouvelle course avec des horaires différents. Le premier paramètre permet de choisir si on clone la nouvelle course en fonction de l'horaire de départ ou de l'horaire d'arrivée puis de choisir l'horaire exact de clonage.
 +Contrairement au décalage qui modifie les horaires de la course existante, le clonage crée une nouvelle course avec des horaires différents. Le premier paramètre permet de choisir si on clone la nouvelle course en fonction de l'horaire de départ ou de l'horaire d'arrivée, puis de choisir l'horaire exact de clonage.
  Deux autres paramètres facultatifs permettent de répéter l'opération "en rafale" sur des bases régulières en définissant l’intervalle entre deux courses et le nombre de copies à effectuer selon cette modalité.
 @@ -101,8 +115,8 @@ h3. Attributs  * Mode de transport : mode de transport pour la course; par défaut, c'est le mode de transport de la ligne qui est appliqué
  * Accessibilité PMR	: précise si la course est équipée PMR
  * Transport à la demande : précise si la course est en exploitation à la demande ou pas
 -* État de trafic : état de trafic [?]
 -* Équipement : équipement [?]
 +* État de trafic : état de trafic
 +* Équipement : équipement
  * Type d'identifiant du véhicule : type d'identifiant du véhicule
 diff --git a/app/views/routes/_form.html.erb b/app/views/routes/_form.html.erb index 270c49911..b6c4a8c24 100644 --- a/app/views/routes/_form.html.erb +++ b/app/views/routes/_form.html.erb @@ -14,7 +14,7 @@            <%= render "stop_point_fields",  :f => p, :test1 => "oiuoiu" %>  		<% end %>        <div class="links"> -	    <%= link_to_add_association t("routes.actions.add_stop_point"), form, :stop_points, :class => 'add_stop_point' %> +	    <%= link_to_add_association t("routes.actions.add_stop_point"), form, :stop_points, :class => 'add_stop_point add' %>        <br/>          <%= link_to t('routes.actions.new_stop_point'), new_referential_stop_area_path(@referential), {:class => "add", :target => "_blank"} %>        </div> @@ -59,39 +59,6 @@ $(document).ready( function() {      // console.log(  "before-remove");      // console.log(  stop_point_ids);    }; -  var stop_area_selection_token_input = function( element ) { -     var item_name = function( item){ -        var result = item.name; -        if ( item.registration_number !=null && item.registration_number.length > 0) { -           result += '  (' + item.registration_number + ')'; -        } -        return result; -     }; -     var item_format = function( item ){ -        var info = ''; -        if ( item.zip_code != null ) { -           info += item.zip_code + ' '; -        } -        if ( item.city_name != null ) { -           info += item.city_name; -        } -        return '<li><div class=\"name\">' + item_name( item) + '</div><div class=\"info\">' + item.area_type + '</div><div class=\"info\">' +  info + '</div></li>' -     }; -    element.tokenInput('<%= referential_stop_point_areas_path(@referential, :format => :json) %>', -          {  crossDomain: false, -             tokenLimit: 1, -             minChars: 3, -             hintText: '<%= t('search_hint') %>', -             noResultsText: '<%= t('no_result_text') %>', -             searchingText: '<%= t('searching_term') %>', -             resultsFormatter: item_format , -             tokenFormatter: item_format -          }); -  }; - -  $( ".new_stop_point" ).each( function(index, element){ -    stop_area_selection_token_input( $(element)) -  });    $('#stop_points').sortable({        axis: 'y', @@ -109,8 +76,8 @@ $(document).ready( function() {          order_position();        }    }); +    $('#stop_points').bind("cocoon:after-insert", function(event, insertedItem) { -    stop_area_selection_token_input( insertedItem.find( ".new_stop_point" ));      var new_stop_count = $('div.nested-fields.stop_point').size();      var cocoonId = insertedItem.find("input.new_stop_point").attr("id").match( /route_stop_points_attributes_(\d+)_stop_area_id/)[1]; diff --git a/app/views/routes/_stop_point_fields.html.erb b/app/views/routes/_stop_point_fields.html.erb index e8b18fa87..d90444b03 100644 --- a/app/views/routes/_stop_point_fields.html.erb +++ b/app/views/routes/_stop_point_fields.html.erb @@ -1,17 +1,19 @@ -<div class="nested-fields stop_point"> +<div class="nested-fields stop_point row">    <%= f.inputs do %> +  <div class="col-md-1 resize">      <%= link_to_remove_association "<i class='fa fa-trash-o'></i>".html_safe, f %>      <span class="handle" alt="<%= t('stop_points.index.move') %>" title="<%= t('stop_points.index.move') %>" ><i class='fa fa-arrows'></i></span> +  </div>   +  <div class="col-md-11">    <% if f.object.stop_area.nil? || f.object.new_record? %>      <%= f.input :id, :as => :hidden, :input_html => { :class => "stop_point_id added_stop_point", :value => "" } %>      <%= f.input :position, :as => :hidden, :input_html => { :class => "position" } %> -    <% data_pre = (f.object.stop_area.nil?) ? [] : [ :id => f.object.stop_area.id, :name => "#{f.object.stop_area.name}" ] %> -    <%= f.input :stop_area_id, :label => false, :input_html => { :class => "new_stop_point stop_area_id", :"data-pre" => data_pre.to_json }  %> +    <%= f.input :stop_area_id, :label => false, :as => :search_stop_area, :json => referential_autocomplete_stop_areas_path(@referential, :format => :json)+"?filter=physical", :hint_text => t('search_hint'), :no_result_text => t('no_result_text'),:searching_text => t('searching_term'), :tokenLimit => 1, :input_html => { :class => "new_stop_point stop_area_id", :"data-pre" => Rabl::Renderer.new('autocomplete_stop_areas/index', [f.object.stop_area].compact, :view_path => 'app/views', :format => :json, :scope => self ).render }  %>        <% else %>      <%= f.input :id, :as => :hidden, :input_html => { :class => "stop_point_id" } %>      <%= f.input :position, :as => :hidden, :input_html => { :class => "position" } %> -    <%= f.input :stop_area_id, :as => :hidden, :input_html => { :class => "stop_area_id"} %> -    <%= f.object.stop_area.name %> +    <%= f.input :stop_area_id, :label => false, :as => :search_stop_area, :json => referential_autocomplete_stop_areas_path(@referential, :format => :json)+"?filter=physical", :hint_text => t('search_hint'), :no_result_text => t('no_result_text'),:searching_text => t('searching_term'), :tokenLimit => 1, :disabled => true, :input_html => { :class => "stop_area_id", :"data-pre" => Rabl::Renderer.new('autocomplete_stop_areas/index', [f.object.stop_area].compact, :view_path => 'app/views', :format => :json, :scope => self ).render }  %>        <% end %> -  <% end %> -  </div> +  </div>     +  <% end %>   +</div> diff --git a/app/views/routes/edit_boarding_alighting.html.erb b/app/views/routes/edit_boarding_alighting.html.erb new file mode 100644 index 000000000..fc3378425 --- /dev/null +++ b/app/views/routes/edit_boarding_alighting.html.erb @@ -0,0 +1,27 @@ +<%= title_tag t('routes.edit_boarding_alighting.title', :route => @route.name ) %> + +<%= simple_form_for ["save_boarding_alighting", @referential, @line, @route] do |form| %> +<table class="table table-hover"> +  <thead> +    <th><%= t(".stop_area_name") %></th> +    <th><%= t(".for_boarding") %></th> +    <th><%= t(".for_alighting") %></th> +  </thead> +  <tbody> +  <%= form.simple_fields_for :stop_points do |stop_points_form| %> +    <tr>       +      <td> +        <%= explicit_name(stop_points_form.object.stop_area) %> +      </td> +      <td><%= stop_points_form.input :for_boarding, :label => false, include_blank: t("simple_form.include_blanks.defaults.for_boarding") %></td> +      <td><%= stop_points_form.input :for_alighting, :label => false, include_blank: t("simple_form.include_blanks.defaults.for_alighting") %></td> +    </tr> +    <% end %> +  </tbody> +</table>  + +  <div class="submit"> +    <%= form.button :submit, :class => "" %> +    <%= link_to t("cancel"), referential_line_route_path(@referential, @line, @route) %> +  </div>   +<% end %> diff --git a/app/views/routes/show.html.erb b/app/views/routes/show.html.erb index fe1a9c956..e1f59cde9 100644 --- a/app/views/routes/show.html.erb +++ b/app/views/routes/show.html.erb @@ -93,18 +93,26 @@    <li><%= link_to t('routes.actions.new'), new_referential_line_route_path(@referential, @line), :class => "add" %></li>     <li><%= link_to t('routes.actions.edit'), edit_referential_line_route_path(@referential, @line, @route), :class => "edit" %></li>    <li><%= link_to t('routes.actions.destroy'), referential_line_route_path(@referential, @line, @route), :method => :delete, :data => {:confirm =>  t('routes.actions.destroy_confirm')}, :class => "remove" %></li> -<% if @route.stop_points.size >= 2 %> +</ul> +<ul class="actions"> +  <% if @route.stop_points.size >= 2 %>    <li><%= link_to t('journey_patterns.actions.new'), new_referential_line_route_journey_pattern_path(@referential, @line, @route), :class => "add" %></li>    <% end %> +  <% if @route.stop_points.present? %> +  <li><%= link_to t('routes.actions.edit_boarding_alighting'), edit_boarding_alighting_referential_line_route_path(@referential, @line, @route), :class => "edit" %></li> +  <% end %>    <% if @route.journey_patterns.size > 0 %>    <li>      <%= link_to t('vehicle_journeys.actions.index'), [@referential, @line, @route, :vehicle_journeys], :class => "clock" %>    </li>    <% end %> +</ul> + +<ul class="actions">    <li><%= link_to t('vehicle_journey_imports.new.title'), new_referential_line_route_vehicle_journey_import_path( @referential, @line, @route ), :class => "import" %></li>    <li><%= link_to t('vehicle_journey_exports.new.title'), referential_line_route_vehicle_journey_exports_path(@referential, @line, @route, :format => :zip), :class => "export" %></li>  </ul> -  <%= creation_tag(@route) %> +<%= creation_tag(@route) %>  <% end %> diff --git a/app/views/stop_areas/_genealogical.html.erb b/app/views/stop_areas/_genealogical.html.erb index 54e117053..a76b972e2 100644 --- a/app/views/stop_areas/_genealogical.html.erb +++ b/app/views/stop_areas/_genealogical.html.erb @@ -43,7 +43,7 @@        <% @stop_area.routing_stops.each do |stop| %>        <div class="child">          <%= link_to([@referential, stop], :title => t("area_types.label.#{ stop.stop_area_type}") + " #{ stop.name}") do %>  -          <%= image_tag "map/" + stop.stop_area_type + ".png"   %><span><%= stop.name %></span>          +          <%= image_tag "map/" + stop.stop_area_type + ".png"   %><span><%= "#{stop.name} #{' [' + stop.registration_number + ']' if stop.registration_number.present? }" %></span>                   <% end %>          </div>        <% end %> diff --git a/app/views/stop_areas/_stop_area.html.erb b/app/views/stop_areas/_stop_area.html.erb index 8136f9078..3f8768feb 100644 --- a/app/views/stop_areas/_stop_area.html.erb +++ b/app/views/stop_areas/_stop_area.html.erb @@ -21,27 +21,32 @@    <div class="panel-body">      <p>              <% unless stop_area.area_type == 'ITL' || stop_area.geometry %> -      <span class="warning"><%= t('.no_position') %></span> - +        <span class="warning"><%= t('.no_position') %></span>        <% end %> -      <span class="warning"> -      	<% if stop_area.zip_code.blank? %> -      	   <%=  stop_area.human_attribute_name('country_code')+' '+stop_area.country_code unless stop_area.country_code.blank? %> -      	<% else %> -      	   <%=  stop_area.zip_code %> -      	<% end %> -      	<%=  stop_area.city_name %> -      	  -      </span>	      </p> -    <p>  +    <p>      +      <%= stop_area.human_attribute_name('registration_number') %> : <%= stop_area.registration_number.present? ? stop_area.registration_number : t(".no_object") %> +    </p> +    <p> +      <%=  t('.address') %> : <%= (stop_area.zip_code.present? || stop_area.city_name.present?) ? "#{stop_area.zip_code} #{stop_area.city_name}"  : t(".no_object") %>  +    </p> +    <p>        <% if stop_area.area_type == 'ITL' %> -        <%= t('.lines') %> <% stop_area.routing_lines.each do |line| %> -          <span class="line"><%= line.number %></span> -        <% end %> +      <%=  t('.lines') %> : <% if stop_area.routing_lines.blank? %> +          <%= t(".no_object") %> +        <% else %>                                +          <% stop_area.routing_lines.each do |line| %> +            <span class="label label-default line"><%= line.number %></span> +          <% end %> +        <% end %>            <% else %> -        <%= t('.lines') %> <% stop_area.lines.each do |line| %> -          <span class="line"><%= line.number %></span> -        <% end %> +      <%= t('.lines') %> : <% if stop_area.lines.blank? %> +          <%= t(".no_object") %> +        <% else %> +          <% stop_area.lines.each do |line| %> +            <span class="label label-default line"><%= line.number || truncate( line.name, :length => 4 ) %></span> +          <% end %> +        <% end %>            <% end %>      </p>    </div> diff --git a/app/views/stop_areas/add_children.html.erb b/app/views/stop_areas/add_children.html.erb index 732e28466..4d30ba674 100644 --- a/app/views/stop_areas/add_children.html.erb +++ b/app/views/stop_areas/add_children.html.erb @@ -3,7 +3,7 @@  <%= semantic_form_for [@referential, @stop_area] do |form| %>  <div>    <%= form.inputs do %> -    <%= form.input :children_ids, :as => :search_stop_area, :json => referential_stop_area_stop_area_children_path(@referential, @stop_area, :format => :json), :hint_text => t('search_hint'), :no_result_text => t('no_result_text'),:searching_text => t('searching_term'), :input_html => { :"data-pre" => Rabl::Renderer.new('stop_areas/index', @children, :view_path => 'app/views', :format => :json).render }  %> +    <%= form.input :children_ids, :as => :search_stop_area, :json => referential_autocomplete_stop_areas_path(@referential, :format => :json)+"?relation=children&target_type=#{@stop_area.area_type}", :hint_text => t('search_hint'), :no_result_text => t('no_result_text'),:searching_text => t('searching_term'), :input_html => { :"data-pre" => Rabl::Renderer.new('autocomplete_stop_areas/index', @children, :view_path => 'app/views', :format => :json, :scope => self ).render }  %>    <% end %>     <%= form.actions do %> diff --git a/app/views/stop_areas/add_routing_stops.html.erb b/app/views/stop_areas/add_routing_stops.html.erb index 06a96d575..310e2f8b0 100644 --- a/app/views/stop_areas/add_routing_stops.html.erb +++ b/app/views/stop_areas/add_routing_stops.html.erb @@ -3,7 +3,7 @@  <%= semantic_form_for [@referential, @stop_area] do |form| %>  <div>    <%= form.inputs do %> -    <%= form.input :routing_stop_ids, :as => :text, :input_html => { :"data-pre" => ( @stops.map { |stop| { :id => stop.id.to_s, :name => "#{stop.name} #{stop.country_code}" } } ).to_json }  %> +    <%= form.input :routing_stop_ids, :as => :search_stop_area, :json =>  referential_autocomplete_stop_areas_path(@referential, :format => :json)+"?filter=itl_excluded", :hint_text => t('search_hint'), :no_result_text => t('no_result_text'),:searching_text => t('searching_term'), :input_html => { :"data-pre" => Rabl::Renderer.new('autocomplete_stop_areas/index', @stop_area.routing_stops, :view_path => 'app/views', :format => :json, :scope => self).render  }  %>    <% end %>     <%= form.actions do %> @@ -13,19 +13,6 @@  </div>  <% end %> -<script> -	$(function() { -		$( "#stop_area_routing_stop_ids" ).tokenInput('<%= referential_stop_area_stop_area_routing_stops_path(@referential, @stop_area, :format => :json) %>', { -       crossDomain: false, -       prePopulate: $('#stop_area_routing_stop_id').data('pre'), -       minChars: 3, -       hintText: '<%= t('search_hint') %>', -       noResultsText: '<%= t('no_result_text') %>', -       searchingText: '<%= t('searching_term') %>' -    }); -	}); -</script> -  <% content_for :sidebar do %>  <ul class="actions">  </ul> diff --git a/app/views/stop_areas/index.rabl b/app/views/stop_areas/index.rabl deleted file mode 100644 index d7f2365bb..000000000 --- a/app/views/stop_areas/index.rabl +++ /dev/null @@ -1,9 +0,0 @@ -collection @stop_areas - -node do |stop_area| -  { :id => stop_area.id, :registration_number => stop_area.registration_number || "", :name => stop_area.name || "", :zip_code => stop_area.zip_code || "", :city_name => stop_area.city_name || "" } -end - -node :area_type do |area| -  I18n.t("area_types.label.#{area.area_type.underscore}") || "" -end diff --git a/app/views/stop_areas/select_parent.html.erb b/app/views/stop_areas/select_parent.html.erb index fd1b292c6..3f550d370 100644 --- a/app/views/stop_areas/select_parent.html.erb +++ b/app/views/stop_areas/select_parent.html.erb @@ -2,8 +2,8 @@  <%= semantic_form_for [@referential, @stop_area] do |form| %>  <div> -  <%= form.inputs do %>     -    <%= form.input :parent_id, :as => :search_stop_area, :json => referential_stop_area_stop_area_parents_path(@referential, @stop_area, :format => :json), :hint_text => t('search_hint'), :no_result_text => t('no_result_text'), :searching_text => t('searching_term'), :tokenLimit => 1, :input_html => { :"data-pre" => Rabl::Renderer.new('stop_areas/show', [@parent].compact, :view_path => 'app/views', :format => :json).render }  %> +  <%= form.inputs do %> +    <%= form.input :parent_id, :as => :search_stop_area, :json => referential_autocomplete_stop_areas_path(@referential, :format => :json)+"?relation=parent&target_type=#{@stop_area.area_type}", :hint_text => t('search_hint'), :no_result_text => t('no_result_text'), :searching_text => t('searching_term'), :tokenLimit => 1, :input_html => { :"data-pre" => Rabl::Renderer.new('autocomplete_stop_areas/index', [@parent].compact, :view_path => 'app/views', :format => :json, :scope => self ).render }  %>    <% end %>     <%= form.actions do %> diff --git a/app/views/stop_areas/show.rabl b/app/views/stop_areas/show.rabl deleted file mode 100644 index f406c4eff..000000000 --- a/app/views/stop_areas/show.rabl +++ /dev/null @@ -1,9 +0,0 @@ -object @stop_area - -node do |stop_area| -  { :id => stop_area.id, :registration_number => stop_area.registration_number || "", :name => stop_area.name || "", :zip_code => stop_area.zip_code || "", :city_name => stop_area.city_name || "" } -end - -node :area_type do |area| -  I18n.t("area_types.label.#{area.area_type.underscore}") || "" -end diff --git a/app/views/stop_points/_stop_point.html.erb b/app/views/stop_points/_stop_point.html.erb index 5eb4bb8b9..3e0163a62 100644 --- a/app/views/stop_points/_stop_point.html.erb +++ b/app/views/stop_points/_stop_point.html.erb @@ -4,7 +4,7 @@        <h5>          <%= link_to([@referential, stop_point.stop_area], :class => "preview", :title => "#{Chouette::StopArea.model_name.human.capitalize} #{stop_point.stop_area.name}") do %>                  <span class="name"> -          <span class="label label-default"><%= stop_point.position + 1 %></span><%= truncate(stop_point.stop_area.name, :length => 20) %>           +          <span class="label label-primary"><%= stop_point.position + 1 %></span><%= image_tag "map/" + stop_point.stop_area.stop_area_type + ".png"   %> <%= truncate(stop_point.stop_area.name, :length => 20) %>                    </span>          <% end %>        </h5> @@ -13,22 +13,24 @@    <div class="panel-body">      <p>              <% unless stop_point.stop_area.geometry %> -      <span class="warning"><%= t('.no_position') %></span> - +        <span class="warning"><%= t('.no_position') %></span> -        <% end %>      </p> -    <p>  -      <%= t('.lines') %> <% stop_point.stop_area.lines.reject { |l| l.id==@line.id}.each do |line| %> -        <span class="line"><%= line.number %></span> -      <% end %> -    </p>     -    <p>       -      <% if stop_point.stop_area.zip_code.blank? %> -        <%= stop_point.stop_area.human_attribute_name('country_code') %> <%= stop_point.stop_area.country_code %> -      <% else %> -        <%= stop_point.stop_area.zip_code %> -      <% end %>  -      <%= stop_point.stop_area.city_name %> +    <p>      +      <%= stop_point.stop_area.human_attribute_name('registration_number') %> : <%= stop_point.stop_area.registration_number.present? ? stop_point.stop_area.registration_number : t(".no_object") %>      </p> +    <p> +      <%=  t('.address') %> : <%= (stop_point.stop_area.zip_code.present? || stop_point.stop_area.city_name.present?) ? "#{stop_point.stop_area.zip_code} #{stop_point.stop_area.city_name}"  : t(".no_object") %>  +    </p> +    <p> +      <%= t('.lines') %> <% if stop_point.stop_area.lines.blank? %> +          <%= t(".no_object") %> +        <% else %> +          <% stop_point.stop_area.lines.each do |line| %> +            <span class="label label-default line"><%= line.number || truncate( line.name, :length => 4 ) %></span> +          <% end %> +        <% end %>  +    </p>        </div>  </div> diff --git a/config/initializers/simple_form.rb b/config/initializers/simple_form.rb index e2ad34eee..a128195d2 100644 --- a/config/initializers/simple_form.rb +++ b/config/initializers/simple_form.rb @@ -95,7 +95,7 @@ SimpleForm.setup do |config|    # config.label_text = lambda { |label, required| "#{required} #{label}" }    # You can define the class to use on all labels. Default is nil. -  config.label_class = 'col-lg-2 control-label' +  config.label_class = 'col-lg-3 control-label'    # You can define the class to use on all forms. Default is simple_form.    config.form_class = "simple_form form-horizontal" @@ -132,7 +132,7 @@ SimpleForm.setup do |config|    # config.default_input_size = 50    # When false, do not use translations for labels. -  # config.translate_labels = true +  config.translate_labels = true    # Automatically discover new inputs in Rails' autoload path.    # config.inputs_discovery = false diff --git a/config/initializers/simple_form_bootstrap.rb b/config/initializers/simple_form_bootstrap.rb index c3dd5e348..552a2ff66 100644 --- a/config/initializers/simple_form_bootstrap.rb +++ b/config/initializers/simple_form_bootstrap.rb @@ -4,7 +4,7 @@ SimpleForm.setup do |config|      b.use :html5      b.use :placeholder      b.use :label -    b.wrapper :tag => 'div', :class => 'col-lg-10' do |ba| +    b.wrapper :tag => 'div', :class => 'col-lg-9' do |ba|        ba.use :input        ba.use :error, :wrap_with => { :tag => 'span', :class => 'help-inline' }        ba.use :hint,  :wrap_with => { :tag => 'p', :class => 'help-block' } @@ -26,7 +26,7 @@ SimpleForm.setup do |config|      b.use :html5      b.use :placeholder      b.use :label -    b.wrapper :tag => 'div', :class => 'col-lg-10' do |input| +    b.wrapper :tag => 'div', :class => 'col-lg-9' do |input|        input.wrapper :tag => 'div', :class => 'input-prepend' do |prepend|          prepend.use :input        end @@ -39,7 +39,7 @@ SimpleForm.setup do |config|      b.use :html5      b.use :placeholder      b.use :label -    b.wrapper :tag => 'div', :class => 'col-lg-10' do |input| +    b.wrapper :tag => 'div', :class => 'col-lg-9' do |input|        input.wrapper :tag => 'div', :class => 'input-append' do |append|          append.use :input        end @@ -54,5 +54,5 @@ SimpleForm.setup do |config|    # buttons and other elements.    config.default_wrapper = :bootstrap    config.button_class = 'btn' -  config.label_class = 'col-lg-2 control-label'  +  config.label_class = 'col-lg-3 control-label'   end diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml index 017e167bd..d5c545342 100644 --- a/config/locales/devise.en.yml +++ b/config/locales/devise.en.yml @@ -6,11 +6,13 @@ en:        new:          title: Sign in          commit: Sign in -        welcome: "Welcome on Chouette" -        introduction1: "Chouette is an Open Source software that can read and edit whole public transport service for passengers." -        introduction2: "The software is delivered in Saas way and gives you :" -        introduction_item1: "map view of lines, routes, journeys, stops, connections..." -        introduction_item2: "data exchange functions in different formats like NEPTUNE, GTFS" +        welcome: "Welcome to Chouette" +        introduction1: "Chouette is an open source Software for editing, viewing and exchanging +public transport reference data, and is the reference implementation for +validating conformance of data wrt Neptune (French standard NFP 99 506)." +        introduction2: "The application is deployed in Saas mode and supports :" +        introduction_item1: "several data exchange formats (Neptune, GTFS, CSV ... Netex coming soon)" +        introduction_item2: "and also several base map backgrounds (Google, OSM, IGN)."      confirmations:        new:          title: Resend confirmation instructions diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml index c5885effc..929aa682a 100644 --- a/config/locales/devise.fr.yml +++ b/config/locales/devise.fr.yml @@ -5,16 +5,20 @@ fr:      attributes:        user:          password: Mot de passe +        password_confirmation:  Confirmation du mot de passe    devise:      sessions:        new:          title: Se connecter          commit: Se connecter          welcome: "Bienvenue sur Chouette" -        introduction1: "Chouette est un logiciel Open Source d'édition et d'échange d'offre de transport public planifiée." -        introduction2: "Le logiciel est mis à disposition en mode Saas et se veut ouvert :" -        introduction_item1: "visualisation cartographique des lignes, des arrêts, des parcours..." -        introduction_item2: "échange de données selon différents formats (Neptune, GTFS)" +        introduction1: "Chouette est un logiciel Open Source de saisie, de visualisation et +d'échange d'offre de transport public planifiée, conçu pour être +l'implémentation de référence pour valider la conformité de données à la +norme Neptune (NFP 99 506)" +        introduction2: "Déployé en mode Saas, ce logiciel est ouvert et peut gérer" +        introduction_item1: "plusieurs formats (Neptune, GTFS, CSV, prochainement Netex)" +        introduction_item2: "plusieurs fonds cartographiques, notamment IGN, OSM et Google."      confirmations:        new:          title: Renvoyer le mail de confirmation diff --git a/config/locales/enumerize.en.yml b/config/locales/enumerize.en.yml new file mode 100644 index 000000000..574c316cd --- /dev/null +++ b/config/locales/enumerize.en.yml @@ -0,0 +1,17 @@ +en: +  simple_form:   +    include_blanks: +      defaults: +        for_boarding: "Undefined" +        for_alighting: "Undefined" +  enumerize: +    for_boarding: +      normal: "Regularly scheduled pickup" +      forbidden: "No pickup available" +      request_stop: "Pickup if requested" +      is_flexible: "Booking requested for pickup"         +    for_alighting: +      normal: "Regularly scheduled drop off" +      forbidden: "No drop off available" +      request_stop: "Drop off if requested" +      is_flexible: "Booking requested for drop off"
\ No newline at end of file diff --git a/config/locales/enumerize.fr.yml b/config/locales/enumerize.fr.yml new file mode 100644 index 000000000..0dad16319 --- /dev/null +++ b/config/locales/enumerize.fr.yml @@ -0,0 +1,17 @@ +fr: +  simple_form:   +    include_blanks:      +      defaults: +        for_boarding: "Non défini" +        for_alighting: "Non défini" +  enumerize: +    for_boarding: +      normal: "Montée autorisée" +      forbidden: "Montée interdite" +      request_stop: "Montée sur demande au conducteur" +      is_flexible: "Montée sur réservation"                 +    for_alighting: +      normal: "Descente autorisée" +      forbidden: "Descente interdite" +      request_stop: "Descente sur demande au conducteur" +      is_flexible: "Descente sur réservation"
\ No newline at end of file diff --git a/config/locales/routes.yml b/config/locales/routes.yml index b68f1802a..1807ef30d 100644 --- a/config/locales/routes.yml +++ b/config/locales/routes.yml @@ -3,6 +3,7 @@ en:      actions:        new: "Add a new route"        edit: "Edit this route" +      edit_boarding_alighting: "Stop alighting and boarding"        destroy: "Remove this route"        destroy_confirm: "Are you sure you want destroy this route?"        export_kml: "Export KML route" @@ -25,6 +26,11 @@ en:        title: "Routes"        selection: "Selection"        selection_all: "All" +    edit_boarding_alighting: +      title: "Stop alighting and boarding properties" +      stop_area_name: "Stop area name" +      for_boarding: "Boarding" +      for_alighting: "Alighting"      route:        no_journey_pattern: "No Journey pattern"        wayback:  @@ -58,6 +64,7 @@ en:          object_version: "Version"          creation_time: "Created on"          creator_id: "Created by" +        no_journey_pattern: "No journey pattern"            formtastic:      titles:        route: @@ -68,6 +75,7 @@ fr:      actions:        new: "Ajouter une séquence d'arrêts"        edit: "Modifier cette séquence d'arrêts" +      edit_boarding_alighting: "Contraintes de montée - descente"        destroy: "Supprimer cette séquence d'arrêts"        destroy_confirm: "Etes vous sûr de supprimer cette séquence d'arrêts ?"        export_kml: "Export KML de la séquence d'arrêts" @@ -90,6 +98,11 @@ fr:        title: "Séquences d'arrêts"        selection: "Sélection"        selection_all: "Tous" +    edit_boarding_alighting: +      title: "Contraintes de montée - descente aux arrêts" +      stop_area_name: "Nom de l'arrêt" +      for_boarding: "Montée" +      for_alighting: "Descente"      route:        no_journey_pattern: "Pas de mission"        wayback:  diff --git a/config/locales/stop_areas.yml b/config/locales/stop_areas.yml index 1974c5cb1..bb08b8ace 100644 --- a/config/locales/stop_areas.yml +++ b/config/locales/stop_areas.yml @@ -3,7 +3,9 @@ en:      default_geometry_success: "%{count} modified stop areas"      stop_area:        no_position: "No Position"  -      lines: "Lines :" +      no_object: "Nothing" +      lines: "Lines" +      address: "Address"        general: "General"        localisation: "Localisation"        accessibility: "Accessibility"       @@ -118,8 +120,10 @@ fr:    stop_areas:      default_geometry_success: "%{count} arrêts modifiés"      stop_area: -      no_position: "Pas de position"  -      lines: "Lignes :" +      no_position: "Pas de position" +      no_object: "Aucun(e)" +      lines: "Lignes" +      address: "Adresse"        general: "General"        localisation: "Localisation"        accessibility: "Accessibilité" diff --git a/config/locales/stop_points.yml b/config/locales/stop_points.yml index 540fdc650..819ed4c0f 100644 --- a/config/locales/stop_points.yml +++ b/config/locales/stop_points.yml @@ -20,7 +20,10 @@ en:        move: "Move"        no_stop_point: "No stop point on route"      stop_point: -      lines: "lines" +      no_position: "No position" +      no_object: "Nothing" +      lines: "Lines" +      address: "Address"    activerecord:              models:                stop_point:  @@ -30,6 +33,11 @@ en:      attributes:        stop_point:          lines: "lines" +  simple_form: +    labels: +      stop_point: +        for_boarding: "Pickup" +        for_alighting: "Drop off"          fr:    stop_points:      reorder_success: "La list des arrêts a été mise à jour" @@ -52,7 +60,10 @@ fr:        move: "Déplacer"        no_stop_point: "Aucun arrêt dans la séquence"      stop_point: -      lines: "lignes" +      no_position: "Pas de position" +      no_object: "Aucun(e)" +      lines: "Lignes" +      address: "Adresse"    activerecord:              models:                stop_point:  @@ -61,4 +72,9 @@ fr:          other: "arrêts sur séquence d'arrêts"      attributes:        stop_point: -        lines: "lignes" +        lines: "Lignes" +  simple_form: +    labels: +      stop_point: +        for_boarding: "Montée" +        for_alighting: "Descente"     diff --git a/config/locales/time_tables.yml b/config/locales/time_tables.yml index 85b990716..8f83cb530 100644 --- a/config/locales/time_tables.yml +++ b/config/locales/time_tables.yml @@ -38,7 +38,7 @@ en:        resume_empty: "Empty timetable"        legend: "Legend : "        excluded_date: "Excluded date" -      overlap_date: "Overlap date"  +      overlap_date: "Overlap date"        selected_date: "Date directly included"        selected_period: "Date included in period"      index: @@ -49,10 +49,10 @@ en:        to: " to : "        selection: "Selection"        selection_all: "All" -      advanced_search: "Advanced Search"       -  activerecord:         -    models:         -      time_table:  +      advanced_search: "Advanced Search" +  activerecord: +    models: +      time_table:          zero:  "Timetable"          one:   "Timetable"          other: "Timetables" @@ -80,7 +80,7 @@ en:          periods: "Application periods"          period_start: "From"          period_end: "to" -        tag_search: "Tags"          +        tag_search: "Tags"    formtastic:      titles:        time_table: @@ -129,9 +129,9 @@ fr:        resume_empty: "Calendrier vide"        legend: "Légende : "        excluded_date: "Date exclue" -      overlap_date: "Date en doublon"  -      selected_date: "Date inclue directement" -      selected_period: "Date inclue par période" +      overlap_date: "Date en doublon" +      selected_date: "Date incluse directement" +      selected_period: "Date incluse par période"      index:        comment: "Recherche par nom"        tag_search: "Tags : vacances,jour fériés" @@ -142,10 +142,10 @@ fr:        title: "calendriers"        selection: "Sélection"        selection_all: "Tous" -      advanced_search: "Recherche avancée"       -  activerecord:         -    models:         -      time_table:  +      advanced_search: "Recherche avancée" +  activerecord: +    models: +      time_table:          zero:  "Calendrier"          one:   "Calendrier"          other: "Calendriers" @@ -172,10 +172,10 @@ fr:          date: "Le"          excluded_dates: "Dates exclues"          periods: "Périodes d'application" -        period_start: "Du"  +        period_start: "Du"          period_end: "au" -        tag_search: "Etiquettes"  -        tag_list: "Etiquettes"  +        tag_search: "Etiquettes" +        tag_list: "Etiquettes"    formtastic:      titles:        time_table: @@ -183,6 +183,6 @@ fr:      placeholders:        time_table:          tag_search: "ex: Jours fériés,Vacances scolaires" -           + diff --git a/config/routes.rb b/config/routes.rb index 057a9bb90..f8af87e5a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,7 +9,7 @@ ChouetteIhm::Application.routes.draw do      authenticated :user do        root :to => 'referentials#index'      end -     +      unauthenticated do        root :to => 'devise/sessions#new'      end @@ -61,29 +61,13 @@ ChouetteIhm::Application.routes.draw do    resources :referentials do      resources :api_keys      resources :rule_parameter_sets -    resources :stop_point_areas +    resources :autocomplete_stop_areas      match 'lines' => 'lines#destroy_all', :via => :delete      resources :group_of_lines do -      resources :stop_areas do -        resources :access_points -        resources :stop_area_copies -        resources :stop_area_parents -        resources :stop_area_children -        resources :stop_area_routing_lines -        resources :stop_area_routing_stops -        member do -          get 'add_children' -          get 'select_parent' -          get 'add_routing_lines' -          get 'add_routing_stops' -        end -      end -      resources :lines        collection do          get :name_filter        end      end -      resources :lines do        collection do          get :name_filter @@ -91,21 +75,11 @@ ChouetteIhm::Application.routes.draw do      end      resources :lines, :networks, :group_of_lines do -      resources :stop_areas do -        resources :access_points -        resources :stop_area_copies -        resources :stop_area_parents -        resources :stop_area_children -        resources :stop_area_routing_lines -        resources :stop_area_routing_stops +      resources :routes do          member do -          get 'add_children' -          get 'select_parent' -          get 'add_routing_lines' -          get 'add_routing_stops' +          get 'edit_boarding_alighting' +          put 'save_boarding_alighting'          end -      end -      resources :routes do          resources :journey_patterns do            member do              get 'new_vehicle_journey' @@ -167,10 +141,7 @@ ChouetteIhm::Application.routes.draw do      resources :stop_areas do        resources :access_points        resources :stop_area_copies -      resources :stop_area_parents -      resources :stop_area_children        resources :stop_area_routing_lines -      resources :stop_area_routing_stops        member do          get 'add_children'          get 'select_parent' @@ -184,25 +155,11 @@ ChouetteIhm::Application.routes.draw do      end      resources :connection_links do -      resources :connection_link_areas +      resources :stop_areas        member do          get 'select_areas'        end -      resources :stop_areas do -        resources :access_points -        resources :stop_area_parents -        resources :stop_area_children -        resources :stop_area_routing_lines -        resources :stop_area_routing_stops -        member do -          get 'add_children' -          get 'select_parent' -          get 'add_routing_lines' -          get 'add_routing_stops' -        end -      end      end -      resources :clean_ups    end diff --git a/db/migrate/20141210134214_add_boarding_and_alighting_to_stop_point.ninoxe_engine.rb b/db/migrate/20141210134214_add_boarding_and_alighting_to_stop_point.ninoxe_engine.rb new file mode 100644 index 000000000..7faceeded --- /dev/null +++ b/db/migrate/20141210134214_add_boarding_and_alighting_to_stop_point.ninoxe_engine.rb @@ -0,0 +1,10 @@ +# This migration comes from ninoxe_engine (originally 20141210123519) +class AddBoardingAndAlightingToStopPoint < ActiveRecord::Migration +  def change +    add_column :stop_points, :for_boarding, :string +    add_column :stop_points, :for_alighting, :string + +    add_column :vehicle_journey_at_stops, :for_boarding, :string +    add_column :vehicle_journey_at_stops, :for_alighting, :string +  end +end diff --git a/db/schema.rb b/db/schema.rb index 89cbf7d87..ba4a8fd52 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@  #  # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20141105123538) do +ActiveRecord::Schema.define(:version => 20141210134214) do    create_table "access_links", :force => true do |t|      t.integer  "access_point_id",                        :limit => 8 @@ -419,6 +419,8 @@ ActiveRecord::Schema.define(:version => 20141105123538) do      t.datetime "creation_time"      t.string   "creator_id"      t.integer  "position" +    t.string   "for_boarding" +    t.string   "for_alighting"    end    add_index "stop_points", ["objectid"], :name => "stop_points_objectid_key", :unique => true @@ -541,6 +543,8 @@ ActiveRecord::Schema.define(:version => 20141105123538) do      t.time    "waiting_time"      t.time    "elapse_duration"      t.time    "headway_frequency" +    t.string  "for_boarding" +    t.string  "for_alighting"    end    add_index "vehicle_journey_at_stops", ["stop_point_id"], :name => "index_vehicle_journey_at_stops_on_stop_pointid" diff --git a/lib/tasks/userdoc.rake b/lib/tasks/userdoc.rake index 8f93644c7..626320519 100644 --- a/lib/tasks/userdoc.rake +++ b/lib/tasks/userdoc.rake @@ -26,6 +26,7 @@ namespace :doc do      puts "build docx"      Dir.chdir "tmp/doc"      system "pandoc -s -o ../../userdoc.docx temp.textile" +    Dir.chdir "../.."      if !File.exists?("userdoc.docx")        puts "pandoc failed to produce document" @@ -35,7 +36,6 @@ namespace :doc do        # clean working directory        puts "clean temp files" -      Dir.chdir "../.."        FileUtils.rm_r("tmp/doc") if File.exist?("tmp/doc")        # end job diff --git a/public/help/2014-10-30_173033.png b/public/help/2014-10-30_173033.pngBinary files differ new file mode 100644 index 000000000..5c52cadeb --- /dev/null +++ b/public/help/2014-10-30_173033.png diff --git a/public/help/2014-10-30_173410.png b/public/help/2014-10-30_173410.pngBinary files differ new file mode 100644 index 000000000..b00d9aa62 --- /dev/null +++ b/public/help/2014-10-30_173410.png diff --git a/public/help/2014-10-30_173506.png b/public/help/2014-10-30_173506.pngBinary files differ new file mode 100644 index 000000000..3dd083da5 --- /dev/null +++ b/public/help/2014-10-30_173506.png diff --git a/public/help/2014-10-30_173604.png b/public/help/2014-10-30_173604.pngBinary files differ new file mode 100644 index 000000000..2670e3058 --- /dev/null +++ b/public/help/2014-10-30_173604.png diff --git a/public/help/2014-10-30_173740.png b/public/help/2014-10-30_173740.pngBinary files differ new file mode 100644 index 000000000..8f12145f0 --- /dev/null +++ b/public/help/2014-10-30_173740.png diff --git a/public/help/2014-10-30_173913.png b/public/help/2014-10-30_173913.pngBinary files differ new file mode 100644 index 000000000..b3c9380f4 --- /dev/null +++ b/public/help/2014-10-30_173913.png diff --git a/public/help/2014-10-30_174138.png b/public/help/2014-10-30_174138.pngBinary files differ new file mode 100644 index 000000000..508162e8d --- /dev/null +++ b/public/help/2014-10-30_174138.png diff --git a/public/help/2014-10-30_174251.png b/public/help/2014-10-30_174251.pngBinary files differ new file mode 100644 index 000000000..cd998ca39 --- /dev/null +++ b/public/help/2014-10-30_174251.png diff --git a/public/help/2014-10-30_174529.png b/public/help/2014-10-30_174529.pngBinary files differ index f9d84d802..ac1e4015b 100644 --- a/public/help/2014-10-30_174529.png +++ b/public/help/2014-10-30_174529.png diff --git a/public/help/2014-10-30_174614.png b/public/help/2014-10-30_174614.pngBinary files differ new file mode 100644 index 000000000..9abf78830 --- /dev/null +++ b/public/help/2014-10-30_174614.png diff --git a/public/help/2014-10-30_174647.png b/public/help/2014-10-30_174647.pngBinary files differ new file mode 100644 index 000000000..d06c1e6ef --- /dev/null +++ b/public/help/2014-10-30_174647.png diff --git a/public/help/2014-10-30_174728.png b/public/help/2014-10-30_174728.pngBinary files differ new file mode 100644 index 000000000..dfad38d06 --- /dev/null +++ b/public/help/2014-10-30_174728.png diff --git a/public/help/2014-10-30_175002.png b/public/help/2014-10-30_175002.pngBinary files differ new file mode 100644 index 000000000..154b2497e --- /dev/null +++ b/public/help/2014-10-30_175002.png diff --git a/public/help/2014-10-30_175041.png b/public/help/2014-10-30_175041.pngBinary files differ new file mode 100644 index 000000000..17d3ae814 --- /dev/null +++ b/public/help/2014-10-30_175041.png diff --git a/public/help/2014-10-30_175216.png b/public/help/2014-10-30_175216.pngBinary files differ index 42c31aaca..b5ca8cda6 100644 --- a/public/help/2014-10-30_175216.png +++ b/public/help/2014-10-30_175216.png diff --git a/public/help/2014-10-30_175315.png b/public/help/2014-10-30_175315.pngBinary files differ new file mode 100644 index 000000000..8069d2a8b --- /dev/null +++ b/public/help/2014-10-30_175315.png diff --git a/public/help/2014-10-30_175357.png b/public/help/2014-10-30_175357.pngBinary files differ new file mode 100644 index 000000000..b9a9a24c8 --- /dev/null +++ b/public/help/2014-10-30_175357.png diff --git a/public/help/2014-10-30_175436.png b/public/help/2014-10-30_175436.pngBinary files differ new file mode 100644 index 000000000..5637736da --- /dev/null +++ b/public/help/2014-10-30_175436.png diff --git a/public/help/2014-10-30_175506.png b/public/help/2014-10-30_175506.pngBinary files differ new file mode 100644 index 000000000..7a3a6f9ab --- /dev/null +++ b/public/help/2014-10-30_175506.png diff --git a/public/help/2014-10-30_175543.png b/public/help/2014-10-30_175543.pngBinary files differ new file mode 100644 index 000000000..200a09d0d --- /dev/null +++ b/public/help/2014-10-30_175543.png diff --git a/public/help/2014-10-30_175715.png b/public/help/2014-10-30_175715.pngBinary files differ new file mode 100644 index 000000000..7b303107a --- /dev/null +++ b/public/help/2014-10-30_175715.png diff --git a/public/help/2014-10-30_180131.png b/public/help/2014-10-30_180131.pngBinary files differ index 728962cbf..ef3d8260d 100644 --- a/public/help/2014-10-30_180131.png +++ b/public/help/2014-10-30_180131.png diff --git a/public/help/2014-10-30_180211.png b/public/help/2014-10-30_180211.pngBinary files differ index 6f405d672..1ce342ca0 100644 --- a/public/help/2014-10-30_180211.png +++ b/public/help/2014-10-30_180211.png diff --git a/public/help/2014-10-30_180447.png b/public/help/2014-10-30_180447.pngBinary files differ index 5bee70356..b6f239727 100644 --- a/public/help/2014-10-30_180447.png +++ b/public/help/2014-10-30_180447.png diff --git a/public/help/2014-10-30_180621.png b/public/help/2014-10-30_180621.pngBinary files differ new file mode 100644 index 000000000..c2364006b --- /dev/null +++ b/public/help/2014-10-30_180621.png diff --git a/public/help/2014-10-30_180647.png b/public/help/2014-10-30_180647.pngBinary files differ new file mode 100644 index 000000000..624c56675 --- /dev/null +++ b/public/help/2014-10-30_180647.png diff --git a/public/help/2014-10-30_180714.png b/public/help/2014-10-30_180714.pngBinary files differ new file mode 100644 index 000000000..62bf24e66 --- /dev/null +++ b/public/help/2014-10-30_180714.png diff --git a/public/help/2014-10-30_180747.png b/public/help/2014-10-30_180747.pngBinary files differ new file mode 100644 index 000000000..393176339 --- /dev/null +++ b/public/help/2014-10-30_180747.png diff --git a/public/help/2014-10-30_180955.png b/public/help/2014-10-30_180955.pngBinary files differ new file mode 100644 index 000000000..d59744fd1 --- /dev/null +++ b/public/help/2014-10-30_180955.png diff --git a/public/help/2014-10-30_181044.png b/public/help/2014-10-30_181044.pngBinary files differ new file mode 100644 index 000000000..53f7a6dab --- /dev/null +++ b/public/help/2014-10-30_181044.png diff --git a/public/help/2014-10-30_181251.png b/public/help/2014-10-30_181251.pngBinary files differ new file mode 100644 index 000000000..48f5ba156 --- /dev/null +++ b/public/help/2014-10-30_181251.png diff --git a/public/help/2014-10-30_181326.png b/public/help/2014-10-30_181326.pngBinary files differ new file mode 100644 index 000000000..cb83192fa --- /dev/null +++ b/public/help/2014-10-30_181326.png diff --git a/public/help/2014-10-30_181422.png b/public/help/2014-10-30_181422.pngBinary files differ new file mode 100644 index 000000000..a7b58350b --- /dev/null +++ b/public/help/2014-10-30_181422.png diff --git a/public/help/2014-10-30_181615.png b/public/help/2014-10-30_181615.pngBinary files differ new file mode 100644 index 000000000..2c0483f62 --- /dev/null +++ b/public/help/2014-10-30_181615.png diff --git a/public/help/2014-10-30_181718.png b/public/help/2014-10-30_181718.pngBinary files differ new file mode 100644 index 000000000..fabb76df5 --- /dev/null +++ b/public/help/2014-10-30_181718.png diff --git a/public/help/2014-10-30_181845.png b/public/help/2014-10-30_181845.pngBinary files differ new file mode 100644 index 000000000..8c29c22c6 --- /dev/null +++ b/public/help/2014-10-30_181845.png diff --git a/public/help/2014-10-30_181920.png b/public/help/2014-10-30_181920.pngBinary files differ new file mode 100644 index 000000000..ee2923228 --- /dev/null +++ b/public/help/2014-10-30_181920.png diff --git a/public/help/2014-10-30_182029.png b/public/help/2014-10-30_182029.pngBinary files differ new file mode 100644 index 000000000..b3c967f65 --- /dev/null +++ b/public/help/2014-10-30_182029.png diff --git a/public/help/2014-10-30_182104.png b/public/help/2014-10-30_182104.pngBinary files differ new file mode 100644 index 000000000..85cf6d09d --- /dev/null +++ b/public/help/2014-10-30_182104.png diff --git a/public/help/2014-10-30_182132.png b/public/help/2014-10-30_182132.pngBinary files differ new file mode 100644 index 000000000..885edf10d --- /dev/null +++ b/public/help/2014-10-30_182132.png diff --git a/public/help/2014-10-30_182200.png b/public/help/2014-10-30_182200.pngBinary files differ new file mode 100644 index 000000000..0b9f2d65d --- /dev/null +++ b/public/help/2014-10-30_182200.png diff --git a/public/help/2014-10-31_112140.png b/public/help/2014-10-31_112140.pngBinary files differ index acd42eb85..5e1d0ad2b 100644 --- a/public/help/2014-10-31_112140.png +++ b/public/help/2014-10-31_112140.png diff --git a/public/help/2014-10-31_112543.png b/public/help/2014-10-31_112543.pngBinary files differ index 9e2050259..a16a92138 100644 --- a/public/help/2014-10-31_112543.png +++ b/public/help/2014-10-31_112543.png diff --git a/public/help/2014-10-31_113648.png b/public/help/2014-10-31_113648.pngBinary files differ index dd85a06bc..c25adb8fb 100644 --- a/public/help/2014-10-31_113648.png +++ b/public/help/2014-10-31_113648.png diff --git a/public/help/2014-10-31_113958.png b/public/help/2014-10-31_113958.pngBinary files differ index e7187ca5f..36a98fbcf 100644 --- a/public/help/2014-10-31_113958.png +++ b/public/help/2014-10-31_113958.png diff --git a/public/help/2014-10-31_114639.png b/public/help/2014-10-31_114639.pngBinary files differ index 961d78d86..d4dbf55ff 100644 --- a/public/help/2014-10-31_114639.png +++ b/public/help/2014-10-31_114639.png diff --git a/public/help/2014-10-31_115014.png b/public/help/2014-10-31_115014.pngBinary files differ index 51cde139f..14a3fdec0 100644 --- a/public/help/2014-10-31_115014.png +++ b/public/help/2014-10-31_115014.png diff --git a/public/help/2014-10-31_120428.png b/public/help/2014-10-31_120428.pngBinary files differ index 60bfcaf78..c970527ee 100644 --- a/public/help/2014-10-31_120428.png +++ b/public/help/2014-10-31_120428.png diff --git a/public/help/2014-10-31_120905.png b/public/help/2014-10-31_120905.pngBinary files differ new file mode 100644 index 000000000..86823eb51 --- /dev/null +++ b/public/help/2014-10-31_120905.png diff --git a/public/help/2014-10-31_150601.png b/public/help/2014-10-31_150601.pngBinary files differ new file mode 100644 index 000000000..3a8173e0f --- /dev/null +++ b/public/help/2014-10-31_150601.png diff --git a/public/help/2014-10-31_151613.png b/public/help/2014-10-31_151613.pngBinary files differ new file mode 100644 index 000000000..ebbcd1d34 --- /dev/null +++ b/public/help/2014-10-31_151613.png diff --git a/public/help/2014-11-17_174706.png b/public/help/2014-11-17_174706.pngBinary files differ new file mode 100644 index 000000000..f62730dcc --- /dev/null +++ b/public/help/2014-11-17_174706.png diff --git a/public/help/2014-12-01_151637.png b/public/help/2014-12-01_151637.pngBinary files differ new file mode 100644 index 000000000..fdd2b56f5 --- /dev/null +++ b/public/help/2014-12-01_151637.png diff --git a/public/help/navigation.png b/public/help/navigation.pngBinary files differ new file mode 100644 index 000000000..b338a44c1 --- /dev/null +++ b/public/help/navigation.png | 
