diff options
| author | Xinhui | 2017-05-23 10:03:52 +0200 |
|---|---|---|
| committer | Xinhui | 2017-05-23 10:03:52 +0200 |
| commit | 4f5cc7d35777f3b4bfa1c63c1223c679f713424e (patch) | |
| tree | 8c3fa28f8f1f4b238248037dce4a6c5974a82e02 /app/assets/javascripts | |
| parent | af2c4b003ca0bf856a1f1d532865963b40f159ee (diff) | |
| parent | 5e3c2d8daba5617a72d0bfd06e0b6b3f03628f56 (diff) | |
| download | chouette-core-4f5cc7d35777f3b4bfa1c63c1223c679f713424e.tar.bz2 | |
Merge branch 'master' into staging
Diffstat (limited to 'app/assets/javascripts')
29 files changed, 376 insertions, 103 deletions
diff --git a/app/assets/javascripts/es6_browserified/itineraries/show.js b/app/assets/javascripts/es6_browserified/itineraries/show.js new file mode 100644 index 000000000..79a11701f --- /dev/null +++ b/app/assets/javascripts/es6_browserified/itineraries/show.js @@ -0,0 +1,99 @@ +route = JSON.parse(decodeURIComponent(route)) +const geoColPts = [] +const geoColLns= [] +const geoColEdges = [ + new ol.Feature({ + geometry: new ol.geom.Point(ol.proj.fromLonLat([parseFloat(route[0].longitude), parseFloat(route[0].latitude)])) + }), + new ol.Feature({ + geometry: new ol.geom.Point(ol.proj.fromLonLat([parseFloat(route[route.length - 1].longitude), parseFloat(route[route.length - 1].latitude)])) + }) +] +route.forEach(function(stop, i){ + if (i < route.length - 1){ + geoColLns.push(new ol.Feature({ + geometry: new ol.geom.LineString([ + ol.proj.fromLonLat([parseFloat(route[i].longitude), parseFloat(route[i].latitude)]), + ol.proj.fromLonLat([parseFloat(route[i+1].longitude), parseFloat(route[i+1].latitude)]) + ]) + })) + } + geoColPts.push(new ol.Feature({ + geometry: new ol.geom.Point(ol.proj.fromLonLat([parseFloat(stop.longitude), parseFloat(stop.latitude)])) + }) + ) +}) +var edgeStyles = new ol.style.Style({ + image: new ol.style.Circle(({ + radius: 5, + stroke: new ol.style.Stroke({ + color: '#007fbb', + width: 2 + }), + fill: new ol.style.Fill({ + color: '#007fbb', + width: 2 + }) + })) +}) +var defaultStyles = new ol.style.Style({ + image: new ol.style.Circle(({ + radius: 4, + stroke: new ol.style.Stroke({ + color: '#007fbb', + width: 2 + }), + fill: new ol.style.Fill({ + color: '#ffffff', + width: 2 + }) + })) +}) +var lineStyle = new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: '#007fbb', + width: 3 + }) +}) + +var vectorPtsLayer = new ol.layer.Vector({ + source: new ol.source.Vector({ + features: geoColPts + }), + style: defaultStyles, + zIndex: 2 +}) +var vectorEdgesLayer = new ol.layer.Vector({ + source: new ol.source.Vector({ + features: geoColEdges + }), + style: edgeStyles, + zIndex: 3 +}) +var vectorLnsLayer = new ol.layer.Vector({ + source: new ol.source.Vector({ + features: geoColLns + }), + style: [lineStyle], + zIndex: 1 +}) + +var map = new ol.Map({ + target: 'route_map', + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM() + }), + vectorPtsLayer, + vectorEdgesLayer, + vectorLnsLayer + ], + controls: [ new ol.control.ScaleLine(), new ol.control.Zoom(), new ol.control.ZoomSlider() ], + interactions: ol.interaction.defaults({ + zoom: true + }), + view: new ol.View({ + center: ol.proj.fromLonLat([parseFloat(route[0].longitude), parseFloat(route[0].latitude)]), + zoom: 13 + }) +}); 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 3f15b7f01..41d247b21 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/actions/index.js +++ b/app/assets/javascripts/es6_browserified/time_tables/actions/index.js @@ -50,9 +50,13 @@ const actions = { dispatch, page: val }), - updateDayTypes: (index) => ({ + updateDayTypes: (dayTypes) => ({ type: 'UPDATE_DAY_TYPES', - index + dayTypes + }), + updateCurrentMonthFromDaytypes: (dayTypes) => ({ + type: 'UPDATE_CURRENT_MONTH_FROM_DAYTYPES', + dayTypes }), updateComment: (comment) => ({ type: 'UPDATE_COMMENT', @@ -162,11 +166,8 @@ const actions = { if(testDate === false){ if(currentDate >= begin && currentDate <= end) { - if(daytypes[d.wday] === false) { - testDate = false - } else { - testDate = true - } + testDate = true + p.include_date = false } } }) @@ -174,8 +175,11 @@ const actions = { } let improvedCM = state.current_month.map((d, i) => { + let bool = isInPeriod(state.current_month[i]) return _.assign({}, state.current_month[i], { - in_periods: isInPeriod(state.current_month[i]) + in_periods: bool, + include_date: bool ? false : state.current_month[i].include_date, + excluded_date: !bool ? false : state.current_month[i].excluded_date }) }) return improvedCM @@ -197,7 +201,7 @@ const actions = { start = new Date(start) end = new Date(end) _.each(periods, (period, i) => { - if(index != 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)) error = 'Les périodes ne peuvent pas se chevaucher' } 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 cc7980b22..10b558373 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/components/ExceptionsInDay.js +++ b/app/assets/javascripts/es6_browserified/time_tables/components/ExceptionsInDay.js @@ -10,9 +10,8 @@ class ExceptionsInDay extends Component { render() { {/* display add or remove link, only if true in daytypes */} - if(this.props.outFromDaytypes == true) { {/* display add or remove link, according to context (presence in period, or not) */} - if(this.props.value.current_month[this.props.index].in_periods == true) { + if(this.props.value.current_month[this.props.index].in_periods == true && this.props.blueDaytype == true) { return ( <div className='td'> <button @@ -28,7 +27,7 @@ class ExceptionsInDay extends Component { </button> </div> ) - } else { + } else if(this.props.value.current_month[this.props.index].in_periods == false) { return ( <div className='td'> <button @@ -44,19 +43,20 @@ class ExceptionsInDay extends Component { </button> </div> ) + } else if(this.props.value.current_month[this.props.index].in_periods == true && this.props.blueDaytype == false){ + return ( + <div className='td'></div> + ) + } else{ + return false } - } else { - return ( - <div className='td'></div> - ) - } } } ExceptionsInDay.propTypes = { value: PropTypes.object.isRequired, metas: PropTypes.object.isRequired, - outFromDaytypes: PropTypes.bool.isRequired, + blueDaytype: PropTypes.bool.isRequired, onExcludeDateFromPeriod: PropTypes.func.isRequired, onIncludeDateInPeriod: PropTypes.func.isRequired, index: PropTypes.number.isRequired diff --git a/app/assets/javascripts/es6_browserified/time_tables/components/Metas.js b/app/assets/javascripts/es6_browserified/time_tables/components/Metas.js index 792d75520..502320c27 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/components/Metas.js +++ b/app/assets/javascripts/es6_browserified/time_tables/components/Metas.js @@ -107,7 +107,7 @@ const Metas = ({metas, onUpdateDayTypes, onUpdateComment, onUpdateColor, onSelec <div className="checkbox"> <label> <input - onChange={(e) => {onUpdateDayTypes(i)}} + onChange={(e) => {onUpdateDayTypes(i, metas.day_types)}} id={i} type="checkbox" checked={day ? 'checked' : ''} 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 5beb80573..1a6c67b6b 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/components/PeriodForm.js +++ b/app/assets/javascripts/es6_browserified/time_tables/components/PeriodForm.js @@ -118,7 +118,7 @@ const PeriodForm = ({modal, timetable, metas, onOpenAddPeriodForm, onClosePeriod <div className="text-right"> <button type='button' - className='btn btn-outline-primary add_fields' + className='btn btn-outline-primary' onClick={onOpenAddPeriodForm} > Ajouter une période diff --git a/app/assets/javascripts/es6_browserified/time_tables/components/TimeTableDay.js b/app/assets/javascripts/es6_browserified/time_tables/components/TimeTableDay.js index 29c894565..71621c874 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/components/TimeTableDay.js +++ b/app/assets/javascripts/es6_browserified/time_tables/components/TimeTableDay.js @@ -17,7 +17,7 @@ class TimeTableDay extends Component { {((this.props.value.day).charAt(0) == 'm') ? (this.props.value.day).substr(0, 2) : (this.props.value.day).charAt(0)} </span> <span - className={'daynumber' + (((this.props.value.in_periods && this.props.dayTypeActive && !this.props.value.excluded_date) || (this.props.value.include_date && this.props.dayTypeActive)) ? ' included' : '')} + className={'daynumber' + (((this.props.value.in_periods && this.props.dayTypeActive && !this.props.value.excluded_date) || (this.props.value.include_date)) ? ' included' : '')} > {this.props.value.mday} </span> 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 1830bfcde..d562655b9 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/components/Timetable.js +++ b/app/assets/javascripts/es6_browserified/time_tables/components/Timetable.js @@ -60,7 +60,7 @@ class Timetable extends Component{ {this.props.timetable.current_month.map((d, i) => <div key={i} - className={'td-group' + (this.props.metas.day_types[d.wday] ? '' : ' out_from_daytypes') + (d.wday == 0 ? ' last_wday' : '')} + className={'td-group' + (this.props.metas.day_types[d.wday] || !d.in_periods ? '' : ' out_from_daytypes') + (d.wday == 0 ? ' last_wday' : '')} > {/* day_types */} <div className="td"></div> @@ -80,7 +80,7 @@ class Timetable extends Component{ index={i} value={this.props.timetable} metas={this.props.metas} - outFromDaytypes={this.props.metas.day_types[d.wday]} + blueDaytype={this.props.metas.day_types[d.wday]} onExcludeDateFromPeriod={this.props.onExcludeDateFromPeriod} onIncludeDateInPeriod={this.props.onIncludeDateInPeriod} /> diff --git a/app/assets/javascripts/es6_browserified/time_tables/containers/Metas.js b/app/assets/javascripts/es6_browserified/time_tables/containers/Metas.js index a8639d89f..c4ab2d5b3 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/containers/Metas.js +++ b/app/assets/javascripts/es6_browserified/time_tables/containers/Metas.js @@ -10,8 +10,11 @@ const mapStateToProps = (state) => { const mapDispatchToProps = (dispatch) => { return { - onUpdateDayTypes: (index) => { - dispatch(actions.updateDayTypes(index)) + onUpdateDayTypes: (index, dayTypes) => { + let newDayTypes = dayTypes.slice(0) + newDayTypes[index] = !newDayTypes[index] + dispatch(actions.updateDayTypes(newDayTypes)) + dispatch(actions.updateCurrentMonthFromDaytypes(newDayTypes)) }, onUpdateComment: (comment) => { dispatch(actions.updateComment(comment)) diff --git a/app/assets/javascripts/es6_browserified/time_tables/reducers/metas.js b/app/assets/javascripts/es6_browserified/time_tables/reducers/metas.js index dd6b484f3..97de90225 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/reducers/metas.js +++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/metas.js @@ -18,9 +18,7 @@ const metas = (state = {}, action) => { case 'VALIDATE_PERIOD_FORM': return _.assign({}, state, {calendar: {name: 'Aucun'}}) case 'UPDATE_DAY_TYPES': - let dayTypes = state.day_types.slice(0) - dayTypes[action.index] = !dayTypes[action.index] - return _.assign({}, state, {day_types: dayTypes, calendar : {name: 'Aucun'}}) + return _.assign({}, state, {day_types: action.dayTypes, calendar : {name: 'Aucun'}}) case 'UPDATE_COMMENT': return _.assign({}, state, {comment: action.comment}) case 'UPDATE_COLOR': 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 f84223b23..65cd9231a 100644 --- a/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js +++ b/app/assets/javascripts/es6_browserified/time_tables/reducers/timetable.js @@ -55,6 +55,8 @@ const timetable = (state = {}, action) => { }) newState = _.assign({}, state, {current_month: newCMe}) return _.assign({}, newState, {current_month: actions.updateSynthesis(newState, action.dayTypes)}) + case 'UPDATE_CURRENT_MONTH_FROM_DAYTYPES': + return _.assign({}, state, {current_month: actions.updateSynthesis(state, action.dayTypes)}) case 'VALIDATE_PERIOD_FORM': let period_start = actions.formatDate(action.modalProps.begin) let period_end = actions.formatDate(action.modalProps.end) 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 0e6f5ed12..0af1bb53d 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/actions/index.js @@ -88,9 +88,10 @@ const actions = { type : 'DELETE_CALENDAR_MODAL', timetable }), - editVehicleJourneyCalendars : (vehicleJourneys) => ({ - type: 'EDIT_VEHICLEJOURNEYS_CALENDARS', - vehicleJourneys + editVehicleJourneyTimetables : (vehicleJourneys, timetables) => ({ + type: 'EDIT_VEHICLEJOURNEYS_TIMETABLES', + vehicleJourneys, + timetables }), openShiftModal : () => ({ type : 'SHIFT_VEHICLEJOURNEY_MODAL' @@ -189,6 +190,9 @@ const actions = { toggleWithoutSchedule: () => ({ type: 'TOGGLE_WITHOUT_SCHEDULE' }), + toggleWithoutTimeTable: () => ({ + type: 'TOGGLE_WITHOUT_TIMETABLE' + }), updateStartTimeFilter: (val, unit) => ({ type: 'UPDATE_START_TIME_FILTER', val, @@ -216,6 +220,12 @@ const actions = { published_name: selectedJP.published_name } }), + filterSelect2VehicleJourney: (selectedVJ) => ({ + type : 'SELECT_VJ_FILTER', + selectedItem: { + objectid: selectedVJ.objectid + } + }), createQueryString: () => ({ type: 'CREATE_QUERY_STRING' }), diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Filters.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Filters.js index 6f07dd880..e2d03e195 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Filters.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Filters.js @@ -1,16 +1,26 @@ var React = require('react') var PropTypes = require('react').PropTypes var MissionSelect2 = require('./tools/select2s/MissionSelect2') +var VJSelect2 = require('./tools/select2s/VJSelect2') var TimetableSelect2 = require('./tools/select2s/TimetableSelect2') -const Filters = ({filters, pagination, onFilter, onResetFilters, onUpdateStartTimeFilter, onUpdateEndTimeFilter, onToggleWithoutSchedule, onSelect2Timetable, onSelect2JourneyPattern}) => { +const Filters = ({filters, pagination, onFilter, onResetFilters, onUpdateStartTimeFilter, onUpdateEndTimeFilter, onToggleWithoutSchedule, onToggleWithoutTimeTable, onSelect2Timetable, onSelect2JourneyPattern, onSelect2VehicleJourney}) => { return ( <div className='row'> <div className='col-lg-12'> <div className='form form-filter'> <div className='ffg-row'> + {/* ID course */} + <div className="form-group w33"> + <VJSelect2 + onSelect2VehicleJourney={onSelect2VehicleJourney} + filters={filters} + isFilter={true} + /> + </div> + {/* Missions */} - <div className='form-group w40'> + <div className='form-group w33'> <MissionSelect2 onSelect2JourneyPattern={onSelect2JourneyPattern} filters={filters} @@ -19,7 +29,7 @@ const Filters = ({filters, pagination, onFilter, onResetFilters, onUpdateStartTi </div> {/* Calendriers */} - <div className='form-group w40'> + <div className='form-group w33'> <TimetableSelect2 onSelect2Timetable={onSelect2Timetable} hasRoute={true} @@ -87,9 +97,9 @@ const Filters = ({filters, pagination, onFilter, onResetFilters, onUpdateStartTi </div> {/* Switch avec/sans horaires */} - <div className='form-group has_switch w40'> - <label className='control-label col-sm-8'>Afficher les courses sans horaires</label> - <div className='form-group col-sm-4' style={{padding: 0}}> + <div className='form-group has_switch'> + <label className='control-label pull-left'>Afficher les courses sans horaires</label> + <div className='form-group pull-left' style={{padding: 0}}> <div className='checkbox'> <label> <input @@ -104,6 +114,25 @@ const Filters = ({filters, pagination, onFilter, onResetFilters, onUpdateStartTi </div> </div> + <div className="ffg-row"> + {/* Switch avec/sans calendrier */} + <div className='form-group has_switch'> + <label className='control-label pull-left'>Afficher les courses sans calendrier</label> + <div className='form-group pull-left' style={{padding: 0}}> + <div className='checkbox'> + <label> + <input + type='checkbox' + onChange={onToggleWithoutTimeTable} + checked={filters.query.withoutTimeTable} + ></input> + <span className='switch-label' data-checkedvalue='Oui' data-uncheckedvalue='Non'></span> + </label> + </div> + </div> + </div> + </div> + {/* Actions */} <div className='actions'> <span @@ -131,7 +160,8 @@ Filters.propTypes = { onUpdateStartTimeFilter: PropTypes.func.isRequired, onUpdateEndTimeFilter: PropTypes.func.isRequired, onSelect2Timetable: PropTypes.func.isRequired, - onSelect2JourneyPattern: PropTypes.func.isRequired + onSelect2JourneyPattern: PropTypes.func.isRequired, + onSelect2VehicleJourney: PropTypes.func.isRequired } module.exports = Filters 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 e486dd155..b417828db 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Tools.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/Tools.js @@ -6,7 +6,7 @@ var ShiftVehicleJourney = require('../containers/tools/ShiftVehicleJourney') var DuplicateVehicleJourney = require('../containers/tools/DuplicateVehicleJourney') var EditVehicleJourney = require('../containers/tools/EditVehicleJourney') var NotesEditVehicleJourney = require('../containers/tools/NotesEditVehicleJourney') -var CalendarsEditVehicleJourney = require('../containers/tools/CalendarsEditVehicleJourney') +var TimetablesEditVehicleJourney = require('../containers/tools/TimetablesEditVehicleJourney') var actions = require('../actions') const Tools = ({vehicleJourneys, onCancelSelection}) => { @@ -17,7 +17,7 @@ const Tools = ({vehicleJourneys, onCancelSelection}) => { <DuplicateVehicleJourney /> <ShiftVehicleJourney /> <EditVehicleJourney /> - <CalendarsEditVehicleJourney /> + <TimetablesEditVehicleJourney /> <NotesEditVehicleJourney /> <DeleteVehicleJourneys /> </ul> 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 6f338f747..de370ac1b 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/VehicleJourney.js @@ -15,6 +15,7 @@ class VehicleJourney extends Component { bool = true this.previousCity = sp.stop_area_cityname } + return bool } @@ -51,9 +52,11 @@ class VehicleJourney extends Component { <div className='th'> <div className='strong mb-xs'>{this.props.value.objectid ? actions.humanOID(this.props.value.objectid) : '-'}</div> <div>{actions.humanOID(this.props.value.journey_pattern.objectid)}</div> - {this.props.value.time_tables.map((tt, i)=> - <div key={i}>{this.timeTableURL(tt)}</div> - )} + <div> + {this.props.value.time_tables.map((tt, i)=> + <span key={i} className='vj_tt'>{this.timeTableURL(tt)}</span> + )} + </div> {(this.props.filters.policy['vehicle_journeys.edit'] == true) && <div className={(this.props.value.deletable ? 'disabled ' : '') + 'checkbox'}> @@ -73,7 +76,7 @@ class VehicleJourney extends Component { </div> {this.props.value.vehicle_journey_at_stops.map((vj, i) => <div key={i} className='td text-center'> - <div className={'cellwrap' + (vj.dummy ? ' headlined' : '') + (this.cityNameChecker(vj) ? ' headlined' : '')}> + <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.edit'] == false) ? 'disabled ' : '') + 'input-group time'}> 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 1e121b473..314d481d4 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 @@ -71,6 +71,7 @@ class CreateModal extends Component { <div className='form-group'> <label className='control-label is-required'>Nom public de la mission</label> <MissionSelect2 + selection={this.props.modal.modalProps} onSelect2JourneyPattern={this.props.onSelect2JourneyPattern} isFilter={false} /> diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CalendarsEditVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/TimetablesEditVehicleJourney.js index e32c873e6..d6c1179ba 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/CalendarsEditVehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/TimetablesEditVehicleJourney.js @@ -4,13 +4,13 @@ var PropTypes = require('react').PropTypes var actions = require('../../actions') var TimetableSelect2 = require('./select2s/TimetableSelect2') -class CalendarsEditVehicleJourney extends Component { +class TimetablesEditVehicleJourney extends Component { constructor(props) { super(props) } handleSubmit() { - this.props.onCalendarsEditVehicleJourney(this.props.modal.modalProps.vehicleJourneys) + this.props.onTimetablesEditVehicleJourney(this.props.modal.modalProps.vehicleJourneys, this.props.modal.modalProps.timetables) this.props.onModalClose() $('#CalendarsEditVehicleJourneyModal').modal('hide') } @@ -134,14 +134,14 @@ class CalendarsEditVehicleJourney extends Component { } } -CalendarsEditVehicleJourney.propTypes = { +TimetablesEditVehicleJourney.propTypes = { onOpenCalendarsEditModal: PropTypes.func.isRequired, onModalClose: PropTypes.func.isRequired, - onCalendarsEditVehicleJourney: PropTypes.func.isRequired, + onTimetablesEditVehicleJourney: PropTypes.func.isRequired, onDeleteCalendarModal: PropTypes.func.isRequired, onSelect2Timetable: PropTypes.func.isRequired, onAddSelectedTimetable: PropTypes.func.isRequired, filters: PropTypes.object.isRequired } -module.exports = CalendarsEditVehicleJourney +module.exports = TimetablesEditVehicleJourney 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 1f5e5e98f..a6b8dcfa1 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 @@ -27,6 +27,7 @@ class BSelect4 extends React.Component{ theme: 'bootstrap', width: '100%', placeholder: 'Filtrer par transporteur...', + language: require('./fr'), ajax: { url: origin + path + '/companies.json' + '?line_id=' + line, dataType: 'json', 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 75cbd1f3c..36aaa5cfd 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 @@ -13,18 +13,20 @@ class BSelect4 extends React.Component{ super(props) } + render() { return ( <Select2 - data={(this.props.isFilter) ? [this.props.filters.query.journeyPattern.published_name] : undefined} - value={(this.props.isFilter) ? this.props.filters.query.journeyPattern.published_name : undefined} + data={(this.props.isFilter) ? [this.props.filters.query.journeyPattern.published_name] : ((this.props.selection.selectedJPModal) ? [this.props.selection.selectedJPModal.published_name] : undefined)} + value={(this.props.isFilter) ? this.props.filters.query.journeyPattern.published_name : ((this.props.selection.selectedJPModal) ? this.props.selection.selectedJPModal.published_name : undefined) } onSelect={(e) => this.props.onSelect2JourneyPattern(e)} multiple={false} ref='journey_pattern_id' options={{ allowClear: false, theme: 'bootstrap', - placeholder: 'Filtrer par mission...', + placeholder: 'Filtrer par code, nom ou OID de mission...', + language: require('./fr'), width: '100%', ajax: { url: origin + path + '/journey_patterns_collection.json', @@ -32,7 +34,7 @@ class BSelect4 extends React.Component{ delay: '500', data: function(params) { return { - q: {published_name_cont: params.term}, + q: {published_name_or_objectid_or_registration_number_cont: params.term}, }; }, processResults: function(data, params) { @@ -41,14 +43,15 @@ class BSelect4 extends React.Component{ item => _.assign( {}, item, - {text: item.published_name} + { text: '<small><em>Nom: </em></small>' + item.published_name + '<br/><small><em>Code: </em></small>' + item.registration_number + '<br/><small><em>ID: </em></small>' + _.last(_.split(item.object_id, ':')) } ) ) }; }, cache: true }, - minimumInputLength: 3, + minimumInputLength: 2, + escapeMarkup: function (markup) { return markup; }, templateResult: formatRepo }} /> 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 c28d8e06f..b236e7d94 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 @@ -26,6 +26,7 @@ class BSelect4 extends React.Component{ theme: 'bootstrap', width: '100%', placeholder: 'Filtrer par calendrier...', + language: require('./fr'), ajax: { url: origin + path + this.props.chunkURL, dataType: 'json', diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/VJSelect2.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/VJSelect2.js new file mode 100644 index 000000000..cc2ee4b9e --- /dev/null +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/VJSelect2.js @@ -0,0 +1,68 @@ +var _ = require('lodash') +var React = require('react') +var PropTypes = require('react').PropTypes +var Select2 = require('react-select2') + +// get JSON full path +var origin = window.location.origin +var path = window.location.pathname.split('/', 7).join('/') + + +class BSelect4b extends React.Component{ + constructor(props) { + super(props) + } + humanOID(oid) { + var a = oid.split(':') + return a[a.length - 1] + } + + render() { + return ( + <Select2 + data={(this.props.isFilter) ? [this.props.filters.query.vehicleJourney.objectid] : undefined} + value={(this.props.isFilter) ? this.props.filters.query.vehicleJourney.objectid : undefined} + onSelect={(e) => this.props.onSelect2VehicleJourney(e)} + multiple={false} + ref='vehicle_journey_objectid' + options={{ + allowClear: false, + theme: 'bootstrap', + placeholder: 'Filtrer par ID course...', + width: '100%', + language: require('./fr'), + ajax: { + url: origin + path + '/vehicle_journeys.json', + dataType: 'json', + delay: '500', + data: function(params) { + return { + q: {objectid_cont: params.term}, + }; + }, + processResults: function(data, params) { + return { + results: data.vehicle_journeys.map( + item => _.assign( + {}, + item, + { id: item.objectid, text: _.last(_.split(item.objectid, ':')) } + ) + ) + }; + }, + cache: true + }, + minimumInputLength: 1, + templateResult: formatRepo + }} + /> + ) + } +} + +const formatRepo = (props) => { + if(props.text) return props.text +} + +module.exports = BSelect4b diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/fr.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/fr.js new file mode 100644 index 000000000..20154d412 --- /dev/null +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/components/tools/select2s/fr.js @@ -0,0 +1,9 @@ +module.exports = { + errorLoading:function(){return"Les résultats ne peuvent pas être chargés."}, + inputTooLong:function(e){var t=e.input.length-e.maximum,n="Supprimez "+t+" caractère";return t!==1&&(n+="s"),n}, + inputTooShort:function(e){var t=e.minimum-e.input.length,n="Saisissez "+t+" caractère";return t!==1&&(n+="s"),n}, + loadingMore:function(){return"Chargement de résultats supplémentaires…"}, + maximumSelected:function(e){var t="Vous pouvez seulement sélectionner "+e.maximum+" élément";return e.maximum!==1&&(t+="s"),t}, + noResults:function(){return"Aucun résultat trouvé"}, + searching:function(){return"Recherche en cours…"} +} diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/Filters.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/Filters.js index 7570dd466..831b47ca1 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/Filters.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/Filters.js @@ -22,6 +22,9 @@ const mapDispatchToProps = (dispatch) => { onToggleWithoutSchedule: () =>{ dispatch(actions.toggleWithoutSchedule()) }, + onToggleWithoutTimeTable: () =>{ + dispatch(actions.toggleWithoutTimeTable()) + }, onResetFilters: (e, pagination) =>{ dispatch(actions.checkConfirmModal(e, actions.resetFilters(dispatch), pagination.stateChanged, dispatch)) }, @@ -33,6 +36,9 @@ const mapDispatchToProps = (dispatch) => { }, onSelect2JourneyPattern: (e) => { dispatch(actions.filterSelect2JourneyPattern(e.params.data)) + }, + onSelect2VehicleJourney: (e) => { + dispatch(actions.filterSelect2VehicleJourney(e.params.data)) } } } diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/CalendarsEditVehicleJourney.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/TimetablesEditVehicleJourney.js index 130acb017..6d0096019 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/CalendarsEditVehicleJourney.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/containers/tools/TimetablesEditVehicleJourney.js @@ -1,5 +1,5 @@ var connect = require('react-redux').connect -var CalendarsEditComponent = require('../../components/tools/CalendarsEditVehicleJourney') +var TimetablesEditComponent = require('../../components/tools/TimetablesEditVehicleJourney') var actions = require('../../actions') const mapStateToProps = (state) => { @@ -22,8 +22,8 @@ const mapDispatchToProps = (dispatch) => { onDeleteCalendarModal: (timetable) => { dispatch(actions.deleteCalendarModal(timetable)) }, - onCalendarsEditVehicleJourney: (calendars) =>{ - dispatch(actions.editVehicleJourneyCalendars(calendars)) + onTimetablesEditVehicleJourney: (vehicleJourneys, timetables) =>{ + dispatch(actions.editVehicleJourneyTimetables(vehicleJourneys, timetables)) }, onSelect2Timetable: (e) =>{ dispatch(actions.selectTTCalendarsModal(e.params.data)) @@ -34,6 +34,6 @@ const mapDispatchToProps = (dispatch) => { } } -const CalendarsEditVehicleJourney = connect(mapStateToProps, mapDispatchToProps)(CalendarsEditComponent) +const TimetablesEditVehicleJourney = connect(mapStateToProps, mapDispatchToProps)(TimetablesEditComponent) -module.exports = CalendarsEditVehicleJourney +module.exports = TimetablesEditVehicleJourney diff --git a/app/assets/javascripts/es6_browserified/vehicle_journeys/index.js b/app/assets/javascripts/es6_browserified/vehicle_journeys/index.js index 4c9423c1f..489446ab9 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/index.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/index.js @@ -8,10 +8,10 @@ var actions = require("./actions") var enableBatching = require('./batch').enableBatching // logger, DO NOT REMOVE -// var applyMiddleware = require('redux').applyMiddleware -// var createLogger = require('redux-logger') -// var thunkMiddleware = require('redux-thunk').default -// var promise = require('redux-promise') +var applyMiddleware = require('redux').applyMiddleware +var createLogger = require('redux-logger') +var thunkMiddleware = require('redux-thunk').default +var promise = require('redux-promise') var selectedJP = [] @@ -38,13 +38,17 @@ var initialState = { journeyPattern: { published_name: '' }, + vehicleJourney: { + objectid: '' + }, company: { name: '' }, timetable: { comment: '' }, - withoutSchedule: true + withoutSchedule: true, + withoutTimeTable: false } }, @@ -76,16 +80,17 @@ if (window.jpOrigin){ } let params = { 'q[journey_pattern_id_eq]': initialState.filters.query.journeyPattern.id, + 'q[objectid_cont]': initialState.filters.query.vehicleJourney.objectid } initialState.filters.queryString = actions.encodeParams(params) } -// const loggerMiddleware = createLogger() +const loggerMiddleware = createLogger() let store = createStore( enableBatching(vehicleJourneysApp), - initialState - // applyMiddleware(thunkMiddleware, promise, loggerMiddleware) + initialState, + applyMiddleware(thunkMiddleware, promise, loggerMiddleware) ) render( 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 80b62c6b4..09588f824 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/filters.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/filters.js @@ -15,11 +15,14 @@ const filters = (state = {}, action) => { minute: '59' } } - newQuery = _.assign({}, state.query, {interval: interval, journeyPattern: {}, timetable: {}, withoutSchedule: true }) + newQuery = _.assign({}, state.query, {interval: interval, journeyPattern: {}, vehicleJourney: {}, timetable: {}, withoutSchedule: true, withoutTimeTable: false }) return _.assign({}, state, {query: newQuery, queryString: ''}) case 'TOGGLE_WITHOUT_SCHEDULE': newQuery = _.assign({}, state.query, {withoutSchedule: !state.query.withoutSchedule}) return _.assign({}, state, {query: newQuery}) + case 'TOGGLE_WITHOUT_TIMETABLE': + newQuery = _.assign({}, state.query, {withoutTimeTable: !state.query.withoutTimeTable}) + 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, action.unit) @@ -44,6 +47,9 @@ const filters = (state = {}, action) => { case 'SELECT_JP_FILTER': newQuery = _.assign({}, state.query, {journeyPattern : action.selectedItem}) return _.assign({}, state, {query: newQuery}) + case 'SELECT_VJ_FILTER': + newQuery = _.assign({}, state.query, {vehicleJourney : action.selectedItem}) + return _.assign({}, state, {query: newQuery}) case 'TOGGLE_ARRIVALS': return _.assign({}, state, {toggleArrivals: !state.toggleArrivals}) case 'QUERY_FILTER_VEHICLEJOURNEYS': @@ -52,11 +58,12 @@ const filters = (state = {}, action) => { case 'CREATE_QUERY_STRING': let params = { 'q[journey_pattern_id_eq]': state.query.journeyPattern.id || undefined, + 'q[objectid_cont]': state.query.vehicleJourney.objectid || undefined, 'q[time_tables_id_eq]': state.query.timetable.id || undefined, - // Fixme 3358 - // '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_without_departure_time]' : state.query.withoutSchedule + '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_without_departure_time]': state.query.withoutSchedule, + 'q[vehicle_journey_without_time_table]': state.query.withoutTimeTable } let queryString = actions.encodeParams(params) return _.assign({}, state, {queryString: queryString}) 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 3b13ab9de..e504c2531 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/modal.js @@ -63,17 +63,6 @@ const modal = (state = {}, action) => { case 'ADD_SELECTED_TIMETABLE': if(state.modalProps.selectedTimetable){ newModalProps = JSON.parse(JSON.stringify(state.modalProps)) - newModalProps.vehicleJourneys.map((vj) => { - let isPresent = false - vj.time_tables.forEach((tt) =>{ - if (_.isEqual(newModalProps.selectedTimetable.objectid, tt.objectid)){ - isPresent = true - } - }) - if (!isPresent){ - vj.time_tables.push(newModalProps.selectedTimetable) - } - }) if (!_.find(newModalProps.timetables, newModalProps.selectedTimetable)){ newModalProps.timetables.push(newModalProps.selectedTimetable) } 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 2db76deae..d153739ce 100644 --- a/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js +++ b/app/assets/javascripts/es6_browserified/vehicle_journeys/reducers/vehicleJourneys.js @@ -1,7 +1,7 @@ var _ = require('lodash') var actions = require("../actions") -const vehicleJourney= (state = {}, action) => { +const vehicleJourney= (state = {}, action, keep) => { switch (action.type) { case 'SELECT_VEHICLEJOURNEY': return _.assign({}, state, {selected: !state.selected}) @@ -61,10 +61,14 @@ const vehicleJourney= (state = {}, action) => { actions.checkSchedules(shiftedSchedule) shiftedVjas = _.assign({}, state.vehicle_journey_at_stops[i], shiftedSchedule) vjas = _.assign({}, state.vehicle_journey_at_stops[i], shiftedVjas) - delete vjas['id'] + if(!keep){ + delete vjas['id'] + } return vjas }else { - delete vjas['id'] + if(!keep){ + delete vjas['id'] + } return vjas } }) @@ -147,13 +151,14 @@ const vehicleJourneys = (state = [], action) => { return vj } }) - case 'EDIT_VEHICLEJOURNEYS_CALENDARS': + case 'EDIT_VEHICLEJOURNEYS_TIMETABLES': + let newTimetables = JSON.parse(JSON.stringify(action.timetables)) return state.map((vj,i) =>{ if(vj.selected){ let updatedVJ = _.assign({}, vj) action.vehicleJourneys.map((vjm, j) =>{ if(vj.objectid == vjm.objectid){ - updatedVJ.time_tables = vjm.time_tables + updatedVJ.time_tables = newTimetables } }) return updatedVJ @@ -164,7 +169,7 @@ const vehicleJourneys = (state = [], action) => { case 'SHIFT_VEHICLEJOURNEY': return state.map((vj, i) => { if (vj.selected){ - return vehicleJourney(vj, action) + return vehicleJourney(vj, action, true) }else{ return vj } @@ -179,7 +184,7 @@ const vehicleJourneys = (state = [], action) => { selectedIndex = i for (i = 0; i< action.data.duplicate_number.value; i++){ action.data.additional_time.value = val * (i + 1) - dupeVj = vehicleJourney(vj, action) + dupeVj = vehicleJourney(vj, action, false) dupeVj.published_journey_name = dupeVj.published_journey_name + '-' + i dupeVj.selected = false delete dupeVj['objectid'] diff --git a/app/assets/javascripts/select2.coffee b/app/assets/javascripts/select2.coffee index 1870f7f9a..af3dc6d75 100644 --- a/app/assets/javascripts/select2.coffee +++ b/app/assets/javascripts/select2.coffee @@ -1,19 +1,42 @@ +bind_select2 = (el, cfg = {}) -> + target = $(el) + default_cfg = + theme: 'bootstrap' + language: 'fr' + placeholder: target.data('select2ed-placeholder') + allowClear: false + + target.select2 $.extend({}, default_cfg, cfg) + +bind_select2_ajax = (el, cfg = {}) -> + target = $(el) + cfg = + ajax: + data: (params) -> + q: + "#{target.data('term')}": params.term + url: target.data('url'), + dataType: 'json', + delay: 125, + processResults: (data, params) -> results: data + minimumInputLength: 3 + templateResult: (item) -> + item.text + templateSelection: (item) -> + item.text + + bind_select2(el, cfg) + @select_2 = -> $("[data-select2ed='true']").each -> - target = $(this) - target.select2 - theme: 'bootstrap' - language: 'fr' - placeholder: target.data('select2ed-placeholder') - allowClear: true + bind_select2(this) + + $("[data-select2-ajax='true']").each -> + bind_select2_ajax(this) $('select.form-control.tags').each -> - target = $(this) - target.select2 - theme: 'bootstrap' - language: 'fr' - allowClear: true - tags: true + bind_select2(this, {tags: true}) + $(document).on 'turbolinks:load', select_2 diff --git a/app/assets/javascripts/time_table_combinations.coffee b/app/assets/javascripts/time_table_combinations.coffee new file mode 100644 index 000000000..8923af958 --- /dev/null +++ b/app/assets/javascripts/time_table_combinations.coffee @@ -0,0 +1,6 @@ +@combinedTypeToggle = -> + $('#time_table_combination_combined_type').on 'click', -> + $(this).closest('.has_switch').siblings('.form-group').each -> + $(this).toggleClass('hidden') + +$(document).on 'turbolinks:load', combinedTypeToggle |
