From 43dd9a4abc58b9c7cf2203a5e7125a7788bb33b3 Mon Sep 17 00:00:00 2001
From: Zog
Date: Wed, 27 Dec 2017 08:36:47 +0100
Subject: Refs #5419; Fix actions policies
Fix actions conditions on VehicleJourney#index
---
app/javascript/vehicle_journeys/components/Tools.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/app/javascript/vehicle_journeys/components/Tools.js b/app/javascript/vehicle_journeys/components/Tools.js
index 1ef576529..99ce78eb1 100644
--- a/app/javascript/vehicle_journeys/components/Tools.js
+++ b/app/javascript/vehicle_journeys/components/Tools.js
@@ -25,13 +25,13 @@ export default class Tools extends Component {
return (
{actions.getSelected(vehicleJourneys).length} course(s) sélectionnée(s)
--
cgit v1.2.3
From 78e2d256f895c1014a3def5f2ef6509086755215 Mon Sep 17 00:00:00 2001
From: Zog
Date: Wed, 27 Dec 2017 09:10:56 +0100
Subject: Refs #5407 @4h; First UI implementation
- Add most of the react code
- And the specs where possible
Still remains:
- Link PurchaseWindows to VehicleJourneys in the model
- Add an autocompletion endpoint
---
app/controllers/vehicle_journeys_controller.rb | 1 +
app/javascript/packs/vehicle_journeys/index.js | 3 +-
app/javascript/vehicle_journeys/actions/index.js | 34 +++++
.../components/SaveVehicleJourneys.js | 2 +-
.../vehicle_journeys/components/Tools.js | 11 +-
.../vehicle_journeys/components/VehicleJourney.js | 23 +++-
.../vehicle_journeys/components/VehicleJourneys.js | 8 +-
.../tools/PurchaseWindowsEditVehicleJourney.js | 150 +++++++++++++++++++++
.../tools/PurchaseWindowsEditVehicleJourney.js | 38 ++++++
app/javascript/vehicle_journeys/reducers/modal.js | 51 ++++++-
.../vehicle_journeys/reducers/vehicleJourneys.js | 15 +++
app/models/chouette/vehicle_journey.rb | 5 +
.../journey_patterns_collections/show.html.slim | 1 +
app/views/vehicle_journeys/index.html.slim | 1 +
app/views/vehicle_journeys/show.rabl | 6 +
spec/javascript/vehicle_journeys/actions_spec.js | 89 ++++++++++++
.../vehicle_journeys/reducers/modal_spec.js | 82 +++++++++++
.../reducers/vehicleJourneys_spec.js | 13 +-
18 files changed, 525 insertions(+), 8 deletions(-)
create mode 100644 app/javascript/vehicle_journeys/components/tools/PurchaseWindowsEditVehicleJourney.js
create mode 100644 app/javascript/vehicle_journeys/containers/tools/PurchaseWindowsEditVehicleJourney.js
diff --git a/app/controllers/vehicle_journeys_controller.rb b/app/controllers/vehicle_journeys_controller.rb
index c941aeae4..7d16d1c75 100644
--- a/app/controllers/vehicle_journeys_controller.rb
+++ b/app/controllers/vehicle_journeys_controller.rb
@@ -164,6 +164,7 @@ class VehicleJourneysController < ChouetteController
%w{create destroy update}.inject({}) do | permissions, action |
permissions.merge( "vehicle_journeys.#{action}" => policy.authorizes_action?(action) )
end.to_json
+ @features = Hash[*current_organisation.features.map{|f| [f, true]}.flatten].to_json
end
private
diff --git a/app/javascript/packs/vehicle_journeys/index.js b/app/javascript/packs/vehicle_journeys/index.js
index 38431af1d..7e57afb04 100644
--- a/app/javascript/packs/vehicle_journeys/index.js
+++ b/app/javascript/packs/vehicle_journeys/index.js
@@ -23,6 +23,7 @@ var initialState = {
filters: {
selectedJourneyPatterns : selectedJP,
policy: window.perms,
+ features: window.features,
toggleArrivals: false,
queryString: '',
query: {
@@ -99,4 +100,4 @@ render(
,
document.getElementById('vehicle_journeys_wip')
-)
\ No newline at end of file
+)
diff --git a/app/javascript/vehicle_journeys/actions/index.js b/app/javascript/vehicle_journeys/actions/index.js
index c82f759d6..d5eda629c 100644
--- a/app/javascript/vehicle_journeys/actions/index.js
+++ b/app/javascript/vehicle_journeys/actions/index.js
@@ -99,6 +99,30 @@ const actions = {
vehicleJourneys,
timetables
}),
+ openPurchaseWindowsEditModal : (vehicleJourneys) => ({
+ type : 'EDIT_PURCHASE_WINDOWS_VEHICLEJOURNEY_MODAL',
+ vehicleJourneys
+ }),
+ selectPurchaseWindowsModal: (selectedTT) =>({
+ type: 'SELECT_PURCHASE_WINDOW_MODAL',
+ selectedItem:{
+ id: selectedTT.id,
+ comment: selectedTT.comment,
+ objectid: selectedTT.objectid
+ }
+ }),
+ addSelectedPurchaseWindow: () => ({
+ type: 'ADD_SELECTED_PURCHASE_WINDOW'
+ }),
+ deletePurchaseWindowsModal : (purchaseWindow) => ({
+ type : 'DELETE_PURCHASE_WINDOW_MODAL',
+ purchaseWindow
+ }),
+ editVehicleJourneyPurchaseWindows : (vehicleJourneys, purchase_windows) => ({
+ type: 'EDIT_VEHICLEJOURNEYS_PURCHASE_WINDOWS',
+ vehicleJourneys,
+ purchase_windows
+ }),
openShiftModal : () => ({
type : 'SHIFT_VEHICLEJOURNEY_MODAL'
}),
@@ -313,6 +337,7 @@ const actions = {
let val
for (val of json.vehicle_journeys){
var timeTables = []
+ var purchaseWindows = []
let tt
for (tt of val.time_tables){
timeTables.push({
@@ -322,6 +347,14 @@ const actions = {
color: tt.color
})
}
+ for (tt of val.purchase_windows){
+ purchaseWindows.push({
+ objectid: tt.objectid,
+ name: tt.name,
+ id: tt.id,
+ color: tt.color
+ })
+ }
let vjasWithDelta = val.vehicle_journey_at_stops.map((vjas, i) => {
actions.fillEmptyFields(vjas)
return actions.getDelta(vjas)
@@ -333,6 +366,7 @@ const actions = {
short_id: val.short_id,
footnotes: val.footnotes,
time_tables: timeTables,
+ purchase_windows: purchaseWindows,
vehicle_journey_at_stops: vjasWithDelta,
deletable: false,
selected: false,
diff --git a/app/javascript/vehicle_journeys/components/SaveVehicleJourneys.js b/app/javascript/vehicle_journeys/components/SaveVehicleJourneys.js
index e8c27f92e..285e2d506 100644
--- a/app/javascript/vehicle_journeys/components/SaveVehicleJourneys.js
+++ b/app/javascript/vehicle_journeys/components/SaveVehicleJourneys.js
@@ -39,4 +39,4 @@ SaveVehicleJourneys.propTypes = {
filters: PropTypes.object.isRequired,
onEnterEditMode: PropTypes.func.isRequired,
onSubmitVehicleJourneys: PropTypes.func.isRequired
-}
\ No newline at end of file
+}
diff --git a/app/javascript/vehicle_journeys/components/Tools.js b/app/javascript/vehicle_journeys/components/Tools.js
index 99ce78eb1..be32552b9 100644
--- a/app/javascript/vehicle_journeys/components/Tools.js
+++ b/app/javascript/vehicle_journeys/components/Tools.js
@@ -7,6 +7,7 @@ import DuplicateVehicleJourney from '../containers/tools/DuplicateVehicleJourney
import EditVehicleJourney from '../containers/tools/EditVehicleJourney'
import NotesEditVehicleJourney from '../containers/tools/NotesEditVehicleJourney'
import TimetablesEditVehicleJourney from '../containers/tools/TimetablesEditVehicleJourney'
+import PurchaseWindowsEditVehicleJourney from '../containers/tools/PurchaseWindowsEditVehicleJourney'
export default class Tools extends Component {
@@ -20,6 +21,11 @@ export default class Tools extends Component {
return this.props.filters.policy[`vehicle_journeys.${key}`]
}
+ hasFeature(key) {
+ // Check if the organisation has the given feature
+ return this.props.filters.features[key]
+ }
+
render() {
let { vehicleJourneys, onCancelSelection, editMode } = this.props
return (
@@ -30,6 +36,9 @@ export default class Tools extends Component {
+ { this.hasFeature('purchase_windows') &&
+
+ }
@@ -44,5 +53,5 @@ export default class Tools extends Component {
Tools.propTypes = {
vehicleJourneys : PropTypes.array.isRequired,
onCancelSelection: PropTypes.func.isRequired,
- filters: PropTypes.object.isRequired
+ filters: PropTypes.object.isRequired,
}
diff --git a/app/javascript/vehicle_journeys/components/VehicleJourney.js b/app/javascript/vehicle_journeys/components/VehicleJourney.js
index bde673345..7a89bcc66 100644
--- a/app/javascript/vehicle_journeys/components/VehicleJourney.js
+++ b/app/javascript/vehicle_journeys/components/VehicleJourney.js
@@ -17,6 +17,10 @@ export default class VehicleJourney extends Component {
return bool
}
+ hasFeature(key) {
+ return this.props.filters.features[key]
+ }
+
timeTableURL(tt) {
let refURL = window.location.pathname.split('/', 3).join('/')
let ttURL = refURL + '/time_tables/' + tt.id
@@ -26,6 +30,15 @@ export default class VehicleJourney extends Component {
)
}
+ purchaseWindowURL(tt) {
+ let refURL = window.location.pathname.split('/', 3).join('/')
+ let ttURL = refURL + '/purchase_windows/' + tt.id
+
+ return (
+
+ )
+ }
+
columnHasDelta() {
let a = []
this.props.value.vehicle_journey_at_stops.map((vj, i) => {
@@ -44,7 +57,7 @@ export default class VehicleJourney extends Component {
render() {
this.previousCity = undefined
- let {time_tables} = this.props.value
+ let {time_tables, purchase_windows} = this.props.value
return (
@@ -57,6 +70,14 @@ export default class VehicleJourney extends Component {
)}
{time_tables.length > 3 && + {time_tables.length - 3}}
+ { this.hasFeature('purchase_windows') &&
+
+ {purchase_windows.slice(0,3).map((tt, i)=>
+ {this.purchaseWindowURL(tt)}
+ )}
+ {purchase_windows.length > 3 && + {purchase_windows.length - 3}}
+
+ }
ID course
ID mission
Calendriers
+ { this.hasFeature('purchase_windows') && Calendriers Commerciaux
}
{this.props.stopPointsList.map((sp, i) =>{
return (
@@ -132,6 +137,7 @@ export default class VehicleJourneys extends Component {
index={index}
editMode={this.props.editMode}
filters={this.props.filters}
+ features={this.props.features}
onUpdateTime={this.props.onUpdateTime}
onSelectVehicleJourney={this.props.onSelectVehicleJourney}
/>
@@ -153,4 +159,4 @@ VehicleJourneys.propTypes = {
onLoadFirstPage: PropTypes.func.isRequired,
onUpdateTime: PropTypes.func.isRequired,
onSelectVehicleJourney: PropTypes.func.isRequired
-}
\ No newline at end of file
+}
diff --git a/app/javascript/vehicle_journeys/components/tools/PurchaseWindowsEditVehicleJourney.js b/app/javascript/vehicle_journeys/components/tools/PurchaseWindowsEditVehicleJourney.js
new file mode 100644
index 000000000..cf51e50f0
--- /dev/null
+++ b/app/javascript/vehicle_journeys/components/tools/PurchaseWindowsEditVehicleJourney.js
@@ -0,0 +1,150 @@
+import React, { PropTypes, Component } from 'react'
+import actions from '../../actions'
+import TimetableSelect2 from './select2s/TimetableSelect2'
+
+export default class PurchaseWindowsEditVehicleJourney extends Component {
+ constructor(props) {
+ super(props)
+ this.handleSubmit = this.handleSubmit.bind(this)
+ this.purchaseWindowURL = this.purchaseWindowURL.bind(this)
+ }
+
+ handleSubmit() {
+ this.props.onTimetablesEditVehicleJourney(this.props.modal.modalProps.vehicleJourneys, this.props.modal.modalProps.purchase_windows)
+ this.props.onModalClose()
+ $('#PurchaseWindowsEditVehicleJourneyModal').modal('hide')
+ }
+
+ purchaseWindowURL(tt) {
+ let refURL = window.location.pathname.split('/', 3).join('/')
+ return refURL + '/purchase_windows/' + tt.id
+ }
+
+ render() {
+ if(this.props.status.isFetching == true) {
+ return false
+ }
+ if(this.props.status.fetchSuccess == true) {
+ return (
+