aboutsummaryrefslogtreecommitdiffstats
path: root/app/assets/javascripts
diff options
context:
space:
mode:
authorRobert2017-09-11 18:03:06 +0200
committerRobert2017-09-11 18:03:06 +0200
commit37865fad65adacae41bff0677651ca0a4d9db974 (patch)
tree0889ea9d7883bb27b493c16b9b08426fa22545a0 /app/assets/javascripts
parentf7bc874de79ff9a68aa03523cf653407663e7c55 (diff)
parent8fe9a39516f6fb71545d6329c448680d6f8c75d1 (diff)
downloadchouette-core-37865fad65adacae41bff0677651ca0a4d9db974.tar.bz2
merged with master
Diffstat (limited to 'app/assets/javascripts')
-rw-r--r--app/assets/javascripts/es6_browserified/journey_patterns/actions/index.js12
-rw-r--r--app/assets/javascripts/es6_browserified/journey_patterns/components/CreateModal.js2
-rw-r--r--app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPattern.js8
-rw-r--r--app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPatterns.js3
-rw-r--r--app/assets/javascripts/es6_browserified/journey_patterns/components/SaveJourneyPattern.js4
-rw-r--r--app/assets/javascripts/es6_browserified/journey_patterns/containers/AddJourneyPattern.js1
-rw-r--r--app/assets/javascripts/es6_browserified/journey_patterns/containers/JourneyPatternList.js1
-rw-r--r--app/assets/javascripts/es6_browserified/journey_patterns/containers/SaveJourneyPattern.js14
-rw-r--r--app/assets/javascripts/es6_browserified/journey_patterns/index.js3
-rw-r--r--app/assets/javascripts/es6_browserified/journey_patterns/reducers/editMode.js12
-rw-r--r--app/assets/javascripts/es6_browserified/journey_patterns/reducers/index.js2
-rw-r--r--app/assets/javascripts/es6_browserified/journey_patterns/reducers/status.js4
-rw-r--r--app/assets/javascripts/es6_browserified/time_tables/actions/index.js91
-rw-r--r--app/assets/javascripts/es6_browserified/time_tables/components/ErrorModal.js7
-rw-r--r--app/assets/javascripts/es6_browserified/time_tables/components/ExceptionsInDay.js4
-rw-r--r--app/assets/javascripts/es6_browserified/time_tables/components/PeriodForm.js3
-rw-r--r--app/assets/javascripts/es6_browserified/time_tables/components/SaveTimetable.js8
-rw-r--r--app/assets/javascripts/es6_browserified/time_tables/components/Timetable.js1
-rw-r--r--app/assets/javascripts/es6_browserified/time_tables/containers/ErrorModal.js1
-rw-r--r--app/assets/javascripts/es6_browserified/time_tables/containers/PeriodForm.js12
-rw-r--r--app/assets/javascripts/es6_browserified/time_tables/containers/SaveTimetable.js4
-rw-r--r--app/assets/javascripts/es6_browserified/time_tables/containers/Timetable.js8
-rw-r--r--app/assets/javascripts/es6_browserified/time_tables/index.js5
-rw-r--r--app/assets/javascripts/es6_browserified/time_tables/reducers/modal.js24
-rw-r--r--app/assets/javascripts/es6_browserified/time_tables/reducers/pagination.js2
-rw-r--r--app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js33
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js106
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/components/SaveVehicleJourneys.js10
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/components/Tools.js34
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js14
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourneys.js3
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/DuplicateVehicleJourney.js77
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/EditVehicleJourney.js5
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/ShiftVehicleJourney.js25
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/CompanySelect2.js3
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/TimetableSelect2.js7
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/containers/SaveVehicleJourneys.js14
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/containers/Tools.js4
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/containers/VehicleJourneysList.js1
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js4
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/EditVehicleJourney.js5
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/index.js3
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/editMode.js12
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/index.js2
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js3
-rw-r--r--app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js22
-rw-r--r--app/assets/javascripts/filters/calendar.js6
-rw-r--r--app/assets/javascripts/filters/import.js6
-rw-r--r--app/assets/javascripts/filters/time_table.js7
-rw-r--r--app/assets/javascripts/filters/workbench.js6
-rw-r--r--app/assets/javascripts/helpers/date_filters.js38
-rw-r--r--app/assets/javascripts/time_table.coffee14
-rw-r--r--app/assets/javascripts/workbench.coffee18
53 files changed, 460 insertions, 258 deletions
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 0ed961f44..34689070d 100644
--- a/app/assets/javascripts/es6_browserified/journey_patterns/actions/index.js
+++ b/app/assets/javascripts/es6_browserified/journey_patterns/actions/index.js
@@ -6,6 +6,12 @@ if (!window.Promise) {
}
const actions = {
+ enterEditMode: () => ({
+ type: "ENTER_EDIT_MODE"
+ }),
+ exitEditMode: () => ({
+ type: "EXIT_EDIT_MODE"
+ }),
receiveJourneyPatterns : (json) => ({
type: "RECEIVE_JOURNEY_PATTERNS",
json
@@ -84,10 +90,7 @@ const actions = {
resetValidation: (target) => {
$(target).parent().removeClass('has-error').children('.help-block').remove()
},
- humanOID : (oid) => {
- var a = oid.split(':')
- return a[a.length - 1]
- },
+ humanOID : (oid) => oid.split(':')[2],
validateFields : (fields) => {
const test = []
@@ -138,6 +141,7 @@ const actions = {
dispatch(actions.updateTotalCount(window.currentItemsLength - json.length))
}
window.currentItemsLength = json.length
+ dispatch(actions.exitEditMode())
dispatch(actions.receiveJourneyPatterns(json))
}
}
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 b446e2b37..12871431a 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 || this.props.status.policy['journey_patterns.update'] == false) {
+ if(this.props.status.isFetching == true || this.props.status.policy['journey_patterns.create'] == false || this.props.editMode == 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 286cfc454..377fd0612 100644
--- a/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPattern.js
+++ b/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPattern.js
@@ -34,7 +34,7 @@ class JourneyPattern extends Component{
type='checkbox'
id={sp.id}
checked={sp.checked}
- disabled={(this.props.value.deletable || this.props.status.policy['journey_patterns.update'] == false) ? 'disabled' : ''}
+ disabled={(this.props.value.deletable || this.props.status.policy['journey_patterns.update'] == false || this.props.editMode == false) ? 'disabled' : ''}
>
</input>
<span className='radio-label'></span>
@@ -78,7 +78,7 @@ class JourneyPattern extends Component{
<span className='fa fa-cog'></span>
</div>
<ul className='dropdown-menu'>
- <li className={(this.props.value.deletable || this.props.status.policy['journey_patterns.update'] == false) ? 'disabled' : ''}>
+ <li className={(this.props.status.policy['journey_patterns.update'] == false || this.props.editMode == false) ? 'disabled' : ''}>
<button
type='button'
onClick={this.props.onOpenEditModal}
@@ -91,10 +91,10 @@ class JourneyPattern extends Component{
<li className={this.props.value.object_id ? '' : 'disabled'}>
{this.vehicleJourneyURL(this.props.value.object_id)}
</li>
- <li className={'delete-action' + ((this.props.status.policy['journey_patterns.update'] == false)? ' disabled' : '')}>
+ <li className={'delete-action' + ((this.props.status.policy['journey_patterns.destroy'] == false || this.props.editMode == false) ? ' disabled' : '')}>
<button
type='button'
- disabled={(this.props.status.policy['journey_patterns.update'] == false)? 'disabled' : ''}
+ disabled={(this.props.status.policy['journey_patterns.destroy'] == false || this.props.editMode == false)? 'disabled' : ''}
onClick={(e) => {
e.preventDefault()
this.props.onDeleteJourneyPattern(this.props.index)}
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 23473ae52..6506b706c 100644
--- a/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPatterns.js
+++ b/app/assets/javascripts/es6_browserified/journey_patterns/components/JourneyPatterns.js
@@ -96,7 +96,7 @@ class JourneyPatterns extends Component{
<div className="alert alert-danger mt-sm">
<strong>Erreur : </strong>
{this.props.journeyPatterns.map((jp, index) =>
- jp.errors.map((err, i) => {
+ jp.errors && jp.errors.map((err, i) => {
return (
<ul key={i}>
<li>{err}</li>
@@ -133,6 +133,7 @@ class JourneyPatterns extends Component{
onOpenEditModal= {() => this.props.onOpenEditModal(index, journeyPattern)}
onDeleteJourneyPattern={() => this.props.onDeleteJourneyPattern(index)}
status= {this.props.status}
+ editMode= {this.props.editMode}
/>
)}
</div>
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 871ba00e1..767dab088 100644
--- a/app/assets/javascripts/es6_browserified/journey_patterns/components/SaveJourneyPattern.js
+++ b/app/assets/javascripts/es6_browserified/journey_patterns/components/SaveJourneyPattern.js
@@ -21,10 +21,10 @@ class SaveJourneyPattern extends Component{
type='button'
onClick={e => {
e.preventDefault()
- actions.submitJourneyPattern(this.props.dispatch, this.props.journeyPatterns)
+ this.props.editMode ? this.props.onSubmitJourneyPattern(this.props.dispatch, this.props.journeyPatterns) : this.props.onEnterEditMode()
}}
>
- Valider
+ {this.props.editMode ? "Valider" : "Editer"}
</button>
</form>
</div>
diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/containers/AddJourneyPattern.js b/app/assets/javascripts/es6_browserified/journey_patterns/containers/AddJourneyPattern.js
index ee13819fd..7aa27754e 100644
--- a/app/assets/javascripts/es6_browserified/journey_patterns/containers/AddJourneyPattern.js
+++ b/app/assets/javascripts/es6_browserified/journey_patterns/containers/AddJourneyPattern.js
@@ -6,6 +6,7 @@ const mapStateToProps = (state) => {
return {
modal: state.modal,
journeyPatterns: state.journeyPatterns,
+ editMode: state.editMode,
status: state.status
}
}
diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/containers/JourneyPatternList.js b/app/assets/javascripts/es6_browserified/journey_patterns/containers/JourneyPatternList.js
index bc2aaf95b..228df3ede 100644
--- a/app/assets/javascripts/es6_browserified/journey_patterns/containers/JourneyPatternList.js
+++ b/app/assets/javascripts/es6_browserified/journey_patterns/containers/JourneyPatternList.js
@@ -6,6 +6,7 @@ const mapStateToProps = (state) => {
return {
journeyPatterns: state.journeyPatterns,
status: state.status,
+ editMode: state.editMode,
stopPointsList: state.stopPointsList
}
}
diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/containers/SaveJourneyPattern.js b/app/assets/javascripts/es6_browserified/journey_patterns/containers/SaveJourneyPattern.js
index 33442c5a0..434264fea 100644
--- a/app/assets/javascripts/es6_browserified/journey_patterns/containers/SaveJourneyPattern.js
+++ b/app/assets/javascripts/es6_browserified/journey_patterns/containers/SaveJourneyPattern.js
@@ -6,11 +6,23 @@ var SaveJourneyPatternComponent = require('../components/SaveJourneyPattern')
const mapStateToProps = (state) => {
return {
journeyPatterns: state.journeyPatterns,
+ editMode: state.editMode,
page: state.pagination.page,
status: state.status
}
}
-const SaveJourneyPattern = connect(mapStateToProps)(SaveJourneyPatternComponent)
+const mapDispatchToProps = (dispatch) => {
+ return {
+ onEnterEditMode: () => {
+ dispatch(actions.enterEditMode())
+ },
+ onSubmitJourneyPattern: (next, state) => {
+ actions.submitJourneyPattern(dispatch, state, next)
+ }
+ }
+}
+
+const SaveJourneyPattern = connect(mapStateToProps, mapDispatchToProps)(SaveJourneyPatternComponent)
module.exports = SaveJourneyPattern
diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/index.js b/app/assets/javascripts/es6_browserified/journey_patterns/index.js
index b06957e0f..ca9efd2d0 100644
--- a/app/assets/javascripts/es6_browserified/journey_patterns/index.js
+++ b/app/assets/javascripts/es6_browserified/journey_patterns/index.js
@@ -12,6 +12,7 @@ var App = require('./components/App')
// var promise = require('redux-promise')
var initialState = {
+ editMode: false,
status: {
policy: window.perms,
fetchSuccess: true,
@@ -35,7 +36,7 @@ var initialState = {
let store = createStore(
journeyPatternsApp,
- initialState
+ initialState,
// applyMiddleware(thunkMiddleware, promise, loggerMiddleware)
)
diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/reducers/editMode.js b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/editMode.js
new file mode 100644
index 000000000..2e8af1aa8
--- /dev/null
+++ b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/editMode.js
@@ -0,0 +1,12 @@
+const editMode = (state = {}, action ) => {
+ switch (action.type) {
+ case "ENTER_EDIT_MODE":
+ return true
+ case "EXIT_EDIT_MODE":
+ return false
+ default:
+ return state
+ }
+}
+
+module.exports = editMode
diff --git a/app/assets/javascripts/es6_browserified/journey_patterns/reducers/index.js b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/index.js
index aa35adf0e..a9c28b83e 100644
--- a/app/assets/javascripts/es6_browserified/journey_patterns/reducers/index.js
+++ b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/index.js
@@ -1,4 +1,5 @@
var combineReducers = require('redux').combineReducers
+var editMode = require('./editMode')
var status = require('./status')
var journeyPatterns = require('./journeyPatterns')
var pagination = require('./pagination')
@@ -6,6 +7,7 @@ var modal = require('./modal')
var stopPointsList = require('./stopPointsList')
const journeyPatternsApp = combineReducers({
+ editMode,
status,
journeyPatterns,
pagination,
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 d7ef12d0b..07bbdc249 100644
--- a/app/assets/javascripts/es6_browserified/journey_patterns/reducers/status.js
+++ b/app/assets/javascripts/es6_browserified/journey_patterns/reducers/status.js
@@ -11,6 +11,10 @@ const status = (state = {}, action) => {
return _.assign({}, state, {fetchSuccess: true, isFetching: false})
case 'RECEIVE_ERRORS':
return _.assign({}, state, {isFetching: false})
+ case 'ENTER_EDIT_MODE':
+ return _.assign({}, state, {editMode: true})
+ case 'EXIT_EDIT_MODE':
+ return _.assign({}, state, {editMode: false})
default:
return state
}
diff --git a/app/assets/javascripts/es6_browserified/time_tables/actions/index.js b/app/assets/javascripts/es6_browserified/time_tables/actions/index.js
index 951664129..02ece1654 100644
--- a/app/assets/javascripts/es6_browserified/time_tables/actions/index.js
+++ b/app/assets/javascripts/es6_browserified/time_tables/actions/index.js
@@ -96,34 +96,42 @@ const actions = {
closePeriodForm: () => ({
type: 'CLOSE_PERIOD_FORM'
}),
+ resetModalErrors: () => ({
+ type: 'RESET_MODAL_ERRORS'
+ }),
updatePeriodForm: (val, group, selectType) => ({
type: 'UPDATE_PERIOD_FORM',
val,
group,
selectType
}),
- validatePeriodForm: (modalProps, timeTablePeriods, metas) => ({
+ validatePeriodForm: (modalProps, timeTablePeriods, metas, timetableInDates, error) => ({
type: 'VALIDATE_PERIOD_FORM',
modalProps,
timeTablePeriods,
- metas
+ metas,
+ timetableInDates,
+ error
}),
- includeDateInPeriod: (index, dayTypes) => ({
+ includeDateInPeriod: (index, dayTypes, date) => ({
type: 'INCLUDE_DATE_IN_PERIOD',
index,
- dayTypes
+ dayTypes,
+ date
}),
- excludeDateFromPeriod: (index, dayTypes) => ({
+ excludeDateFromPeriod: (index, dayTypes, date) => ({
type: 'EXCLUDE_DATE_FROM_PERIOD',
index,
- dayTypes
+ dayTypes,
+ date
}),
openConfirmModal : (callback) => ({
type : 'OPEN_CONFIRM_MODAL',
callback
}),
- showErrorModal: () => ({
- type: 'OPEN_ERROR_MODAL'
+ showErrorModal: (error) => ({
+ type: 'OPEN_ERROR_MODAL',
+ error
}),
closeModal : () => ({
type : 'CLOSE_MODAL'
@@ -161,16 +169,15 @@ const actions = {
// We compare periods & currentDate, to determine if it is included or not
let testDate = false
periods.map((p, i) => {
- if(p.deleted){
- return false
- }
+ if (p.deleted) return false
+
let begin = new Date(p.period_start)
let end = new Date(p.period_end)
if(testDate === false){
if(currentDate >= begin && currentDate <= end) {
testDate = true
- p.include_date = false
+ // p.include_date = false
}
}
})
@@ -187,11 +194,11 @@ const actions = {
})
return improvedCM
},
-
checkConfirmModal: (event, callback, stateChanged, dispatch, metas, timetable) => {
- if(stateChanged === true){
- if(timetable.time_table_periods.length == 0 && _.some(metas.day_types)){
- return actions.showErrorModal()
+ if(stateChanged){
+ const error = actions.errorModalKey(timetable.time_table_periods, metas.day_types)
+ if(error){
+ return actions.showErrorModal(error)
}else{
return actions.openConfirmModal(callback)
}
@@ -207,12 +214,29 @@ const actions = {
let error = ''
start = new Date(start)
end = new Date(end)
- _.each(periods, (period, i) => {
- if(index !== i && !period.deleted){
- if((new Date(period.period_start) <= start && new Date(period.period_end) >= start) || (new Date(period.period_start) <= end && new Date(period.period_end) >= end) || (start >= new Date(period.period_start) && end <= new Date(period.period_end)) || (start <= new Date(period.period_start) && end >= new Date(period.period_end)))
- error = 'Les périodes ne peuvent pas se chevaucher'
+
+ for (let i = 0; i < periods.length; i++) {
+ let period = periods[i]
+ if (index !== i && !period.deleted) {
+ if (new Date(period.period_start) <= end && new Date(period.period_end) >= start) {
+ error = 'Les périodes ne peuvent pas se chevaucher'
+ break
+ }
}
- })
+ }
+ return error
+ },
+ checkErrorsInDates: (start, end, in_days) => {
+ let error = ''
+ start = new Date(start)
+ end = new Date(end)
+
+ for (let day of in_days) {
+ if (start <= new Date(day.date) && end >= new Date(day.date)) {
+ error = 'Une période ne peut chevaucher une date dans un calendrier'
+ break
+ }
+ }
return error
},
fetchTimeTables: (dispatch, nextPage) => {
@@ -275,6 +299,31 @@ const actions = {
}
}
})
+ },
+ errorModalKey: (periods, dayTypes) => {
+ const withoutPeriodsWithDaysTypes = _.reject(periods, 'deleted').length == 0 && _.some(dayTypes) && "withoutPeriodsWithDaysTypes"
+ const withPeriodsWithoutDayTypes = _.reject(periods, 'deleted').length > 0 && _.every(dayTypes, dt => dt == false) && "withPeriodsWithoutDayTypes"
+
+ return (withoutPeriodsWithDaysTypes || withPeriodsWithoutDayTypes) && (withoutPeriodsWithDaysTypes ? "withoutPeriodsWithDaysTypes" : "withPeriodsWithoutDayTypes")
+
+ },
+ errorModalMessage: (errorKey) => {
+ switch (errorKey) {
+ case "withoutPeriodsWithDaysTypes":
+ return window.I18n.fr.time_tables.edit.error_modal.withoutPeriodsWithDaysTypes
+ case "withPeriodsWithoutDayTypes":
+ return window.I18n.fr.time_tables.edit.error_modal.withPeriodsWithoutDayTypes
+ default:
+ return errorKey
+
+ }
+ },
+ checkIfTTHasDate: (dates, date) => {
+ if (_.some(dates, date)) {
+ return _.reject(dates, ['date', date.date])
+ } else {
+ return dates.concat(date)
+ }
}
}
diff --git a/app/assets/javascripts/es6_browserified/time_tables/components/ErrorModal.js b/app/assets/javascripts/es6_browserified/time_tables/components/ErrorModal.js
index 31ed256ea..4e8f7e363 100644
--- a/app/assets/javascripts/es6_browserified/time_tables/components/ErrorModal.js
+++ b/app/assets/javascripts/es6_browserified/time_tables/components/ErrorModal.js
@@ -1,18 +1,19 @@
var React = require('react')
var Component = require('react').Component
var PropTypes = require('react').PropTypes
+var errorModalMessage = require('../actions').errorModalMessage
-const ErrorModal = ({dispatch, modal, onModalClose}) => (
+const ErrorModal = ({dispatch, modal, I18n, onModalClose}) => (
<div className={ 'modal fade ' + ((modal.type == 'error') ? 'in' : '') } id='ErrorModal'>
<div className='modal-container'>
<div className='modal-dialog'>
<div className='modal-content'>
<div className='modal-header'>
- <h4 className='modal-title'>Erreur</h4>
+ <h4 className='modal-title'>{window.I18n.fr.time_tables.edit.error_modal.title}</h4>
</div>
<div className='modal-body'>
<div className='mt-md mb-md'>
- <p>Un calendrier d'application ne peut pas avoir de journée(s) d'application sans période(s).</p>
+ <p>{errorModalMessage(modal.modalProps.error)}</p>
</div>
</div>
<div className='modal-footer'>
diff --git a/app/assets/javascripts/es6_browserified/time_tables/components/ExceptionsInDay.js b/app/assets/javascripts/es6_browserified/time_tables/components/ExceptionsInDay.js
index 10b558373..4879e537f 100644
--- a/app/assets/javascripts/es6_browserified/time_tables/components/ExceptionsInDay.js
+++ b/app/assets/javascripts/es6_browserified/time_tables/components/ExceptionsInDay.js
@@ -20,7 +20,7 @@ class ExceptionsInDay extends Component {
data-actiontype='remove'
onClick={(e) => {
$(e.currentTarget).toggleClass('active')
- this.props.onExcludeDateFromPeriod(this.props.index, this.props.metas.day_types)
+ this.props.onExcludeDateFromPeriod(this.props.index, this.props.metas.day_types, this.props.currentDate)
}}
>
<span className='fa fa-times'></span>
@@ -36,7 +36,7 @@ class ExceptionsInDay extends Component {
data-actiontype='add'
onClick={(e) => {
$(e.currentTarget).toggleClass('active')
- this.props.onIncludeDateInPeriod(this.props.index, this.props.metas.day_types)
+ this.props.onIncludeDateInPeriod(this.props.index, this.props.metas.day_types, this.props.currentDate)
}}
>
<span className='fa fa-plus'></span>
diff --git a/app/assets/javascripts/es6_browserified/time_tables/components/PeriodForm.js b/app/assets/javascripts/es6_browserified/time_tables/components/PeriodForm.js
index 028974fc8..3234a3fd7 100644
--- a/app/assets/javascripts/es6_browserified/time_tables/components/PeriodForm.js
+++ b/app/assets/javascripts/es6_browserified/time_tables/components/PeriodForm.js
@@ -1,5 +1,6 @@
var React = require('react')
var PropTypes = require('react').PropTypes
+var _ = require('lodash')
let monthsArray = ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre']
const formatNumber = (val) => {
@@ -107,7 +108,7 @@ const PeriodForm = ({modal, timetable, metas, onOpenAddPeriodForm, onClosePeriod
<button
type='button'
className='btn btn-outline-primary mr-sm'
- onClick={() => onValidatePeriodForm(modal.modalProps, timetable.time_table_periods, metas)}
+ onClick={() => onValidatePeriodForm(modal.modalProps, timetable.time_table_periods, metas, _.filter(timetable.time_table_dates, ['in_out', true]))}
>
Valider
</button>
diff --git a/app/assets/javascripts/es6_browserified/time_tables/components/SaveTimetable.js b/app/assets/javascripts/es6_browserified/time_tables/components/SaveTimetable.js
index e8c0aa3ba..779fd8e25 100644
--- a/app/assets/javascripts/es6_browserified/time_tables/components/SaveTimetable.js
+++ b/app/assets/javascripts/es6_browserified/time_tables/components/SaveTimetable.js
@@ -10,6 +10,8 @@ class SaveTimetable extends Component{
}
render() {
+ const error = actions.errorModalKey(this.props.timetable.time_table_periods, this.props.metas.day_types)
+
return (
<div className='row mt-md'>
<div className='col-lg-12 text-right'>
@@ -19,9 +21,9 @@ class SaveTimetable extends Component{
type='button'
onClick={e => {
e.preventDefault()
- if(this.props.timetable.time_table_periods.length == 0 && _.some(this.props.metas.day_types)){
- this.props.onShowErrorModal()
- }else{
+ if (error) {
+ this.props.onShowErrorModal(error)
+ } else {
actions.submitTimetable(this.props.getDispatch(), this.props.timetable, this.props.metas)
}
}}
diff --git a/app/assets/javascripts/es6_browserified/time_tables/components/Timetable.js b/app/assets/javascripts/es6_browserified/time_tables/components/Timetable.js
index d562655b9..3af1a11a4 100644
--- a/app/assets/javascripts/es6_browserified/time_tables/components/Timetable.js
+++ b/app/assets/javascripts/es6_browserified/time_tables/components/Timetable.js
@@ -79,6 +79,7 @@ class Timetable extends Component{
<ExceptionsInDay
index={i}
value={this.props.timetable}
+ currentDate={d.date}
metas={this.props.metas}
blueDaytype={this.props.metas.day_types[d.wday]}
onExcludeDateFromPeriod={this.props.onExcludeDateFromPeriod}
diff --git a/app/assets/javascripts/es6_browserified/time_tables/containers/ErrorModal.js b/app/assets/javascripts/es6_browserified/time_tables/containers/ErrorModal.js
index 16a7d45dd..e0b2c1240 100644
--- a/app/assets/javascripts/es6_browserified/time_tables/containers/ErrorModal.js
+++ b/app/assets/javascripts/es6_browserified/time_tables/containers/ErrorModal.js
@@ -12,6 +12,7 @@ const mapDispatchToProps = (dispatch) => {
return {
onModalClose: () =>{
dispatch(actions.closeModal())
+ dispatch(actions.resetModalErrors())
}
}
}
diff --git a/app/assets/javascripts/es6_browserified/time_tables/containers/PeriodForm.js b/app/assets/javascripts/es6_browserified/time_tables/containers/PeriodForm.js
index 7f2db785a..951a09741 100644
--- a/app/assets/javascripts/es6_browserified/time_tables/containers/PeriodForm.js
+++ b/app/assets/javascripts/es6_browserified/time_tables/containers/PeriodForm.js
@@ -7,7 +7,7 @@ const mapStateToProps = (state) => {
return {
modal: state.modal,
timetable: state.timetable,
- metas: state.metas
+ metas: state.metas,
}
}
@@ -27,8 +27,14 @@ const mapDispatchToProps = (dispatch) => {
val = (val < 10) ? '0' + String(val) : String(val)
dispatch(actions.updatePeriodForm(val, group, 'day'))
},
- onValidatePeriodForm: (modalProps, timeTablePeriods, metas) => {
- dispatch(actions.validatePeriodForm(modalProps, timeTablePeriods, metas))
+ onValidatePeriodForm: (modalProps, timeTablePeriods, metas, timetableInDates) => {
+ let period_start = actions.formatDate(modalProps.begin)
+ let period_end = actions.formatDate(modalProps.end)
+ let error = ''
+ if (new Date(period_end) <= new Date(period_start)) error = 'La date de départ doit être antérieure à la date de fin'
+ if (error == '') error = actions.checkErrorsInPeriods(period_start, period_end, modalProps.index, timeTablePeriods)
+ if (error == '') error = actions.checkErrorsInDates(period_start, period_end, timetableInDates)
+ dispatch(actions.validatePeriodForm(modalProps, timeTablePeriods, metas, timetableInDates, error))
}
}
}
diff --git a/app/assets/javascripts/es6_browserified/time_tables/containers/SaveTimetable.js b/app/assets/javascripts/es6_browserified/time_tables/containers/SaveTimetable.js
index b5539e7d8..6287da15b 100644
--- a/app/assets/javascripts/es6_browserified/time_tables/containers/SaveTimetable.js
+++ b/app/assets/javascripts/es6_browserified/time_tables/containers/SaveTimetable.js
@@ -13,8 +13,8 @@ const mapStateToProps = (state) => {
const mapDispatchToProps = (dispatch) => {
return {
- onShowErrorModal: () => {
- dispatch(actions.showErrorModal())
+ onShowErrorModal: (errorKey) => {
+ dispatch(actions.showErrorModal(errorKey))
},
getDispatch: () => {
return dispatch
diff --git a/app/assets/javascripts/es6_browserified/time_tables/containers/Timetable.js b/app/assets/javascripts/es6_browserified/time_tables/containers/Timetable.js
index c6b5fcc6b..639a1e2ab 100644
--- a/app/assets/javascripts/es6_browserified/time_tables/containers/Timetable.js
+++ b/app/assets/javascripts/es6_browserified/time_tables/containers/Timetable.js
@@ -15,11 +15,11 @@ const mapDispatchToProps = (dispatch) => {
onDeletePeriod: (index, dayTypes) =>{
dispatch(actions.deletePeriod(index, dayTypes))
},
- onExcludeDateFromPeriod: (index, dayTypes) => {
- dispatch(actions.excludeDateFromPeriod(index, dayTypes))
+ onExcludeDateFromPeriod: (index, dayTypes, date) => {
+ dispatch(actions.excludeDateFromPeriod(index, dayTypes, date))
},
- onIncludeDateInPeriod: (index, dayTypes) => {
- dispatch(actions.includeDateInPeriod(index, dayTypes))
+ onIncludeDateInPeriod: (index, dayTypes, date) => {
+ dispatch(actions.includeDateInPeriod(index, dayTypes, date))
},
onOpenEditPeriodForm: (period, index) => {
dispatch(actions.openEditPeriodForm(period, index))
diff --git a/app/assets/javascripts/es6_browserified/time_tables/index.js b/app/assets/javascripts/es6_browserified/time_tables/index.js
index 01f8c428e..a91747991 100644
--- a/app/assets/javascripts/es6_browserified/time_tables/index.js
+++ b/app/assets/javascripts/es6_browserified/time_tables/index.js
@@ -22,7 +22,8 @@ var initialState = {
current_month: [],
current_periode_range: '',
periode_range: [],
- time_table_periods: []
+ time_table_periods: [],
+ time_table_dates: []
},
metas: {
comment: '',
@@ -61,7 +62,7 @@ var initialState = {
let store = createStore(
timeTablesApp,
- initialState
+ initialState,
// applyMiddleware(thunkMiddleware, promise, loggerMiddleware)
)
diff --git a/app/assets/javascripts/es6_browserified/time_tables/reducers/modal.js b/app/assets/javascripts/es6_browserified/time_tables/reducers/modal.js
index 69f7b206e..c61296f1c 100644
--- a/app/assets/javascripts/es6_browserified/time_tables/reducers/modal.js
+++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/modal.js
@@ -21,9 +21,13 @@ const modal = (state = {}, action) => {
})
case 'OPEN_ERROR_MODAL':
$('#ErrorModal').modal('show')
- return _.assign({}, state, {type: 'error'})
+ newModalProps = _.assign({}, state.modalProps, {error: action.error})
+ return _.assign({}, state, {type: 'error'}, {modalProps: newModalProps})
+ case 'RESET_MODAL_ERRORS':
+ newModalProps = _.assign({}, state.modalProps, {error: ''})
+ return _.assign({}, state, {type: ''}, {modalProps: newModalProps})
case 'CLOSE_PERIOD_FORM':
- newModalProps = _.assign({}, state.modalProps, {active: false})
+ newModalProps = _.assign({}, state.modalProps, {active: false, error: ""})
return _.assign({}, state, {modalProps: newModalProps})
case 'OPEN_EDIT_PERIOD_FORM':
period_start = action.period.period_start.split('-')
@@ -50,19 +54,9 @@ const modal = (state = {}, action) => {
newModalProps[action.group][action.selectType] = action.val
return _.assign({}, state, {modalProps: newModalProps})
case 'VALIDATE_PERIOD_FORM':
- period_start = actions.formatDate(action.modalProps.begin)
- period_end = actions.formatDate(action.modalProps.end)
- newModalProps = _.assign({}, state.modalProps)
-
- if(new Date(period_end) <= new Date(period_start)){
- newModalProps.error = 'La date de départ doit être antérieure à la date de fin'
- return _.assign({}, state, {modalProps: newModalProps})
- }
-
- let newPeriods = JSON.parse(JSON.stringify(action.timeTablePeriods))
- let error = actions.checkErrorsInPeriods(period_start, period_end, action.modalProps.index, newPeriods)
- newModalProps.error = error
- newModalProps.active = (error == '') ? false : true
+ newModalProps = JSON.parse(JSON.stringify(state.modalProps))
+ newModalProps.error = action.error
+ newModalProps.active = (newModalProps.error == '') ? false : true
return _.assign({}, state, {modalProps: newModalProps})
default:
return state
diff --git a/app/assets/javascripts/es6_browserified/time_tables/reducers/pagination.js b/app/assets/javascripts/es6_browserified/time_tables/reducers/pagination.js
index 3d96fb7b7..45fec6b5f 100644
--- a/app/assets/javascripts/es6_browserified/time_tables/reducers/pagination.js
+++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/pagination.js
@@ -26,6 +26,8 @@ const pagination = (state = {}, action) => {
case 'VALIDATE_PERIOD_FORM':
case 'UPDATE_COMMENT':
case 'UPDATE_COLOR':
+ case 'UPDATE_DAY_TYPES':
+ case 'UPDATE_CURRENT_MONTH_FROM_DAYTYPES':
toggleOnConfirmModal('modal')
return _.assign({}, state, {stateChanged: true})
default:
diff --git a/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js b/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js
index 65cd9231a..390bdffb0 100644
--- a/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js
+++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js
@@ -1,6 +1,7 @@
const _ = require('lodash')
var actions = require('../actions')
let newState = {}
+let newDates = []
const timetable = (state = {}, action) => {
switch (action.type) {
@@ -9,7 +10,8 @@ const timetable = (state = {}, action) => {
current_month: action.json.current_month,
current_periode_range: action.json.current_periode_range,
periode_range: action.json.periode_range,
- time_table_periods: action.json.time_table_periods
+ time_table_periods: action.json.time_table_periods,
+ time_table_dates: action.json.time_table_dates
})
return _.assign({}, fetchedState, {current_month: actions.updateSynthesis(fetchedState, actions.strToArrayDayTypes(action.json.day_types))})
case 'RECEIVE_MONTH':
@@ -38,36 +40,46 @@ const timetable = (state = {}, action) => {
newState = _.assign({}, state, {time_table_periods : ttperiods})
return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.dayTypes)})
case 'INCLUDE_DATE_IN_PERIOD':
+ newDates = actions.checkIfTTHasDate(state.time_table_dates, {date: action.date, in_out: true})
let newCMi = state.current_month.map((d, i) => {
if(i == action.index){
d.include_date = !d.include_date
}
return d
})
- newState = _.assign({}, state, {current_month: newCMi})
+ newState = _.assign({}, state, {current_month: newCMi, time_table_dates: newDates})
return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.dayTypes)})
case 'EXCLUDE_DATE_FROM_PERIOD':
+ newDates = actions.checkIfTTHasDate(state.time_table_dates, {date: action.date, in_out: false})
let newCMe = state.current_month.map((d, i) => {
if(i == action.index){
d.excluded_date = !d.excluded_date
}
return d
})
- newState = _.assign({}, state, {current_month: newCMe})
+ newState = _.assign({}, state, {current_month: newCMe, time_table_dates: newDates})
return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.dayTypes)})
+ case 'UPDATE_DAY_TYPES':
+ // We get the week days of the activated day types to reject the out_dates that that are out of newDayTypes
+ let weekDays = _.reduce(action.dayTypes, (array, dt, i) => {
+ if (dt) array.push(i)
+ return array
+ }, [])
+
+ newDates = _.reject(state.time_table_dates, (d) => {
+ return d.in_out == false && !weekDays.includes(new Date(d.date).getDay())
+ })
+ return _.assign({}, state, {time_table_dates: newDates})
case 'UPDATE_CURRENT_MONTH_FROM_DAYTYPES':
return _.assign({}, state, {current_month: actions.updateSynthesis(state, action.dayTypes)})
case 'VALIDATE_PERIOD_FORM':
+ if (action.error != '') return state
+
let period_start = actions.formatDate(action.modalProps.begin)
let period_end = actions.formatDate(action.modalProps.end)
- if(new Date(period_end) <= new Date(period_start)){
- return state
- }
+
let newPeriods = JSON.parse(JSON.stringify(action.timeTablePeriods))
- let error = actions.checkErrorsInPeriods(period_start, period_end, action.modalProps.index, newPeriods)
- if(error != ''){
- return state
- }
+
if (action.modalProps.index !== false){
newPeriods[action.modalProps.index].period_start = period_start
newPeriods[action.modalProps.index].period_end = period_end
@@ -80,7 +92,6 @@ const timetable = (state = {}, action) => {
}
newState =_.assign({}, state, {time_table_periods: newPeriods})
return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.metas.day_types)})
-
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 c30f460d8..de87c14af 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js
@@ -7,6 +7,12 @@ if (!window.Promise) {
var batchActions = require('../batch').batchActions
const actions = {
+ enterEditMode: () => ({
+ type: "ENTER_EDIT_MODE"
+ }),
+ exitEditMode: () => ({
+ type: "EXIT_EDIT_MODE"
+ }),
receiveVehicleJourneys : (json) => ({
type: "RECEIVE_VEHICLE_JOURNEYS",
json
@@ -121,6 +127,9 @@ const actions = {
objectid: selectedCompany.objectid
}
}),
+ unselect2Company: () => ({
+ type: 'UNSELECT_CP_EDIT_MODAL',
+ }),
editVehicleJourney : (data, selectedCompany) => ({
type: 'EDIT_VEHICLEJOURNEY',
data,
@@ -130,13 +139,14 @@ const actions = {
type: 'EDIT_VEHICLEJOURNEY_NOTES',
footnotes
}),
- shiftVehicleJourney : (data) => ({
+ shiftVehicleJourney : (addtionalTime) => ({
type: 'SHIFT_VEHICLEJOURNEY',
- data
+ addtionalTime
}),
- duplicateVehicleJourney : (data, departureDelta) => ({
+ duplicateVehicleJourney : (addtionalTime, duplicateNumber, departureDelta) => ({
type: 'DUPLICATE_VEHICLEJOURNEY',
- data,
+ addtionalTime,
+ duplicateNumber,
departureDelta
}),
deleteVehicleJourneys : () => ({
@@ -259,10 +269,7 @@ const actions = {
type: 'RECEIVE_TOTAL_COUNT',
total
}),
- humanOID : (oid) => {
- var a = oid.split(':')
- return a[a.length - 1]
- },
+ humanOID: (oid) => oid.split(':')[2],
fetchVehicleJourneys : (dispatch, currentPage, nextPage, queryString) => {
if(currentPage == undefined){
currentPage = 1
@@ -371,6 +378,7 @@ const actions = {
dispatch(actions.updateTotalCount(window.currentItemsLength - json.length))
}
window.currentItemsLength = json.length
+ dispatch(actions.exitEditMode())
dispatch(actions.receiveVehicleJourneys(json))
}
}
@@ -384,7 +392,7 @@ const actions = {
},
simplePad: (d) => {
if(d.toString().length == 1){
- return (d < 10) ? '0' + d.toString() : d.toString();
+ return '0' + d.toString()
}else{
return d.toString()
}
@@ -418,8 +426,8 @@ const actions = {
return vjas
},
getDuplicateDelta: (original, newDeparture) => {
- if (original.departure_time.hour != '' && original.departure_time.minute != '' && newDeparture.departure_time.hour != '' && newDeparture.departure_time.minute != ''){
- return (parseInt(newDeparture.departure_time.hour) - parseInt(original.departure_time.hour)) * 60 + (parseInt(newDeparture.departure_time.minute) - parseInt(original.departure_time.minute))
+ if (original.departure_time.hour != '' && original.departure_time.minute != '' && newDeparture.departure_time.hour != undefined && newDeparture.departure_time.minute != undefined){
+ return (newDeparture.departure_time.hour - parseInt(original.departure_time.hour)) * 60 + (newDeparture.departure_time.minute - parseInt(original.departure_time.minute))
}
return 0
},
@@ -431,69 +439,25 @@ const actions = {
vjas.delta = delta
return vjas
},
- checkSchedules: (schedule) => {
- let hours = 0
- let minutes = 0
- if (parseInt(schedule.departure_time.minute) > 59){
- 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){
- 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
- if(minutes == 60){
- minutes = 0
- }
- 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
- if(minutes == 60){
- minutes = 0
- }
- schedule.arrival_time.minute = actions.simplePad(minutes, 'minute')
- schedule.arrival_time.hour = parseInt(schedule.arrival_time.hour) + hours
- }
+ getShiftedSchedule: ({departure_time, arrival_time}, additional_time) => {
+ // We create dummy dates objects to manipulate time more easily
+ let departureDT = new Date (Date.UTC(2017, 2, 1, parseInt(departure_time.hour), parseInt(departure_time.minute)))
+ let arrivalDT = new Date (Date.UTC(2017, 2, 1, parseInt(arrival_time.hour), parseInt(arrival_time.minute)))
- if(parseInt(schedule.departure_time.hour) > 23){
- schedule.departure_time.hour = '23'
- schedule.departure_time.minute = '59'
- }
- if(parseInt(schedule.arrival_time.hour) > 23){
- schedule.arrival_time.hour = '23'
- schedule.arrival_time.minute = '59'
- }
+ let newDepartureDT = new Date (departureDT.getTime() + additional_time * 60000)
+ let newArrivalDT = new Date (arrivalDT.getTime() + additional_time * 60000)
- if(parseInt(schedule.departure_time.hour) < 0){
- schedule.departure_time.hour = '00'
- schedule.departure_time.minute = '00'
- }
- if(parseInt(schedule.arrival_time.hour) < 0){
- schedule.arrival_time.hour = '00'
- schedule.arrival_time.minute = '00'
+ return {
+ departure_time: {
+ hour: actions.simplePad(newDepartureDT.getUTCHours()),
+ minute: actions.simplePad(newDepartureDT.getUTCMinutes())
+ },
+ arrival_time: {
+ hour: actions.simplePad(newArrivalDT.getUTCHours()),
+ minute: actions.simplePad(newArrivalDT.getUTCMinutes())
+ }
}
-
- 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')
- }
+ },
}
module.exports = actions
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 05dda976d..3c45e5758 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/SaveVehicleJourneys.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/SaveVehicleJourneys.js
@@ -9,7 +9,7 @@ class SaveVehicleJourneys extends Component{
}
render() {
- if(this.props.filters.policy['vehicle_journeys.update'] == false) {
+ if (this.props.filters.policy['vehicle_journeys.update'] == false) {
return false
}else{
return (
@@ -21,10 +21,10 @@ class SaveVehicleJourneys extends Component{
type='button'
onClick={e => {
e.preventDefault()
- actions.submitVehicleJourneys(this.props.dispatch, this.props.vehicleJourneys)
+ this.props.editMode ? this.props.onSubmitVehicleJourneys(this.props.dispatch, this.props.vehicleJourneys) : this.props.onEnterEditMode()
}}
>
- Valider
+ {this.props.editMode ? "Valider" : "Editer"}
</button>
</form>
</div>
@@ -38,7 +38,9 @@ SaveVehicleJourneys.propTypes = {
vehicleJourneys: PropTypes.array.isRequired,
page: PropTypes.number.isRequired,
status: PropTypes.object.isRequired,
- filters: PropTypes.object.isRequired
+ filters: PropTypes.object.isRequired,
+ onEnterEditMode: PropTypes.func.isRequired,
+ onSubmitVehicleJourneys: PropTypes.func.isRequired
}
module.exports = SaveVehicleJourneys
diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Tools.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Tools.js
index b417828db..4948e6b1a 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Tools.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Tools.js
@@ -9,28 +9,34 @@ var NotesEditVehicleJourney = require('../containers/tools/NotesEditVehicleJourn
var TimetablesEditVehicleJourney = require('../containers/tools/TimetablesEditVehicleJourney')
var actions = require('../actions')
-const Tools = ({vehicleJourneys, onCancelSelection}) => {
+const Tools = ({vehicleJourneys, onCancelSelection, filters: {policy}, editMode}) => {
return (
- <div className='select_toolbox'>
- <ul>
- <AddVehicleJourney />
- <DuplicateVehicleJourney />
- <ShiftVehicleJourney />
- <EditVehicleJourney />
- <TimetablesEditVehicleJourney />
- <NotesEditVehicleJourney />
- <DeleteVehicleJourneys />
- </ul>
+ <div>
+ {
+ (policy['vehicle_journeys.create'] && policy['vehicle_journeys.update'] && policy['vehicle_journeys.destroy'] && editMode) &&
+ <div className='select_toolbox'>
+ <ul>
+ <AddVehicleJourney />
+ <DuplicateVehicleJourney />
+ <ShiftVehicleJourney />
+ <EditVehicleJourney />
+ <TimetablesEditVehicleJourney />
+ <NotesEditVehicleJourney />
+ <DeleteVehicleJourneys />
+ </ul>
- <span className='info-msg'>{actions.getSelected(vehicleJourneys).length} course(s) sélectionnée(s)</span>
- <button className='btn btn-xs btn-link pull-right' onClick={onCancelSelection}>Annuler la sélection</button>
+ <span className='info-msg'>{actions.getSelected(vehicleJourneys).length} course(s) sélectionnée(s)</span>
+ <button className='btn btn-xs btn-link pull-right' onClick={onCancelSelection}>Annuler la sélection</button>
+ </div>
+ }
</div>
)
}
Tools.propTypes = {
vehicleJourneys : PropTypes.array.isRequired,
- onCancelSelection: PropTypes.func.isRequired
+ onCancelSelection: PropTypes.func.isRequired,
+ filters: PropTypes.object.isRequired
}
module.exports = Tools
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 f2bd0c3cd..ca6694f61 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js
@@ -58,7 +58,7 @@ class VehicleJourney extends Component {
)}
</div>
- {(this.props.filters.policy['vehicle_journeys.update'] == true) &&
+ {(this.props.filters.policy['vehicle_journeys.update'] == true && this.props.editMode) &&
<div className={(this.props.value.deletable ? 'disabled ' : '') + 'checkbox'}>
<input
id={this.props.index}
@@ -79,13 +79,13 @@ class VehicleJourney extends Component {
<div className={'cellwrap' + (this.cityNameChecker(vj) ? ' headlined' : '')}>
{this.props.filters.toggleArrivals &&
<div data-headline='Arrivée à'>
- <span className={((this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false) ? 'disabled ' : '') + 'input-group time'}>
+ <span className={((this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false || this.props.editMode == false) ? 'disabled ' : '') + 'input-group time'}>
<input
type='number'
min='00'
max='23'
className='form-control'
- disabled={(this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false)}
+ disabled={(this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false || this.props.editMode == false)}
onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'hour', false, false)}}
value={vj.arrival_time['hour']}
/>
@@ -95,7 +95,7 @@ class VehicleJourney extends Component {
min='00'
max='59'
className='form-control'
- disabled={((this.isDisabled(this.props.value.deletable), vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false)}
+ disabled={((this.isDisabled(this.props.value.deletable), vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false || this.props.editMode == false)}
onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'minute', false, false)}}
value={vj.arrival_time['minute']}
/>
@@ -108,13 +108,13 @@ class VehicleJourney extends Component {
}
</div>
<div data-headline='Départ à'>
- <span className={((this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false) ? 'disabled ' : '') + 'input-group time'}>
+ <span className={((this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false || this.props.editMode == false) ? 'disabled ' : '') + 'input-group time'}>
<input
type='number'
min='00'
max='23'
className='form-control'
- disabled={(this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false)}
+ disabled={(this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false || this.props.editMode == false)}
onChange={(e) => {this.props.onUpdateTime(e, i, this.props.index, 'hour', true, this.props.filters.toggleArrivals)}}
value={vj.departure_time['hour']}
/>
@@ -124,7 +124,7 @@ class VehicleJourney extends Component {
min='00'
max='59'
className='form-control'
- disabled={(this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false)}
+ disabled={(this.isDisabled(this.props.value.deletable, vj.dummy) || this.props.filters.policy['vehicle_journeys.update'] == false || this.props.editMode == 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/VehicleJourneys.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourneys.js
index e8673a25a..8f3f91b25 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourneys.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourneys.js
@@ -97,7 +97,7 @@ class VehicleJourneys extends Component{
<div className="alert alert-danger mt-sm">
<strong>Erreur : </strong>
{this.props.vehicleJourneys.map((vj, index) =>
- vj.errors.map((err, i) => {
+ vj.errors && vj.errors.map((err, i) => {
return (
<ul key={i}>
<li>{err}</li>
@@ -131,6 +131,7 @@ class VehicleJourneys extends Component{
value={vj}
key={index}
index={index}
+ editMode={this.props.editMode}
filters={this.props.filters}
onUpdateTime={this.props.onUpdateTime}
onSelectVehicleJourney={this.props.onSelectVehicleJourney}
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 34463600a..9446b993a 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
@@ -7,33 +7,64 @@ var _ = require('lodash')
class DuplicateVehicleJourney extends Component {
constructor(props) {
super(props)
+ this.state = {}
+ this.onFormChange = this.onFormChange.bind(this)
+ this.handleSubmit = this.handleSubmit.bind(this)
+ }
+
+ componentWillReceiveProps() {
+ if (actions.getSelected(this.props.vehicleJourneys).length > 0) {
+ let hour = parseInt(this.getDefaultValue('hour'))
+ let miunte = parseInt(this.getDefaultValue('minute'))
+ this.setState((state, props) => {
+ return {
+ originalDT: {
+ hour: hour,
+ minute: miunte
+ },
+ duplicate_time_hh: hour,
+ duplicate_time_mm: miunte,
+ additional_time: 0,
+ duplicate_number: 1
+ }
+ })
+ }
}
handleSubmit() {
if(actions.validateFields(this.refs) == true) {
let newDeparture = {
departure_time : {
- hour: this.refs.duplicate_time_hh.value,
- minute: this.refs.duplicate_time_mm.value
+ hour: this.state.duplicate_time_hh,
+ minute: this.state.duplicate_time_mm
}
}
let val = actions.getDuplicateDelta(_.find(actions.getSelected(this.props.vehicleJourneys)[0].vehicle_journey_at_stops, {'dummy': false}), newDeparture)
- this.refs.additional_time.value = parseInt(this.refs.additional_time.value)
- this.props.onDuplicateVehicleJourney(this.refs, val)
+ this.props.onDuplicateVehicleJourney(this.state.additional_time, this.state.duplicate_number, val)
this.props.onModalClose()
$('#DuplicateVehicleJourneyModal').modal('hide')
}
}
+ onFormChange(e) {
+ let {name, value} = e.target
+ this.setState((state, props) => {
+ return {
+ [name]: parseInt(value)
+ }
+ })
+ }
+
getDefaultValue(type) {
let vjas = _.find(actions.getSelected(this.props.vehicleJourneys)[0].vehicle_journey_at_stops, {'dummy': false})
return vjas.departure_time[type]
}
+
render() {
if(this.props.status.isFetching == true) {
return false
}
- if(this.props.status.fetchSuccess == true) {
+ if(this.props.status.fetchSuccess == true && actions.getSelected(this.props.vehicleJourneys).length > 0) {
return (
<li className='st_action'>
<button
@@ -65,22 +96,26 @@ class DuplicateVehicleJourney extends Component {
<span className={'input-group time' + (actions.getSelected(this.props.vehicleJourneys).length > 1 ? ' disabled' : '')}>
<input
type='number'
+ name='duplicate_time_hh'
ref='duplicate_time_hh'
min='00'
max='23'
className='form-control'
- defaultValue={this.getDefaultValue('hour')}
- disabled={(actions.getSelected(this.props.vehicleJourneys).length > 1 ? 'disabled' : '')}
+ value={this.state.duplicate_time_hh}
+ onChange={e => this.onFormChange(e)}
+ disabled={actions.getSelected(this.props.vehicleJourneys) && (actions.getSelected(this.props.vehicleJourneys).length > 1 ? 'disabled' : '')}
/>
<span>:</span>
<input
type='number'
+ name='duplicate_time_mm'
ref='duplicate_time_mm'
min='00'
max='59'
className='form-control'
- defaultValue={this.getDefaultValue('minute')}
- disabled={(actions.getSelected(this.props.vehicleJourneys).length > 1 ? 'disabled' : '')}
+ value={this.state.duplicate_time_mm}
+ onChange={e => this.onFormChange(e)}
+ disabled={actions.getSelected(this.props.vehicleJourneys) && (actions.getSelected(this.props.vehicleJourneys).length > 1 ? 'disabled' : '')}
/>
</span>
</span>
@@ -92,11 +127,13 @@ class DuplicateVehicleJourney extends Component {
<input
type='number'
style={{'width': 104}}
+ name='duplicate_number'
ref='duplicate_number'
min='1'
max='20'
- defaultValue='1'
+ value={this.state.duplicate_number}
className='form-control'
+ onChange={e => this.onFormChange(e)}
onKeyDown={(e) => actions.resetValidation(e.currentTarget)}
required
/>
@@ -105,19 +142,21 @@ class DuplicateVehicleJourney extends Component {
<div className='form-group'>
<label className='control-label is-required col-sm-8'>Décalage à partir duquel on créé les courses</label>
- <div className="col-sm-4">
+ <span className="col-sm-4">
<input
type='number'
style={{'width': 104}}
+ name='additional_time'
ref='additional_time'
- min='-59'
- max='59'
- defaultValue='0'
- className='form-control'
+ min='-720'
+ max='720'
+ value={this.state.additional_time}
+ className='form-control disabled'
+ onChange={e => this.onFormChange(e)}
onKeyDown={(e) => actions.resetValidation(e.currentTarget)}
required
- />
- </div>
+ />
+ </span>
</div>
</div>
@@ -131,9 +170,9 @@ class DuplicateVehicleJourney extends Component {
Annuler
</button>
<button
- className='btn btn-primary'
+ className={'btn btn-primary ' + (this.state.additional_time == 0 && this.state.originalDT.hour == this.state.duplicate_time_hh && this.state.originalDT.minute == this.state.duplicate_time_mm ? 'disabled' : '')}
type='button'
- onClick={this.handleSubmit.bind(this)}
+ onClick={this.handleSubmit}
>
Valider
</button>
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 d49ea578a..2ff4999c6 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
@@ -14,8 +14,10 @@ class EditVehicleJourney extends Component {
var company;
if(this.props.modal.modalProps.selectedCompany) {
company = this.props.modal.modalProps.selectedCompany
- } else {
+ } else if (typeof this.props.modal.modalProps.vehicleJourney.company === Object) {
company = this.props.modal.modalProps.vehicleJourney.company
+ } else {
+ company = undefined
}
this.props.onEditVehicleJourney(this.refs, company)
this.props.onModalClose()
@@ -96,6 +98,7 @@ class EditVehicleJourney extends Component {
<CompanySelect2
company = {this.props.modal.modalProps.vehicleJourney.company}
onSelect2Company = {(e) => this.props.onSelect2Company(e)}
+ onUnselect2Company = {() => this.props.onUnselect2Company()}
/>
</div>
</div>
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 269bb1b8c..dd0bade39 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
@@ -6,16 +6,27 @@ var actions = require('../../actions')
class ShiftVehicleJourney extends Component {
constructor(props) {
super(props)
+ this.state = {
+ additional_time: 0
+ }
}
handleSubmit() {
if(actions.validateFields(this.refs) == true) {
- this.props.onShiftVehicleJourney(this.refs)
+ this.props.onShiftVehicleJourney(this.state.additional_time)
this.props.onModalClose()
$('#ShiftVehicleJourneyModal').modal('hide')
}
}
+ handleAdditionalTimeChange() {
+ this.setState((state, props) => {
+ return {
+ additional_time: parseInt(this.refs.additional_time.value)
+ }
+ })
+ }
+
render() {
if(this.props.status.isFetching == true) {
return false
@@ -53,14 +64,16 @@ class ShiftVehicleJourney extends Component {
<label className='control-label is-required'>Avec un décalage de</label>
<input
type='number'
+ style={{'width': 104}}
ref='additional_time'
- min='-59'
- max='59'
+ min='-720'
+ max='720'
+ value={this.state.additional_time}
className='form-control'
- defaultValue='0'
+ onChange={this.handleAdditionalTimeChange.bind(this)}
onKeyDown={(e) => actions.resetValidation(e.currentTarget)}
required
- />
+ />
</div>
</div>
</div>
@@ -75,7 +88,7 @@ class ShiftVehicleJourney extends Component {
Annuler
</button>
<button
- className='btn btn-primary'
+ className={'btn btn-primary ' + (this.state.additional_time == 0 ? 'disabled' : '')}
type='button'
onClick={this.handleSubmit.bind(this)}
>
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 d277be003..c1ce0e92a 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
@@ -20,10 +20,11 @@ class BSelect4 extends React.Component{
data={(this.props.company) ? [this.props.company.name] : undefined}
value={(this.props.company) ? this.props.company.name : undefined}
onSelect={(e) => this.props.onSelect2Company(e) }
+ onUnselect={() => this.props.onUnselect2Company()}
multiple={false}
ref='company_id'
options={{
- allowClear: false,
+ allowClear: true,
theme: 'bootstrap',
width: '100%',
placeholder: 'Filtrer par transporteur...',
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 0183aac43..5157300ba 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
@@ -33,8 +33,13 @@ class BSelect4 extends React.Component{
dataType: 'json',
delay: '500',
data: function(params) {
+ let newParmas = params.term.split(" ")
return {
- q: {short_id_or_comment_cont: params.term},
+ q: {
+ objectid_cont_any: newParmas,
+ comment_cont_any: newParmas,
+ m: 'or'
+ }
};
},
processResults: function(data, params) {
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 87bbe5353..c1ce90d38 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/SaveVehicleJourneys.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/SaveVehicleJourneys.js
@@ -5,6 +5,7 @@ var SaveVehicleJourneysComponent = require('../components/SaveVehicleJourneys')
const mapStateToProps = (state) => {
return {
+ editMode: state.editMode,
vehicleJourneys: state.vehicleJourneys,
page: state.pagination.page,
status: state.status,
@@ -12,6 +13,17 @@ const mapStateToProps = (state) => {
}
}
-const SaveVehicleJourneys = connect(mapStateToProps)(SaveVehicleJourneysComponent)
+const mapDispatchToProps = (dispatch) => {
+ return {
+ onEnterEditMode: () => {
+ dispatch(actions.enterEditMode())
+ },
+ onSubmitVehicleJourneys: (next, state) => {
+ actions.submitVehicleJourneys(dispatch, state, next)
+ }
+ }
+}
+
+const SaveVehicleJourneys = connect(mapStateToProps, mapDispatchToProps)(SaveVehicleJourneysComponent)
module.exports = SaveVehicleJourneys
diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/Tools.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/Tools.js
index 35f492c98..a4b3056ac 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/Tools.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/Tools.js
@@ -4,7 +4,9 @@ var actions = require('../actions')
const mapStateToProps = (state) => {
return {
- vehicleJourneys: state.vehicleJourneys
+ vehicleJourneys: state.vehicleJourneys,
+ editMode: state.editMode,
+ filters: state.filters
}
}
diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/VehicleJourneysList.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/VehicleJourneysList.js
index 176a68500..f834e4457 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/VehicleJourneysList.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/VehicleJourneysList.js
@@ -4,6 +4,7 @@ var VehicleJourneys = require('../components/VehicleJourneys')
const mapStateToProps = (state) => {
return {
+ editMode: state.editMode,
vehicleJourneys: state.vehicleJourneys,
status: state.status,
filters: state.filters,
diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js
index 224b52a19..70e8fde4d 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/DuplicateVehicleJourney.js
@@ -19,8 +19,8 @@ const mapDispatchToProps = (dispatch) => {
onOpenDuplicateModal: () =>{
dispatch(actions.openDuplicateModal())
},
- onDuplicateVehicleJourney: (data, departureDelta) =>{
- dispatch(actions.duplicateVehicleJourney(data, departureDelta))
+ onDuplicateVehicleJourney: (addtionalTime, duplicateNumber, departureDelta) =>{
+ dispatch(actions.duplicateVehicleJourney(addtionalTime, duplicateNumber, departureDelta))
}
}
}
diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/EditVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/EditVehicleJourney.js
index 8f4d43519..ac9772b8a 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/EditVehicleJourney.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/EditVehicleJourney.js
@@ -24,7 +24,10 @@ const mapDispatchToProps = (dispatch) => {
},
onSelect2Company: (e) => {
dispatch(actions.select2Company(e.params.data))
- }
+ },
+ onUnselect2Company: () => {
+ dispatch(actions.unselect2Company())
+ },
}
}
diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/index.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/index.js
index 97aa60526..53bbcf952 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/index.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/index.js
@@ -19,6 +19,7 @@ if (window.journeyPatternId)
selectedJP.push(window.journeyPatternId)
var initialState = {
+ editMode: false,
filters: {
selectedJourneyPatterns : selectedJP,
policy: window.perms,
@@ -89,7 +90,7 @@ if (window.jpOrigin){
let store = createStore(
enableBatching(vehicleJourneysApp),
- initialState
+ initialState,
// applyMiddleware(thunkMiddleware, promise, loggerMiddleware)
)
diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/editMode.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/editMode.js
new file mode 100644
index 000000000..2e8af1aa8
--- /dev/null
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/editMode.js
@@ -0,0 +1,12 @@
+const editMode = (state = {}, action ) => {
+ switch (action.type) {
+ case "ENTER_EDIT_MODE":
+ return true
+ case "EXIT_EDIT_MODE":
+ return false
+ default:
+ return state
+ }
+}
+
+module.exports = editMode
diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/index.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/index.js
index bd4d7226b..4e0839102 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/index.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/index.js
@@ -4,6 +4,7 @@ var pagination = require('./pagination')
var modal = require('./modal')
var status = require('./status')
var filters = require('./filters')
+var editMode = require('./editMode')
var stopPointsList = require('./stopPointsList')
const vehicleJourneysApp = combineReducers({
@@ -12,6 +13,7 @@ const vehicleJourneysApp = combineReducers({
modal,
status,
filters,
+ editMode,
stopPointsList
})
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 229fd2058..1e5ff4294 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js
@@ -57,6 +57,9 @@ const modal = (state = {}, action) => {
case 'SELECT_CP_EDIT_MODAL':
newModalProps = _.assign({}, state.modalProps, {selectedCompany : action.selectedItem})
return _.assign({}, state, {modalProps: newModalProps})
+ case 'UNSELECT_CP_EDIT_MODAL':
+ newModalProps = _.assign({}, state.modalProps, {selectedCompany : undefined})
+ return _.assign({}, state, {modalProps: newModalProps})
case 'SELECT_TT_CALENDAR_MODAL':
newModalProps = _.assign({}, state.modalProps, {selectedTimetable : action.selectedItem})
return _.assign({}, state, {modalProps: newModalProps})
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 d463d4b8f..969b2ddd8 100644
--- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js
+++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js
@@ -51,17 +51,8 @@ const vehicleJourney= (state = {}, action, keep) => {
let shiftedArray, shiftedSchedule, shiftedVjas
shiftedArray = state.vehicle_journey_at_stops.map((vjas, i) => {
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)
+ shiftedSchedule = actions.getShiftedSchedule(vjas, action.addtionalTime)
+
shiftedVjas = _.assign({}, state.vehicle_journey_at_stops[i], shiftedSchedule)
vjas = _.assign({}, state.vehicle_journey_at_stops[i], shiftedVjas)
if(!keep){
@@ -181,13 +172,16 @@ const vehicleJourneys = (state = [], action) => {
let dupeVj
let dupes = []
let selectedIndex
- let val = action.data.additional_time.value
+ let val = action.addtionalTime
let departureDelta = action.departureDelta
state.map((vj, i) => {
if(vj.selected){
selectedIndex = i
- for (i = 0; i< action.data.duplicate_number.value; i++){
- action.data.additional_time.value = (parseInt(val) * (i + 1)) + departureDelta
+ for (i = 0; i< action.duplicateNumber; i++){
+ // We check if the departureDelta is != 0 to create the first VJ on the updated deparure time if it is the case
+ // let delta = departureDelta == 0 ? 1 : 0
+ // action.addtionalTime = (val * (i + delta)) + departureDelta
+ action.addtionalTime = (val * (i + 1)) + departureDelta
dupeVj = vehicleJourney(vj, action, false)
dupeVj.published_journey_name = dupeVj.published_journey_name + '-' + i
dupeVj.selected = false
diff --git a/app/assets/javascripts/filters/calendar.js b/app/assets/javascripts/filters/calendar.js
new file mode 100644
index 000000000..a4e84777c
--- /dev/null
+++ b/app/assets/javascripts/filters/calendar.js
@@ -0,0 +1,6 @@
+const DateFilter = require('../helpers/date_filters')
+
+$(document).ready(function(){
+ const calendarDF = new DateFilter("#calendar_filter_btn", "Tous les champs du filtre de date doivent être remplis", "#q_contains_date_NUMi")
+ calendarDF()
+})
diff --git a/app/assets/javascripts/filters/import.js b/app/assets/javascripts/filters/import.js
new file mode 100644
index 000000000..d0b96da10
--- /dev/null
+++ b/app/assets/javascripts/filters/import.js
@@ -0,0 +1,6 @@
+const DateFilter = require('../helpers/date_filters')
+
+$(document).ready(function(){
+ const importDF = new DateFilter("#import_filter_btn", "Tous les champs du filtre de date doivent être remplis", "#q_started_on_date_NUMi")
+ importDF()
+})
diff --git a/app/assets/javascripts/filters/time_table.js b/app/assets/javascripts/filters/time_table.js
new file mode 100644
index 000000000..9e24d03fe
--- /dev/null
+++ b/app/assets/javascripts/filters/time_table.js
@@ -0,0 +1,7 @@
+$(document).ready(function(){
+ const DateFilter = require('../helpers/date_filters')
+
+ const timetableDF = new DateFilter("#time_table_filter_btn", window.I18n.fr.time_tables.error_period_filter, "#q_start_date_gteq_NUMi", "#q_end_date_lteq_NUMi")
+
+ timetableDF()
+})
diff --git a/app/assets/javascripts/filters/workbench.js b/app/assets/javascripts/filters/workbench.js
new file mode 100644
index 000000000..af3e13c59
--- /dev/null
+++ b/app/assets/javascripts/filters/workbench.js
@@ -0,0 +1,6 @@
+const DateFilter = require('../helpers/date_filters')
+
+$(document).ready(function(){
+ const workbenchDF = new DateFilter("#referential_filter_btn", window.I18n.fr.referentials.error_period_filter, "#q_validity_period_begin_gteq_NUMi", "#q_validity_period_end_lteq_NUMi")
+ workbenchDF()
+})
diff --git a/app/assets/javascripts/helpers/date_filters.js b/app/assets/javascripts/helpers/date_filters.js
new file mode 100644
index 000000000..1f48bb28f
--- /dev/null
+++ b/app/assets/javascripts/helpers/date_filters.js
@@ -0,0 +1,38 @@
+const DateFilter = function(buttonId, message, ...inputIds) {
+ this.buttonId = buttonId
+ this.inputIds = inputIds
+ this.message = message
+
+ const getVal = (str, key) => {
+ let newStr = str.replace(/NUM/, key)
+ return $(newStr).val()
+ }
+
+ const getDates = () => {
+ return this.inputIds.reduce((arr, id) => {
+ let newIds = [1, 2, 3].map(key => getVal(id, key))
+ arr.push(...newIds)
+ return arr
+ },[])
+ }
+
+ const allInputFilled = () => {
+ return getDates().every(date => !!date)
+ }
+
+ const noInputFilled = () => {
+ return getDates().every(date => !date)
+ }
+
+ const execute = () => {
+ $(this.buttonId).on("click", (e) => {
+ if (allInputFilled() == false && noInputFilled() == false) {
+ e.preventDefault()
+ alert(this.message)
+ }
+ })
+ }
+ return execute
+}
+
+module.exports = DateFilter
diff --git a/app/assets/javascripts/time_table.coffee b/app/assets/javascripts/time_table.coffee
deleted file mode 100644
index 8789cb226..000000000
--- a/app/assets/javascripts/time_table.coffee
+++ /dev/null
@@ -1,14 +0,0 @@
- $(document).on("click", "#time_table_filter_btn", (e) ->
- dates = [1, 2, 3].reduce (arr, key) ->
- arr.push $("#q_start_date_gteq_#{key}i").val(), $("#q_end_date_lteq_#{key}i").val()
- arr
- , []
-
- validDate = dates.every (date) -> !!date
-
- noDate = dates.every (date) -> !date
-
- unless (validDate || noDate)
- e.preventDefault()
- alert(window.I18n.fr.time_tables.error_period_filter)
- )
diff --git a/app/assets/javascripts/workbench.coffee b/app/assets/javascripts/workbench.coffee
deleted file mode 100644
index 0e9fe62a3..000000000
--- a/app/assets/javascripts/workbench.coffee
+++ /dev/null
@@ -1,18 +0,0 @@
- $(document).on("click", "#referential_filter_btn", (e) ->
- dates = [1, 2, 3].reduce (arr, key) ->
- arr.push $("#q_validity_period_begin_gteq_#{key}i").val(), $("#q_validity_period_end_lteq_#{key}i").val()
- arr
- , []
-
- validDate = dates.every (date) -> !!date
-
- noDate = dates.every (date) -> !date
-
- console.log("valid dates :", validDate)
- console.log("no dates :", noDate)
- console.log(dates)
-
- unless (validDate || noDate)
- e.preventDefault()
- alert(window.I18n.fr.referentials.error_period_filter)
- )