diff options
Diffstat (limited to 'app/assets/javascripts')
41 files changed, 378 insertions, 232 deletions
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 3bce3ec7d..b90f7539d 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -21,3 +21,5 @@ //= require footable/footable.sort //= require_directory ./plugins //= require_directory . +require('whatwg-fetch') +require('babel-polyfill') diff --git a/app/assets/javascripts/es6_browserified/itineraries/components/BSelect2.js b/app/assets/javascripts/es6_browserified/itineraries/components/BSelect2.js index 81bf2dcbe..dae62d3e1 100644 --- a/app/assets/javascripts/es6_browserified/itineraries/components/BSelect2.js +++ b/app/assets/javascripts/es6_browserified/itineraries/components/BSelect2.js @@ -1,3 +1,4 @@ +var _ = require('lodash') var React = require('react') var PropTypes = require('react').PropTypes var Select2 = require('react-select2') @@ -27,6 +28,23 @@ class BSelect3 extends React.Component{ }) } + parsedText(data) { + let a = data.replace('</em></small>', '') + let b = a.split('<small><em>') + if (b.length > 1) { + return ( + <span> + {b[0]} + <small><em>{b[1]}</em></small> + </span> + ) + } else { + return ( + <span>{data}</span> + ) + } + } + render() { if(this.props.value.edit) return ( @@ -48,7 +66,7 @@ class BSelect3 extends React.Component{ href={origin + path + '/stop_areas/' + this.props.value.stoparea_id} title="Voir l'arrêt" > - {this.props.value.text} + {this.parsedText(this.props.value.text)} </a> ) } @@ -84,7 +102,7 @@ class BSelect2 extends React.Component{ processResults: function(data, params) { return { results: data.map( - item => Object.assign( + item => _.assign( {}, item, { text: item.name + ", " + item.zip_code + " " + item.short_city_name + " <small><em>(" + item.user_objectid + ")</em></small>" } diff --git a/app/assets/javascripts/es6_browserified/itineraries/components/OlMap.js b/app/assets/javascripts/es6_browserified/itineraries/components/OlMap.js index 76142b0e1..0eca5f3ff 100644 --- a/app/assets/javascripts/es6_browserified/itineraries/components/OlMap.js +++ b/app/assets/javascripts/es6_browserified/itineraries/components/OlMap.js @@ -1,3 +1,4 @@ +var _ = require('lodash') var React = require('react') var Component = require('react').Component var PropTypes = require('react').PropTypes @@ -96,7 +97,7 @@ class OlMap extends Component{ return false } } - let data = Object.assign({}, e.selected[0].getProperties(), {geometry: undefined}); + let data = _.assign({}, e.selected[0].getProperties(), {geometry: undefined}); this.props.onSelectMarker(this.props.index, data) } else { diff --git a/app/assets/javascripts/es6_browserified/itineraries/components/StopPoint.js b/app/assets/javascripts/es6_browserified/itineraries/components/StopPoint.js index de95759e1..48f77b8e9 100644 --- a/app/assets/javascripts/es6_browserified/itineraries/components/StopPoint.js +++ b/app/assets/javascripts/es6_browserified/itineraries/components/StopPoint.js @@ -7,7 +7,9 @@ const StopPoint = (props) => { return ( <div className='nested-fields'> <div className='wrapper'> - <div style={{width: 90}}>{props.value.user_objectid}</div> + <div style={{width: 90}}> + <span>{props.value.user_objectid}</span> + </div> <div> <BSelect2 id={'route_stop_points_' + props.id} value={props.value} onChange={props.onChange} index={props.index} /> @@ -47,12 +49,12 @@ const StopPoint = (props) => { > <span className='fa fa-arrow-down'></span> </div> - + <div className='btn btn-link' onClick={props.onToggleEdit} > - <span className={'fa' + (props.value.edit ? ' fa-undo' : ' fa-pencil')}></span> + <span className={'fa' + (props.value.edit ? ' fa-check' : ' fa-pencil')}></span> </div> <div className='btn btn-link' diff --git a/app/assets/javascripts/es6_browserified/itineraries/form_helper.js b/app/assets/javascripts/es6_browserified/itineraries/form_helper.js index d48718841..0baba27ef 100644 --- a/app/assets/javascripts/es6_browserified/itineraries/form_helper.js +++ b/app/assets/javascripts/es6_browserified/itineraries/form_helper.js @@ -1,8 +1,9 @@ const addInput = (name, value, index) => { let form = document.querySelector('form') let input = document.createElement('input') + let formatedName = 'route[stop_points_attributes]['+ index.toString()+']['+name+']' input.setAttribute('type', 'hidden') - input.setAttribute('name', `route[stop_points_attributes][${index}][${name}]`) + input.setAttribute('name', formatedName) input.setAttribute('value', value) form.appendChild(input) } diff --git a/app/assets/javascripts/es6_browserified/itineraries/index.js b/app/assets/javascripts/es6_browserified/itineraries/index.js index e4a28ab49..57c63a97b 100644 --- a/app/assets/javascripts/es6_browserified/itineraries/index.js +++ b/app/assets/javascripts/es6_browserified/itineraries/index.js @@ -17,21 +17,21 @@ const getInitialState = () => { let datas = JSON.parse(decodeURIComponent(window.itinerary_stop)) datas.map(function(v, i) { - let fancyText = v.name + let fancyText = v.name.replace("'", "\'") if(v.zip_code && v.city_name) - fancyText += ", " + v.zip_code + " " + v.city_name + fancyText += ", " + v.zip_code + " " + v.city_name.replace("'", "\'") state.push({ stoppoint_id: v.stoppoint_id, stoparea_id: v.stoparea_id, user_objectid: v.user_objectid, - short_name: v.short_name, + short_name: v.short_name.replace("'", "\'"), area_type: v.area_type, index: i, edit: false, - city_name: v.city_name, + city_name: v.city_name.replace("'", "\'"), zip_code: v.zip_code, - name: v.name, + name: v.name.replace("'", "\'"), registration_number: v.registration_number, text: fancyText, for_boarding: v.for_boarding || "normal", @@ -65,7 +65,7 @@ render( document.querySelector('input[name=commit]').addEventListener('click', (event)=>{ let state = store.getState() - for (let [i, stopPoint] of state.stopPoints.entries()){ + state.stopPoints.map((stopPoint, i) => { if (stopPoint.stoppoint_id == undefined){ stopPoint.stoppoint_id = "" } @@ -74,5 +74,5 @@ document.querySelector('input[name=commit]').addEventListener('click', (event)=> addInput('position',i, i) addInput('for_boarding',stopPoint.for_boarding, i) addInput('for_alighting',stopPoint.for_alighting, i) - } + }) }) diff --git a/app/assets/javascripts/es6_browserified/itineraries/reducers/stopPoints.js b/app/assets/javascripts/es6_browserified/itineraries/reducers/stopPoints.js index 6fc5c165f..79b9648a6 100644 --- a/app/assets/javascripts/es6_browserified/itineraries/reducers/stopPoints.js +++ b/app/assets/javascripts/es6_browserified/itineraries/reducers/stopPoints.js @@ -1,3 +1,4 @@ +var _ = require('lodash') var addInput = require('../form_helper') const stopPoint = (state = {}, action, length) => { @@ -60,7 +61,7 @@ const stopPoints = (state = [], action) => { return state.map( (t, i) => { if (i === action.index) { updateFormForDeletion(t) - return Object.assign( + return _.assign( {}, t, { @@ -84,7 +85,7 @@ const stopPoints = (state = [], action) => { case 'UPDATE_SELECT_VALUE': return state.map( (t, i) => { if (i === action.index) { - let stopState = Object.assign({}, t) + let stopState = _.assign({}, t) stopState[action.select_id] = action.select_value return stopState } else { @@ -94,7 +95,7 @@ const stopPoints = (state = [], action) => { case 'TOGGLE_EDIT': return state.map((t, i) => { if (i === action.index){ - return Object.assign({}, t, {edit: !t.edit}) + return _.assign({}, t, {edit: !t.edit}) } else { return t } @@ -103,19 +104,19 @@ const stopPoints = (state = [], action) => { return state.map( (t, i) => { if (i === action.index){ let val = !t.olMap.isOpened - let jsonData = val ? Object.assign({}, t, {olMap: undefined}) : {} - let stateMap = Object.assign({}, t.olMap, {isOpened: val, json: jsonData}) - return Object.assign({}, t, {olMap: stateMap}) + let jsonData = val ? _.assign({}, t, {olMap: undefined}) : {} + let stateMap = _.assign({}, t.olMap, {isOpened: val, json: jsonData}) + return _.assign({}, t, {olMap: stateMap}) }else { - let emptyMap = Object.assign({}, t.olMap, {isOpened: false, json : {}}) - return Object.assign({}, t, {olMap: emptyMap}) + let emptyMap = _.assign({}, t.olMap, {isOpened: false, json : {}}) + return _.assign({}, t, {olMap: emptyMap}) } }) case 'SELECT_MARKER': return state.map((t, i) => { if (i === action.index){ - let stateMap = Object.assign({}, t.olMap, {json: action.data}) - return Object.assign({}, t, {olMap: stateMap}) + let stateMap = _.assign({}, t.olMap, {json: action.data}) + return _.assign({}, t, {olMap: stateMap}) } else { return t } @@ -123,16 +124,16 @@ const stopPoints = (state = [], action) => { case 'UNSELECT_MARKER': return state.map((t, i) => { if (i === action.index){ - let stateMap = Object.assign({}, t.olMap, {json: {}}) - return Object.assign({}, t, {olMap: stateMap}) + let stateMap = _.assign({}, t.olMap, {json: {}}) + return _.assign({}, t, {olMap: stateMap}) } else { return t } }) case 'CLOSE_MAP': return state.map( (t, i) => { - let emptyMap = Object.assign({}, t.olMap, {isOpened: false, json: {}}) - return Object.assign({}, t, {olMap: emptyMap}) + let emptyMap = _.assign({}, t.olMap, {isOpened: false, json: {}}) + return _.assign({}, t, {olMap: emptyMap}) }) default: return state diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/actions/index.js b/app/assets/javascripts/es6_browserified/journey_patterns/actions/index.js index a31f89841..709686f21 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/actions/index.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/actions/index.js @@ -1,3 +1,10 @@ +var Promise = require('promise-polyfill') + +// To add to window +if (!window.Promise) { + window.Promise = Promise; +} + const actions = { receiveJourneyPatterns : (json) => ({ type: "RECEIVE_JOURNEY_PATTERNS", @@ -101,7 +108,8 @@ const actions = { submitJourneyPattern : (dispatch, state, next) => { dispatch(actions.fetchingApi()) let urlJSON = window.location.pathname + ".json" - let req = new Request(urlJSON, { + let hasError = false + fetch(urlJSON, { credentials: 'same-origin', method: 'PATCH', contentType: 'application/json; charset=utf-8', @@ -110,10 +118,7 @@ const actions = { headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') } - }) - let hasError = false - fetch(req) - .then(response => { + }).then(response => { if(!response.ok) { hasError = true } @@ -158,12 +163,10 @@ const actions = { str = '.json?page=' + page.toString() } let urlJSON = window.location.pathname + str - let req = new Request(urlJSON, { - credentials: 'same-origin', - }) let hasError = false - fetch(req) - .then(response => { + fetch(urlJSON, { + credentials: 'same-origin', + }).then(response => { if(response.status == 500) { hasError = true } diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/components/CreateModal.js b/app/assets/javascripts/es6_browserified/journey_patterns/components/CreateModal.js index 573ebf228..aa2d208df 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/components/CreateModal.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/components/CreateModal.js @@ -17,7 +17,7 @@ class CreateModal extends Component { } render() { - if(this.props.status.isFetching == true) { + if(this.props.status.isFetching == true || this.props.status.policy['journey_patterns.edit'] == false) { return false } if(this.props.status.fetchSuccess == true) { diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPattern.js b/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPattern.js index 3dae38d74..d9f6d5550 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPattern.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPattern.js @@ -14,7 +14,7 @@ class JourneyPattern extends Component{ let vjURL = routeURL + '/vehicle_journeys?jp=' + jpOid return ( - <a href={vjURL}>Horaires des courses</a> + <a data-no-turbolink="true" href={vjURL}>Horaires des courses</a> ) } @@ -34,7 +34,7 @@ class JourneyPattern extends Component{ type='checkbox' id={sp.id} checked={sp.checked} - disabled={this.props.value.deletable ? 'disabled' : ''} + disabled={(this.props.value.deletable || this.props.status.policy['journey_patterns.edit'] == false) ? 'disabled' : ''} > </input> <span className='radio-label'></span> @@ -74,29 +74,30 @@ class JourneyPattern extends Component{ <span className='fa fa-cog'></span> </div> <ul className='dropdown-menu'> - <li className={this.props.value.deletable ? 'disabled' : ''}> - <a - href='#' + <li className={(this.props.value.deletable || this.props.status.policy['journey_patterns.edit'] == false) ? 'disabled' : ''}> + <button + type='button' onClick={this.props.onOpenEditModal} data-toggle='modal' data-target='#JourneyPatternModal' > Editer - </a> + </button> </li> <li className={this.props.value.object_id ? '' : 'disabled'}> {this.vehicleJourneyURL(this.props.value.object_id)} </li> - <li className='delete-action'> - <a - href='#' + <li className={'delete-action' + ((this.props.status.policy['journey_patterns.edit'] == false)? ' disabled' : '')}> + <button + type='button' + disabled={(this.props.status.policy['journey_patterns.edit'] == false)? 'disabled' : ''} onClick={(e) => { e.preventDefault() this.props.onDeleteJourneyPattern(this.props.index)} } > - <span className='fa fa-trash'></span>Supprimer - </a> + <span className='fa fa-trash'></span>Supprimer + </button> </li> </ul> </div> diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPatterns.js b/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPatterns.js index 37a0a5126..e0557d651 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPatterns.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPatterns.js @@ -116,6 +116,7 @@ class JourneyPatterns extends Component{ onCheckboxChange= {(e) => this.props.onCheckboxChange(e, index)} onOpenEditModal= {() => this.props.onOpenEditModal(index, journeyPattern)} onDeleteJourneyPattern={() => this.props.onDeleteJourneyPattern(index)} + status= {this.props.status} /> )} </div> diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/components/Navigate.js b/app/assets/javascripts/es6_browserified/journey_patterns/components/Navigate.js index 839d8f72e..3ca860e2e 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/components/Navigate.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/components/Navigate.js @@ -7,7 +7,6 @@ let Navigate = ({ dispatch, journeyPatterns, pagination, status }) => { let firstPage = 1 let lastPage = Math.ceil(pagination.totalCount / window.journeyPatternsPerPage) - let ItemLength = window.journeyPatternLength let firstItemOnPage = firstPage + (pagination.perPage * (pagination.page - firstPage)) let lastItemOnPage = firstItemOnPage + (pagination.perPage - firstPage) @@ -19,7 +18,7 @@ let Navigate = ({ dispatch, journeyPatterns, pagination, status }) => { <div className='row'> <div className='col-lg-12 text-right'> <div className='pagination'> - Liste des missions {firstItemOnPage} à {(lastItemOnPage < ItemLength) ? lastItemOnPage : ItemLength} sur {ItemLength} + Liste des missions {firstItemOnPage} à {(lastItemOnPage < pagination.totalCount) ? lastItemOnPage : pagination.totalCount} sur {pagination.totalCount} <form className='page_links' onSubmit={e => { e.preventDefault() }}> diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/components/SaveJourneyPattern.js b/app/assets/javascripts/es6_browserified/journey_patterns/components/SaveJourneyPattern.js index 6e09430a0..93dfa8c6b 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/components/SaveJourneyPattern.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/components/SaveJourneyPattern.js @@ -15,7 +15,7 @@ class SaveJourneyPattern extends Component{ } render() { - if(this.props.status.isFetching == true) { + if(this.props.status.isFetching == true || (this.props.status.policy['journey_patterns.edit'] == false)) { return false } if(this.props.status.fetchSuccess == true) { diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/index.js b/app/assets/javascripts/es6_browserified/journey_patterns/index.js index a2e1c2fb6..b06957e0f 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/index.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/index.js @@ -13,6 +13,7 @@ var App = require('./components/App') var initialState = { status: { + policy: window.perms, fetchSuccess: true, isFetching: false }, diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/reducers/journeyPatterns.js b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/journeyPatterns.js index 92381f018..d4f7257d7 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/reducers/journeyPatterns.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/journeyPatterns.js @@ -1,3 +1,4 @@ +var _ = require('lodash') var actions = require("../actions") const journeyPattern = (state = {}, action) => { @@ -21,12 +22,12 @@ const journeyPattern = (state = {}, action) => { case 'UPDATE_CHECKBOX_VALUE': var updatedStopPoints = state.stop_points.map((s) => { if (String(s.id) == action.id) { - return Object.assign({}, s, {checked : !s.checked}) + return _.assign({}, s, {checked : !s.checked}) }else { return s } }) - return Object.assign({}, state, {stop_points: updatedStopPoints}) + return _.assign({}, state, {stop_points: updatedStopPoints}) default: return state } @@ -61,7 +62,7 @@ const journeyPatterns = (state = [], action) => { case 'DELETE_JOURNEYPATTERN': return state.map((j, i) =>{ if(i == action.index) { - return Object.assign({}, j, {deletable: true}) + return _.assign({}, j, {deletable: true}) } else { return j } @@ -74,7 +75,7 @@ const journeyPatterns = (state = [], action) => { case 'SAVE_MODAL': return state.map((j, i) =>{ if(i == action.index) { - return Object.assign({}, j, { + return _.assign({}, j, { name: action.data.name.value, published_name: action.data.published_name.value, registration_number: action.data.registration_number.value diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/reducers/modal.js b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/modal.js index cb274d767..86cfb5a25 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/reducers/modal.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/modal.js @@ -1,8 +1,9 @@ +var _ = require('lodash') const modal = (state = {}, action) => { switch (action.type) { case 'OPEN_CONFIRM_MODAL': $('#ConfirmModal').modal('show') - return Object.assign({}, state, { + return _.assign({}, state, { type: 'confirm', confirmModal: { callback: action.callback, @@ -24,9 +25,9 @@ const modal = (state = {}, action) => { confirmModal: {} } case 'DELETE_JOURNEYPATTERN': - return Object.assign({}, state, { type: '' }) + return _.assign({}, state, { type: '' }) case 'SAVE_MODAL': - return Object.assign({}, state, { type: '' }) + return _.assign({}, state, { type: '' }) case 'CLOSE_MODAL': return { type: '', diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/reducers/pagination.js b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/pagination.js index 48d95fdea..0714ca843 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/reducers/pagination.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/pagination.js @@ -1,26 +1,27 @@ +var _ = require('lodash') const pagination = (state = {}, action) => { switch (action.type) { case 'RECEIVE_JOURNEY_PATTERNS': - return Object.assign({}, state, {stateChanged: false}) + return _.assign({}, state, {stateChanged: false}) case 'GO_TO_PREVIOUS_PAGE': if (action.pagination.page > 1){ toggleOnConfirmModal() - return Object.assign({}, state, {page : action.pagination.page - 1, stateChanged: false}) + return _.assign({}, state, {page : action.pagination.page - 1, stateChanged: false}) } return state case 'GO_TO_NEXT_PAGE': if (state.totalCount - (action.pagination.page * action.pagination.perPage) > 0){ toggleOnConfirmModal() - return Object.assign({}, state, {page : action.pagination.page + 1, stateChanged: false}) + return _.assign({}, state, {page : action.pagination.page + 1, stateChanged: false}) } return state case 'UPDATE_CHECKBOX_VALUE': case 'ADD_JOURNEYPATTERN': case 'SAVE_MODAL': toggleOnConfirmModal('modal') - return Object.assign({}, state, {stateChanged: true}) + return _.assign({}, state, {stateChanged: true}) case 'UPDATE_TOTAL_COUNT': - return Object.assign({}, state, {totalCount : state.totalCount - action.diff }) + return _.assign({}, state, {totalCount : state.totalCount - action.diff }) default: return state } diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/reducers/status.js b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/status.js index 973fab0f9..6241777da 100644 --- a/app/assets/javascripts/es6_browserified/journey_patterns/reducers/status.js +++ b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/status.js @@ -1,13 +1,14 @@ +var _ = require('lodash') var actions = require("../actions") const status = (state = {}, action) => { switch (action.type) { case 'UNAVAILABLE_SERVER': - return Object.assign({}, state, {fetchSuccess: false}) + return _.assign({}, state, {fetchSuccess: false}) case 'FETCH_API': - return Object.assign({}, state, {isFetching: true}) + return _.assign({}, state, {isFetching: true}) case 'RECEIVE_JOURNEY_PATTERNS': - return Object.assign({}, state, {fetchSuccess: true, isFetching: false}) + return _.assign({}, state, {fetchSuccess: true, isFetching: false}) default: return state } diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js index 14e127d3c..9abaf9d0f 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js @@ -1,3 +1,9 @@ +var Promise = require('promise-polyfill') + +// To add to window +if (!window.Promise) { + window.Promise = Promise; +} var batchActions = require('../batch').batchActions const actions = { @@ -271,12 +277,10 @@ const actions = { if (queryString){ urlJSON = urlJSON + sep + queryString } - let req = new Request(urlJSON, { - credentials: 'same-origin', - }) let hasError = false - fetch(req) - .then(response => { + fetch(urlJSON, { + credentials: 'same-origin', + }).then(response => { if(response.status == 500) { hasError = true } @@ -322,7 +326,8 @@ const actions = { submitVehicleJourneys : (dispatch, state, next) => { dispatch(actions.fetchingApi()) let urlJSON = window.location.pathname + "_collection.json" - let req = new Request(urlJSON, { + let hasError = false + fetch(urlJSON, { credentials: 'same-origin', method: 'PATCH', contentType: 'application/json; charset=utf-8', @@ -331,10 +336,7 @@ const actions = { headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') } - }) - let hasError = false - fetch(req) - .then(response => { + }).then(response => { if(!response.ok) { hasError = true } @@ -360,13 +362,29 @@ const actions = { return obj.selected }) }, - pad: (d) => { + simplePad: (d) => { if(d.toString().length == 1){ return (d < 10) ? '0' + d.toString() : d.toString(); }else{ return d.toString() } }, + pad: (d, timeUnit) => { + let val = d.toString() + if(d.toString().length == 1){ + val = (d < 10) ? '0' + d.toString() : d.toString(); + } + if(val.length > 2){ + val = val.substr(1) + } + if(timeUnit == 'minute' && parseInt(val) > 59){ + val = '59' + } + if(timeUnit == 'hour' && parseInt(val) > 23){ + val = '23' + } + return val + }, encodeParams: (params) => { let esc = encodeURIComponent let queryString = Object.keys(params).map((k) => esc(k) + '=' + esc(params[k])).join('&') @@ -388,20 +406,61 @@ const actions = { return vjas }, checkSchedules: (schedule) => { + let hours = 0 + let minutes = 0 if (parseInt(schedule.departure_time.minute) > 59){ - schedule.departure_time.minute = actions.pad(parseInt(schedule.departure_time.minute) - 60) - schedule.departure_time.hour = actions.pad(parseInt(schedule.departure_time.hour) + 1) + hours = Math.floor(parseInt(schedule.departure_time.minute) / 60) + minutes = parseInt(schedule.departure_time.minute) % 60 + schedule.departure_time.minute = actions.simplePad(minutes, 'minute') + schedule.departure_time.hour = parseInt(schedule.departure_time.hour) + hours } if (parseInt(schedule.arrival_time.minute) > 59){ - schedule.arrival_time.minute = actions.pad(parseInt(schedule.arrival_time.minute) - 60) - schedule.arrival_time.hour = actions.pad(parseInt(schedule.arrival_time.hour) + 1) + hours = Math.floor(parseInt(schedule.arrival_time.minute) / 60) + minutes = parseInt(schedule.arrival_time.minute) % 60 + schedule.arrival_time.minute = actions.simplePad(minutes, 'minute') + schedule.arrival_time.hour = parseInt(schedule.arrival_time.hour) + hours + } + if (parseInt(schedule.departure_time.minute) < 0){ + hours = Math.floor(parseInt(schedule.departure_time.minute) / 60) + minutes = (parseInt(schedule.departure_time.minute) % 60) + 60 + schedule.departure_time.minute = actions.simplePad(minutes, 'minute') + schedule.departure_time.hour = parseInt(schedule.departure_time.hour) + hours + } + if (parseInt(schedule.arrival_time.minute) < 0){ + hours = Math.floor(parseInt(schedule.arrival_time.minute) / 60) + minutes = (parseInt(schedule.arrival_time.minute) % 60) + 60 + schedule.arrival_time.minute = actions.simplePad(minutes, 'minute') + schedule.arrival_time.hour = parseInt(schedule.arrival_time.hour) + hours } - if (parseInt(schedule.departure_time.hour) > 23){ - schedule.departure_time.hour = actions.pad(parseInt(schedule.departure_time.hour) - 24) + + if(schedule.departure_time.hour > 23){ + schedule.departure_time.hour = '23' + schedule.departure_time.minute = '59' + } + if(schedule.arrival_time.hour > 23){ + schedule.arrival_time.hour = '23' + schedule.arrival_time.minute = '59' } - if (parseInt(schedule.arrival_time.hour) > 23){ - schedule.arrival_time.hour = actions.pad(parseInt(schedule.arrival_time.hour) - 24) + + if(schedule.departure_time.hour < 0){ + schedule.departure_time.hour = '00' + schedule.departure_time.minute = '00' } + if(schedule.arrival_time.hour > 23){ + schedule.arrival_time.hour = '00' + schedule.arrival_time.minute = '00' + } + + schedule.departure_time.hour = actions.simplePad(parseInt(schedule.departure_time.hour), 'hour') + schedule.arrival_time.hour = actions.simplePad(parseInt(schedule.arrival_time.hour), 'hour') + // if (parseInt(schedule.departure_time.hour) > 23){ + // schedule.departure_time.hour = parseInt(schedule.departure_time.hour) - 24 + // } + // if (parseInt(schedule.arrival_time.hour) > 23){ + // schedule.arrival_time.hour = parseInt(schedule.arrival_time.hour) - 24 + // } + // schedule.departure_time.hour = actions.pad(schedule.departure_time.hour, 'hour') + // schedule.arrival_time.hour = actions.pad(schedule.arrival_time.hour, 'hour') } } diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/SaveVehicleJourneys.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/SaveVehicleJourneys.js index b22e1d826..bd34ae114 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/SaveVehicleJourneys.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/SaveVehicleJourneys.js @@ -15,7 +15,7 @@ class SaveVehicleJourneys extends Component{ } render() { - if(this.props.status.isFetching == true) { + if(this.props.status.isFetching == true || this.props.filters.policy['vehicle_journeys.edit'] == false) { return false } if(this.props.status.fetchSuccess == true) { @@ -46,7 +46,8 @@ class SaveVehicleJourneys extends Component{ SaveVehicleJourneys.propTypes = { vehicleJourneys: PropTypes.array.isRequired, page: PropTypes.number.isRequired, - status: PropTypes.object.isRequired + status: PropTypes.object.isRequired, + filters: PropTypes.object.isRequired } module.exports = SaveVehicleJourneys diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js index c88dda5f4..0645fdd19 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js @@ -54,31 +54,33 @@ class VehicleJourney extends Component { <div key={i}>{this.timeTableURL(tt.id)}</div> )} - <div className={(this.props.value.deletable ? 'disabled ' : '') + 'checkbox'}> - <input - id={this.props.index} - name={this.props.index} - onChange={(e) => this.props.onSelectVehicleJourney(this.props.index)} - type='checkbox' - disabled={this.props.value.deletable} - checked={this.props.value.selected} - ></input> - <label htmlFor={this.props.index}></label> - </div> - </div> + {(this.props.filters.policy['vehicle_journeys.edit'] == true) && + <div className={(this.props.value.deletable ? 'disabled ' : '') + 'checkbox'}> + <input + id={this.props.index} + name={this.props.index} + onChange={(e) => this.props.onSelectVehicleJourney(this.props.index)} + type='checkbox' + disabled={this.props.value.deletable} + checked={this.props.value.selected} + ></input> + <label htmlFor={this.props.index}></label> + </div> + } + </div> {this.props.value.vehicle_journey_at_stops.map((vj, i) => <div key={i} className='td text-center'> - <div className={'cellwrap' + (this.cityNameChecker(vj) ? ' headlined' : '')}> + <div className={'cellwrap' + (vj.dummy ? ' headlined' : '') + (this.cityNameChecker(vj) ? ' headlined' : '')}> {this.props.filters.toggleArrivals && - <div data-headline='Départ à'> - <span className={((this.props.value.deletable && (!vj.dummy)) ? 'disabled ' : '') + 'input-group time'}> + <div data-headline='Arrivée à'> + <span className={((this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.edit'] == false) ? 'disabled ' : '') + 'input-group time'}> <input type='number' min='00' max='23' className='form-control' - disabled={(this.props.value.deletable && (!vj.dummy))} + disabled={(this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.edit'] == false)} onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'hour', false, false)}} value={vj.arrival_time['hour']} /> @@ -88,7 +90,7 @@ class VehicleJourney extends Component { min='00' max='59' className='form-control' - disabled={((this.props.value.deletable) && (!vj.dummy))} + disabled={((this.isDisabled(this.props.value.deletable), vj.dummy) || this.props.filters.policy['vehicle_journeys.edit'] == false)} onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'minute', false, false)}} value={vj.arrival_time['minute']} /> @@ -100,14 +102,14 @@ class VehicleJourney extends Component { <span className='sb sb-chrono sb-lg text-warning' data-textinside={vj.delta}></span> } </div> - <div data-headline='Arrivée à'> - <span className={(this.isDisabled(this.props.value.deletable, vj.dummy) ? 'disabled ' : '') + 'input-group time'}> + <div data-headline='Départ à'> + <span className={((this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.edit'] == false) ? 'disabled ' : '') + 'input-group time'}> <input type='number' min='00' max='23' className='form-control' - disabled={this.isDisabled(this.props.value.deletable, vj.dummy)} + disabled={(this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.edit'] == false)} onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'hour', true, this.props.filters.toggleArrivals)}} value={vj.departure_time['hour']} /> @@ -117,7 +119,7 @@ class VehicleJourney extends Component { min='00' max='59' className='form-control' - disabled={this.isDisabled(this.props.value.deletable, vj.dummy)} + disabled={(this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.edit'] == false)} onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, "minute", true, this.props.filters.toggleArrivals)}} value={vj.departure_time['minute']} /> diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CalendarsEditVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CalendarsEditVehicleJourney.js index 19a5af869..e32c873e6 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CalendarsEditVehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CalendarsEditVehicleJourney.js @@ -22,15 +22,15 @@ class CalendarsEditVehicleJourney extends Component { if(this.props.status.fetchSuccess == true) { return ( <li className='st_action'> - <a - href='#' - className={(actions.getSelected(this.props.vehicleJourneys).length > 0 && this.props.filters.policy['vehicle_journeys.edit']) ? '' : 'disabled'} + <button + type='button' + disabled={(actions.getSelected(this.props.vehicleJourneys).length > 0 && this.props.filters.policy['vehicle_journeys.edit']) ? '' : 'disabled'} data-toggle='modal' data-target='#CalendarsEditVehicleJourneyModal' onClick={() => this.props.onOpenCalendarsEditModal(actions.getSelected(this.props.vehicleJourneys))} > <span className='fa fa-calendar'></span> - </a> + </button> <div className={ 'modal fade ' + ((this.props.modal.type == 'duplicate') ? 'in' : '') } id='CalendarsEditVehicleJourneyModal'> <div className='modal-container'> diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CreateModal.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CreateModal.js index 2150287ba..1273921e7 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CreateModal.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CreateModal.js @@ -25,22 +25,22 @@ class CreateModal extends Component { if(this.props.status.fetchSuccess == true) { return ( <li className='st_action'> - <a - href='#' - className={((this.props.filters.policy['vehicle_journeys.create']) ? '' : 'disabled')} + <button + type='button' + disabled={((this.props.filters.policy['vehicle_journeys.edit'] == true) ? '' : 'disabled')} data-toggle='modal' data-target='#NewVehicleJourneyModal' onClick={this.props.onOpenCreateModal} > <span className='fa fa-plus'></span> - </a> + </button> <div className={ 'modal fade ' + ((this.props.modal.type == 'create') ? 'in' : '') } id='NewVehicleJourneyModal'> <div className='modal-container'> <div className='modal-dialog'> <div className='modal-content'> <div className='modal-header'> - <h4 className='modal-title'>Ajouter une mission</h4> + <h4 className='modal-title'>Ajouter une course</h4> </div> {(this.props.modal.type == 'create') && ( diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DeleteVehicleJourneys.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DeleteVehicleJourneys.js index e2425cc22..c98b794a8 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DeleteVehicleJourneys.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DeleteVehicleJourneys.js @@ -5,9 +5,9 @@ var actions = require('../../actions') const DeleteVehicleJourneys = ({onDeleteVehicleJourneys, vehicleJourneys, filters}) => { return ( <li className='st_action'> - <a - href='#' - className={(actions.getSelected(vehicleJourneys).length > 0 && filters.policy['vehicle_journeys.destroy']) ? '' : 'disabled'} + <button + type='button' + disabled={(actions.getSelected(vehicleJourneys).length > 0 && filters.policy['vehicle_journeys.destroy']) ? '' : 'disabled'} onClick={e => { e.preventDefault() onDeleteVehicleJourneys() @@ -15,7 +15,7 @@ const DeleteVehicleJourneys = ({onDeleteVehicleJourneys, vehicleJourneys, filter title='Supprimer' > <span className='fa fa-trash'></span> - </a> + </button> </li> ) } diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DuplicateVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DuplicateVehicleJourney.js index b0cb1c850..7448aa06e 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DuplicateVehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DuplicateVehicleJourney.js @@ -23,15 +23,15 @@ class DuplicateVehicleJourney extends Component { if(this.props.status.fetchSuccess == true) { return ( <li className='st_action'> - <a - href='#' - className={((actions.getSelected(this.props.vehicleJourneys).length == 1 && this.props.filters.policy['vehicle_journeys.edit']) ? '' : 'disabled')} + <button + type='button' + disabled={((actions.getSelected(this.props.vehicleJourneys).length == 1 && this.props.filters.policy['vehicle_journeys.edit']) ? '' : 'disabled')} data-toggle='modal' data-target='#DuplicateVehicleJourneyModal' onClick={this.props.onOpenDuplicateModal} > <span className='fa fa-files-o'></span> - </a> + </button> <div className={ 'modal fade ' + ((this.props.modal.type == 'duplicate') ? 'in' : '') } id='DuplicateVehicleJourneyModal'> <div className='modal-container'> @@ -68,7 +68,7 @@ class DuplicateVehicleJourney extends Component { <input type='number' ref='additional_time' - min='0' + min='-59' max='59' className='form-control' onKeyDown={(e) => actions.resetValidation(e.currentTarget)} diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/EditVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/EditVehicleJourney.js index f7726dad9..12814bad1 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/EditVehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/EditVehicleJourney.js @@ -24,15 +24,15 @@ class EditVehicleJourney extends Component { if(this.props.status.fetchSuccess == true) { return ( <li className='st_action'> - <a - href='#' - className={(actions.getSelected(this.props.vehicleJourneys).length == 1 && this.props.filters.policy['vehicle_journeys.edit']) ? '' : 'disabled'} + <button + type='button' + disabled={(actions.getSelected(this.props.vehicleJourneys).length == 1 && this.props.filters.policy['vehicle_journeys.edit']) ? '' : 'disabled'} data-toggle='modal' data-target='#EditVehicleJourneyModal' onClick={() => this.props.onOpenEditModal(actions.getSelected(this.props.vehicleJourneys)[0])} > <span className='fa fa-info'></span> - </a> + </button> <div className={ 'modal fade ' + ((this.props.modal.type == 'duplicate') ? 'in' : '') } id='EditVehicleJourneyModal'> <div className='modal-container'> diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/NotesEditVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/NotesEditVehicleJourney.js index 7c5df3333..ca8b2ec7d 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/NotesEditVehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/NotesEditVehicleJourney.js @@ -44,15 +44,15 @@ class NotesEditVehicleJourney extends Component { if(this.props.status.fetchSuccess == true) { return ( <li className='st_action'> - <a - href='#' - className={(actions.getSelected(this.props.vehicleJourneys).length == 1 && this.props.filters.policy['vehicle_journeys.edit']) ? '' : 'disabled'} + <button + type='button' + disabled={(actions.getSelected(this.props.vehicleJourneys).length == 1 && this.props.filters.policy['vehicle_journeys.edit']) ? '' : 'disabled'} data-toggle='modal' data-target='#NotesEditVehicleJourneyModal' onClick={() => this.props.onOpenNotesEditModal(actions.getSelected(this.props.vehicleJourneys)[0])} > <span className='fa fa-sticky-note'></span> - </a> + </button> <div className={ 'modal fade ' + ((this.props.modal.type == 'duplicate') ? 'in' : '') } id='NotesEditVehicleJourneyModal'> <div className='modal-container'> diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/ShiftVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/ShiftVehicleJourney.js index a373ed1e5..ee7d01cf5 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/ShiftVehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/ShiftVehicleJourney.js @@ -23,15 +23,15 @@ class ShiftVehicleJourney extends Component { if(this.props.status.fetchSuccess == true) { return ( <li className='st_action'> - <a - href='#' - className={(actions.getSelected(this.props.vehicleJourneys).length == 1 && this.props.filters.policy['vehicle_journeys.edit']) ? '' : 'disabled'} + <button + type='button' + disabled={(actions.getSelected(this.props.vehicleJourneys).length == 1 && this.props.filters.policy['vehicle_journeys.edit']) ? '' : 'disabled'} data-toggle='modal' data-target='#ShiftVehicleJourneyModal' onClick={this.props.onOpenShiftModal} > <span className='sb sb-update-vj'></span> - </a> + </button> <div className={ 'modal fade ' + ((this.props.modal.type == 'shift') ? 'in' : '') } id='ShiftVehicleJourneyModal'> <div className='modal-container'> @@ -54,7 +54,7 @@ class ShiftVehicleJourney extends Component { <input type='number' ref='additional_time' - min='0' + min='-59' max='59' className='form-control' onKeyDown={(e) => actions.resetValidation(e.currentTarget)} diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/CompanySelect2.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/CompanySelect2.js index d9c7d7296..7837cdbff 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/CompanySelect2.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/CompanySelect2.js @@ -1,3 +1,4 @@ +var _ = require('lodash') var React = require('react') var PropTypes = require('react').PropTypes var Select2 = require('react-select2') @@ -38,7 +39,7 @@ class BSelect4 extends React.Component{ return { results: data.map( - item => Object.assign( + item => _.assign( {}, item, {text: item.name} diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/MissionSelect2.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/MissionSelect2.js index 2b4e1cd80..75cbd1f3c 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/MissionSelect2.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/MissionSelect2.js @@ -1,3 +1,4 @@ +var _ = require('lodash') var React = require('react') var PropTypes = require('react').PropTypes var Select2 = require('react-select2') @@ -37,7 +38,7 @@ class BSelect4 extends React.Component{ processResults: function(data, params) { return { results: data.map( - item => Object.assign( + item => _.assign( {}, item, {text: item.published_name} diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/TimetableSelect2.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/TimetableSelect2.js index fd1e30afb..c28d8e06f 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/TimetableSelect2.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/TimetableSelect2.js @@ -1,3 +1,4 @@ +var _ = require('lodash') var React = require('react') var PropTypes = require('react').PropTypes var Select2 = require('react-select2') @@ -38,7 +39,7 @@ class BSelect4 extends React.Component{ return { results: data.map( - item => Object.assign( + item => _.assign( {}, item, {text: item.comment} diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/SaveVehicleJourneys.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/SaveVehicleJourneys.js index 5af30ab82..87bbe5353 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/SaveVehicleJourneys.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/SaveVehicleJourneys.js @@ -7,7 +7,8 @@ const mapStateToProps = (state) => { return { vehicleJourneys: state.vehicleJourneys, page: state.pagination.page, - status: state.status + status: state.status, + filters: state.filters } } diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/filters.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/filters.js index 5b5ba0788..0fcb3489e 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/filters.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/filters.js @@ -1,3 +1,4 @@ +var _ = require('lodash') var actions = require("../actions") let newQuery, newInterval @@ -14,37 +15,37 @@ const filters = (state = {}, action) => { minute: '59' } } - newQuery = Object.assign({}, state.query, {interval: interval, journeyPattern: {}, timetable: {}, withoutSchedule: false }) - return Object.assign({}, state, {query: newQuery, queryString: ''}) + newQuery = _.assign({}, state.query, {interval: interval, journeyPattern: {}, timetable: {}, withoutSchedule: false }) + return _.assign({}, state, {query: newQuery, queryString: ''}) case 'TOGGLE_WITHOUT_SCHEDULE': - newQuery = Object.assign({}, state.query, {withoutSchedule: !state.query.withoutSchedule}) - return Object.assign({}, state, {query: newQuery}) + newQuery = _.assign({}, state.query, {withoutSchedule: !state.query.withoutSchedule}) + return _.assign({}, state, {query: newQuery}) case 'UPDATE_END_TIME_FILTER': newInterval = JSON.parse(JSON.stringify(state.query.interval)) - newInterval.end[action.unit] = actions.pad(action.val) + newInterval.end[action.unit] = actions.pad(action.val, action.unit) if(parseInt(newInterval.start.hour + newInterval.start.minute) < parseInt(newInterval.end.hour + newInterval.end.minute)){ - newQuery = Object.assign({}, state.query, {interval: newInterval}) - return Object.assign({}, state, {query: newQuery}) + newQuery = _.assign({}, state.query, {interval: newInterval}) + return _.assign({}, state, {query: newQuery}) }else{ return state } case 'UPDATE_START_TIME_FILTER': newInterval = JSON.parse(JSON.stringify(state.query.interval)) - newInterval.start[action.unit] = actions.pad(action.val) + newInterval.start[action.unit] = actions.pad(action.val, action.unit) if(parseInt(newInterval.start.hour + newInterval.start.minute) < parseInt(newInterval.end.hour + newInterval.end.minute)){ - newQuery = Object.assign({}, state.query, {interval: newInterval}) - return Object.assign({}, state, {query: newQuery}) + newQuery = _.assign({}, state.query, {interval: newInterval}) + return _.assign({}, state, {query: newQuery}) }else{ return state } case 'SELECT_TT_FILTER': - newQuery = Object.assign({}, state.query, {timetable : action.selectedItem}) - return Object.assign({}, state, {query: newQuery}) + newQuery = _.assign({}, state.query, {timetable : action.selectedItem}) + return _.assign({}, state, {query: newQuery}) case 'SELECT_JP_FILTER': - newQuery = Object.assign({}, state.query, {journeyPattern : action.selectedItem}) - return Object.assign({}, state, {query: newQuery}) + newQuery = _.assign({}, state.query, {journeyPattern : action.selectedItem}) + return _.assign({}, state, {query: newQuery}) case 'TOGGLE_ARRIVALS': - return Object.assign({}, state, {toggleArrivals: !state.toggleArrivals}) + return _.assign({}, state, {toggleArrivals: !state.toggleArrivals}) case 'QUERY_FILTER_VEHICLEJOURNEYS': actions.fetchVehicleJourneys(action.dispatch, undefined, undefined, state.queryString) return state @@ -53,10 +54,11 @@ const filters = (state = {}, action) => { 'q[journey_pattern_id_eq]': state.query.journeyPattern.id || undefined, 'q[time_tables_id_eq]': state.query.timetable.id || undefined, 'q[vehicle_journey_at_stops_departure_time_gteq]': (state.query.interval.start.hour + ':' + state.query.interval.start.minute), - 'q[vehicle_journey_at_stops_departure_time_lteq]': (state.query.interval.end.hour + ':' + state.query.interval.end.minute) + 'q[vehicle_journey_at_stops_departure_time_lteq]': (state.query.interval.end.hour + ':' + state.query.interval.end.minute), + 'q[vehicle_journey_without_u2]' : state.toggleArrivals } let queryString = actions.encodeParams(params) - return Object.assign({}, state, {queryString: queryString}) + return _.assign({}, state, {queryString: queryString}) default: return state } diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js index a36aaa4fe..3b13ab9de 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js @@ -4,14 +4,14 @@ const modal = (state = {}, action) => { switch (action.type) { case 'OPEN_CONFIRM_MODAL': $('#ConfirmModal').modal('show') - return Object.assign({}, state, { + return _.assign({}, state, { type: 'confirm', confirmModal: { callback: action.callback, } }) case 'EDIT_NOTES_VEHICLEJOURNEY_MODAL': - let vehicleJourneyModal = Object.assign({}, action.vehicleJourney) + let vehicleJourneyModal = _.assign({}, action.vehicleJourney) return { type: 'notes_edit', modalProps: { @@ -26,7 +26,7 @@ const modal = (state = {}, action) => { }else{ newModalProps.vehicleJourney.footnotes = newModalProps.vehicleJourney.footnotes.filter((f) => {return f.id != action.footnote.id }) } - return Object.assign({}, state, {modalProps: newModalProps}) + return _.assign({}, state, {modalProps: newModalProps}) case 'EDIT_VEHICLEJOURNEY_MODAL': return { type: 'edit', @@ -55,11 +55,11 @@ const modal = (state = {}, action) => { confirmModal: {} } case 'SELECT_CP_EDIT_MODAL': - newModalProps = Object.assign({}, state.modalProps, {selectedCompany : action.selectedItem}) - return Object.assign({}, state, {modalProps: newModalProps}) + newModalProps = _.assign({}, state.modalProps, {selectedCompany : action.selectedItem}) + return _.assign({}, state, {modalProps: newModalProps}) case 'SELECT_TT_CALENDAR_MODAL': - newModalProps = Object.assign({}, state.modalProps, {selectedTimetable : action.selectedItem}) - return Object.assign({}, state, {modalProps: newModalProps}) + newModalProps = _.assign({}, state.modalProps, {selectedTimetable : action.selectedItem}) + return _.assign({}, state, {modalProps: newModalProps}) case 'ADD_SELECTED_TIMETABLE': if(state.modalProps.selectedTimetable){ newModalProps = JSON.parse(JSON.stringify(state.modalProps)) @@ -77,7 +77,7 @@ const modal = (state = {}, action) => { if (!_.find(newModalProps.timetables, newModalProps.selectedTimetable)){ newModalProps.timetables.push(newModalProps.selectedTimetable) } - return Object.assign({}, state, {modalProps: newModalProps}) + return _.assign({}, state, {modalProps: newModalProps}) } case 'DELETE_CALENDAR_MODAL': newModalProps = JSON.parse(JSON.stringify(state.modalProps)) @@ -97,7 +97,7 @@ const modal = (state = {}, action) => { }) newModalProps.vehicleJourneys = vehicleJourneysModal newModalProps.timetables = timetablesModal - return Object.assign({}, state, {modalProps: newModalProps}) + return _.assign({}, state, {modalProps: newModalProps}) case 'CREATE_VEHICLEJOURNEY_MODAL': return { type: 'create', @@ -105,8 +105,8 @@ const modal = (state = {}, action) => { confirmModal: {} } case 'SELECT_JP_CREATE_MODAL': - newModalProps = Object.assign({}, state.modalProps, {selectedJPModal : action.selectedItem}) - return Object.assign({}, state, {modalProps: newModalProps}) + newModalProps = _.assign({}, state.modalProps, {selectedJPModal : action.selectedItem}) + return _.assign({}, state, {modalProps: newModalProps}) case 'SHIFT_VEHICLEJOURNEY_MODAL': return { type: 'shift', diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/pagination.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/pagination.js index 31c855a2f..ee59fca6d 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/pagination.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/pagination.js @@ -1,27 +1,28 @@ +var _ = require('lodash') const pagination = (state = {}, action) => { switch (action.type) { case 'RECEIVE_JOURNEY_PATTERNS': - return Object.assign({}, state, {stateChanged: false}) + return _.assign({}, state, {stateChanged: false}) case 'GO_TO_PREVIOUS_PAGE': if (action.pagination.page > 1){ - return Object.assign({}, state, {page : action.pagination.page - 1, stateChanged: false}) + return _.assign({}, state, {page : action.pagination.page - 1, stateChanged: false}) } return state case 'GO_TO_NEXT_PAGE': if (state.totalCount - (action.pagination.page * action.pagination.perPage) > 0){ - return Object.assign({}, state, {page : action.pagination.page + 1, stateChanged: false}) + return _.assign({}, state, {page : action.pagination.page + 1, stateChanged: false}) } return state case 'ADD_VEHICLEJOURNEY': case 'UPDATE_TIME': toggleOnConfirmModal('modal') - return Object.assign({}, state, {stateChanged: true}) + return _.assign({}, state, {stateChanged: true}) case 'RESET_PAGINATION': - return Object.assign({}, state, {page: 1, stateChanged: false}) + return _.assign({}, state, {page: 1, stateChanged: false}) case 'RECEIVE_TOTAL_COUNT': - return Object.assign({}, state, {totalCount: action.total}) + return _.assign({}, state, {totalCount: action.total}) case 'UPDATE_TOTAL_COUNT': - return Object.assign({}, state, {totalCount : state.totalCount - action.diff }) + return _.assign({}, state, {totalCount : state.totalCount - action.diff }) default: return state } diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/status.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/status.js index 3351aec4f..e658e164e 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/status.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/status.js @@ -1,13 +1,16 @@ +var _ = require('lodash') var actions = require("../actions") const status = (state = {}, action) => { switch (action.type) { case 'UNAVAILABLE_SERVER': - return Object.assign({}, state, {fetchSuccess: false}) + return _.assign({}, state, {fetchSuccess: false}) case 'FETCH_API': - return Object.assign({}, state, {isFetching: true}) + return _.assign({}, state, {isFetching: true}) case 'RECEIVE_VEHICLE_JOURNEYS': - return Object.assign({}, state, {fetchSuccess: true, isFetching: false}) + return _.assign({}, state, {fetchSuccess: true, isFetching: false}) + case 'RECEIVE_ERRORS': + return _.assign({}, state, {fetchSuccess: true, isFetching: false}) default: return state } diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js index ae98b6743..ba3d58c22 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js @@ -4,9 +4,9 @@ var actions = require("../actions") const vehicleJourney= (state = {}, action) => { switch (action.type) { case 'SELECT_VEHICLEJOURNEY': - return Object.assign({}, state, {selected: !state.selected}) + return _.assign({}, state, {selected: !state.selected}) case 'CANCEL_SELECTION': - return Object.assign({}, state, {selected: false}) + return _.assign({}, state, {selected: false}) case 'ADD_VEHICLEJOURNEY': let pristineVjasList = [] _.each(action.stopPointsList, (sp) =>{ @@ -47,45 +47,56 @@ const vehicleJourney= (state = {}, action) => { case 'SHIFT_VEHICLEJOURNEY': let shiftedArray, shiftedSchedule, shiftedVjas shiftedArray = state.vehicle_journey_at_stops.map((vjas, i) => { - shiftedSchedule = { - departure_time: { - hour: vjas.departure_time.hour, - minute: String(parseInt(vjas.departure_time.minute) + parseInt(action.data.additional_time.value)) - }, - arrival_time: { - hour: vjas.arrival_time.hour, - minute: String(parseInt(vjas.arrival_time.minute) + parseInt(action.data.additional_time.value)) + if (!vjas.dummy){ + shiftedSchedule = { + departure_time: { + hour: vjas.departure_time.hour, + minute: actions.simplePad(parseInt(vjas.departure_time.minute) + parseInt(action.data.additional_time.value)) + }, + arrival_time: { + hour: vjas.arrival_time.hour, + minute: actions.simplePad(parseInt(vjas.arrival_time.minute) + parseInt(action.data.additional_time.value)) + } } + actions.checkSchedules(shiftedSchedule) + shiftedVjas = _.assign({}, state.vehicle_journey_at_stops[i], shiftedSchedule) + delete shiftedVjas['id'] + return _.assign({}, state.vehicle_journey_at_stops[i], shiftedVjas) + }else { + return vjas } - actions.checkSchedules(shiftedSchedule) - shiftedVjas = Object.assign({}, state.vehicle_journey_at_stops[i], shiftedSchedule) - return Object.assign({}, state.vehicle_journey_at_stops[i], shiftedVjas) }) - return Object.assign({}, state, {vehicle_journey_at_stops: shiftedArray}) + return _.assign({}, state, {vehicle_journey_at_stops: shiftedArray}) case 'UPDATE_TIME': let vj, vjas, vjasArray, newSchedule vjasArray = state.vehicle_journey_at_stops.map((vjas, i) =>{ if(i == action.subIndex){ newSchedule = { - departure_time: Object.assign({}, vjas.departure_time), - arrival_time: Object.assign({}, vjas.arrival_time) + departure_time: _.assign({}, vjas.departure_time), + arrival_time: _.assign({}, vjas.arrival_time) } if (action.isDeparture){ - newSchedule.departure_time[action.timeUnit] = actions.pad(action.val) + newSchedule.departure_time[action.timeUnit] = actions.pad(action.val, action.timeUnit) if(!action.isArrivalsToggled) - newSchedule.arrival_time[action.timeUnit] = actions.pad(action.val) + newSchedule.arrival_time[action.timeUnit] = actions.pad(action.val, action.timeUnit) newSchedule = actions.getDelta(newSchedule) - return Object.assign({}, state.vehicle_journey_at_stops[action.subIndex], {arrival_time: newSchedule.arrival_time, departure_time: newSchedule.departure_time, delta: newSchedule.delta}) + if(newSchedule.delta < 0){ + return vjas + } + return _.assign({}, state.vehicle_journey_at_stops[action.subIndex], {arrival_time: newSchedule.arrival_time, departure_time: newSchedule.departure_time, delta: newSchedule.delta}) }else{ - newSchedule.arrival_time[action.timeUnit] = actions.pad(action.val) + newSchedule.arrival_time[action.timeUnit] = actions.pad(action.val, action.timeUnit) newSchedule = actions.getDelta(newSchedule) - return Object.assign({}, state.vehicle_journey_at_stops[action.subIndex], {arrival_time: newSchedule.arrival_time, departure_time: newSchedule.departure_time, delta: newSchedule.delta}) + if(newSchedule.delta < 0){ + return vjas + } + return _.assign({}, state.vehicle_journey_at_stops[action.subIndex], {arrival_time: newSchedule.arrival_time, departure_time: newSchedule.departure_time, delta: newSchedule.delta}) } }else{ return vjas } }) - return Object.assign({}, state, {vehicle_journey_at_stops: vjasArray}) + return _.assign({}, state, {vehicle_journey_at_stops: vjasArray}) default: return state } @@ -115,7 +126,7 @@ const vehicleJourneys = (state = [], action) => { case 'EDIT_VEHICLEJOURNEY': return state.map((vj, i) => { if (vj.selected){ - return Object.assign({}, vj, { + return _.assign({}, vj, { company: action.selectedCompany, published_journey_name: action.data.published_journey_name.value, published_journey_identifier: action.data.published_journey_identifier.value, @@ -127,7 +138,7 @@ const vehicleJourneys = (state = [], action) => { case 'EDIT_VEHICLEJOURNEY_NOTES': return state.map((vj, i) => { if (vj.selected){ - return Object.assign({}, vj, { + return _.assign({}, vj, { footnotes: action.footnotes }) }else{ @@ -137,7 +148,7 @@ const vehicleJourneys = (state = [], action) => { case 'EDIT_VEHICLEJOURNEYS_CALENDARS': return state.map((vj,i) =>{ if(vj.selected){ - let updatedVJ = Object.assign({}, vj) + let updatedVJ = _.assign({}, vj) action.vehicleJourneys.map((vjm, j) =>{ if(vj.objectid == vjm.objectid){ updatedVJ.time_tables = vjm.time_tables @@ -160,11 +171,12 @@ const vehicleJourneys = (state = [], action) => { let dupeVj let dupes = [] let selectedIndex + let val = action.data.additional_time.value state.map((vj, i) => { if(vj.selected){ selectedIndex = i for (i = 0; i< action.data.duplicate_number.value; i++){ - action.data.additional_time.value *= (i + 1) + action.data.additional_time.value = val * (i + 1) dupeVj = vehicleJourney(vj, action) dupeVj.published_journey_name = dupeVj.published_journey_name + '-' + i dupeVj.selected = false @@ -179,7 +191,7 @@ const vehicleJourneys = (state = [], action) => { case 'DELETE_VEHICLEJOURNEYS': return state.map((vj, i) =>{ if (vj.selected){ - return Object.assign({}, vj, {deletable: true, selected: false}) + return _.assign({}, vj, {deletable: true, selected: false}) } else { return vj } diff --git a/app/assets/javascripts/forms.coffee b/app/assets/javascripts/forms.coffee index c8dd69581..9d884edcd 100644 --- a/app/assets/javascripts/forms.coffee +++ b/app/assets/javascripts/forms.coffee @@ -1,3 +1,7 @@ +# IE fix +isIE = false || !!document.documentMode +isEdge = !isIE && !!window.StyleMedia + @togglableFilter = -> $('.form-filter').on 'click', '.form-group.togglable', (e)-> if $(e.target).hasClass('togglable') || $(e.target).parent().hasClass('togglable') @@ -23,17 +27,15 @@ $('.formSubmitr').appendTo('.page-action') - # IE fix - isIE = false || !!document.documentMode - isEdge = !isIE && !!window.StyleMedia - if isIE || isEdge - $('.formSubmitr').each -> - target = $(this).attr('form') - - $(this).on 'click', -> - $('#' + target).submit() + $('.formSubmitr').off() $(document).on 'ready page:load', togglableFilter $(document).on 'ready page:load', submitMover $(document).on 'ready page:load', switchInput + +if isIE || isEdge + $(document).on 'click', '.formSubmitr', (e)-> + e.preventDefault() + target = $(this).attr('form') + $('#' + target).submit() diff --git a/app/assets/javascripts/main_menu.coffee b/app/assets/javascripts/main_menu.coffee index ed8ac655e..9357cff34 100644 --- a/app/assets/javascripts/main_menu.coffee +++ b/app/assets/javascripts/main_menu.coffee @@ -1,4 +1,11 @@ $(document).on 'ready page:load', -> + + link = [] + ptitleCont = "" + $(document).on 'page:before-change', -> + link = [] + ptitleCont = "" + $el = $('#main_nav') # Opening/closing left-side menu $el.find('.openMenu').on 'click', (e) -> @@ -12,32 +19,35 @@ $(document).on 'ready page:load', -> selectedItem.closest('.panel-collapse').addClass 'in' selectedItem.closest('.panel-title').children('a').attr('aria-expanded') == true + # Sticky content # Sticky behavior $(document).on 'scroll', -> limit = 51 - data = "" - $('.page-action').children().each -> - data += $(this)[0].outerHTML - - stickyContent = '<div class="sticky-content">' - stickyContent += '<div class="sticky-ptitle">' + $(".page-title").html() + '</div>' - stickyContent += '<div class="sticky-paction">' + data + '</div>' - stickyContent += '</div>' + if $(window).scrollTop() >= limit + if ($('.page-action .small').length > 0) + data = $('.page-action .small')[0].innerHTML - # console.log stickyContent + if ($(".page-title").length > 0) + ptitleCont = $(".page-title").html() - if $(window).scrollTop() >= limit + stickyContent = '<div class="sticky-content">' + stickyContent += '<div class="sticky-ptitle">' + ptitleCont + '</div>' + stickyContent += '<div class="sticky-paction"><div class="small">' + data + '</div></div>' + stickyContent += '</div>' $('#main_nav').addClass 'sticky' if $('#menu_top').find('.sticky-content').length == 0 - $('#menu_top').children('.menu-content').after(stickyContent) - # $('.sticky-paction .small').after($('.formSubmitr')) + if ptitleCont.length > 0 + $('#menu_top').children('.menu-content').after(stickyContent) + if link.length == 0 + link = $('.page-action .small').next() + $('.sticky-paction .small').after(link) else $('#main_nav').removeClass 'sticky' if $('#menu_top').find('.sticky-content').length > 0 - # $('.page-action .small').after($('.formSubmitr')) + $('.page-action .small').after(link) $('.sticky-content').remove() diff --git a/app/assets/javascripts/routes.coffee b/app/assets/javascripts/routes.coffee new file mode 100644 index 000000000..2e36061b8 --- /dev/null +++ b/app/assets/javascripts/routes.coffee @@ -0,0 +1,8 @@ +$(document).on("change", '#route_wayback', (e) -> + way = if $(this).is(':checked') then "backward" else "straight_forward" + $('.opposite_route').hide().find('select').prop('disabled', true) + + field = $(".opposite_route.#{way}") + if field.length + field.removeClass('hidden').show().find('select').prop('disabled', false) +) diff --git a/app/assets/javascripts/select2.coffee b/app/assets/javascripts/select2.coffee index edd4c476d..e20ef8d32 100644 --- a/app/assets/javascripts/select2.coffee +++ b/app/assets/javascripts/select2.coffee @@ -7,5 +7,13 @@ placeholder: target.data('select2ed-placeholder') allowClear: true + $('select.form-control.tags').each -> + target = $(this) + target.select2 + theme: 'bootstrap' + language: 'fr' + allowClear: true + tags: true + $(document).on 'ready page:load', select_2 |
