aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/smart_date.coffee13
-rw-r--r--app/controllers/concerns/metadata_controller_support.rb2
-rw-r--r--app/controllers/journey_patterns_collections_controller.rb2
-rw-r--r--app/controllers/merges_controller.rb2
-rw-r--r--app/controllers/time_tables_controller.rb14
-rw-r--r--app/decorators/line_decorator.rb5
-rw-r--r--app/helpers/multiple_selection_toolbox_helper.rb7
-rw-r--r--app/helpers/referentials_helper.rb12
-rw-r--r--app/helpers/search_helper.rb2
-rw-r--r--app/javascript/helpers/CustomFieldsInputs.js (renamed from app/javascript/vehicle_journeys/components/tools/CustomFieldsInputs.js)17
-rw-r--r--app/javascript/journey_patterns/components/CreateModal.js10
-rw-r--r--app/javascript/journey_patterns/components/EditModal.js34
-rw-r--r--app/javascript/journey_patterns/containers/AddJourneyPattern.js3
-rw-r--r--app/javascript/journey_patterns/containers/Modal.js3
-rw-r--r--app/javascript/journey_patterns/reducers/index.js3
-rw-r--r--app/javascript/journey_patterns/reducers/journeyPatterns.js3
-rw-r--r--app/javascript/packs/journey_patterns/index.js3
-rw-r--r--app/javascript/time_tables/components/Metas.js1
-rw-r--r--app/javascript/time_tables/components/TagsSelect2.js4
-rw-r--r--app/javascript/time_tables/containers/Metas.js1
-rw-r--r--app/javascript/time_tables/reducers/metas.js6
-rw-r--r--app/javascript/vehicle_journeys/components/VehicleJourneys.js12
-rw-r--r--app/javascript/vehicle_journeys/components/tools/CreateModal.js2
-rw-r--r--app/javascript/vehicle_journeys/components/tools/EditVehicleJourney.js2
-rw-r--r--app/models/chouette/journey_pattern.rb10
-rw-r--r--app/models/chouette/purchase_window.rb7
-rw-r--r--app/models/chouette/route.rb9
-rw-r--r--app/models/chouette/stop_area.rb6
-rw-r--r--app/models/chouette/time_table.rb7
-rw-r--r--app/models/custom_field.rb4
-rw-r--r--app/models/import/gtfs.rb23
-rw-r--r--app/models/merge.rb4
-rw-r--r--app/policies/merge_policy.rb4
-rw-r--r--app/views/api/v1/journey_patterns/show.rabl2
-rw-r--r--app/views/journey_patterns_collections/show.html.slim3
-rw-r--r--app/views/lines/show.html.slim20
-rw-r--r--app/views/referential_lines/show.html.slim4
-rw-r--r--app/views/referentials/_period_fields.html.slim4
-rw-r--r--app/workers/route_way_cost_worker.rb11
39 files changed, 183 insertions, 98 deletions
diff --git a/app/assets/javascripts/smart_date.coffee b/app/assets/javascripts/smart_date.coffee
index 48aa1c2f9..9c8b44207 100644
--- a/app/assets/javascripts/smart_date.coffee
+++ b/app/assets/javascripts/smart_date.coffee
@@ -14,11 +14,16 @@ window.isLeapYear = (year) ->
window.smartCorrectDate = ->
allSelectors = $(@).parent().children('select')
- allVals = allSelectors.map (index, sel) ->
- parseInt($(sel).val())
+
+ yearSelect = allSelectors.filter("[name$='(1i)]']")
+ monthSelect = allSelectors.filter("[name$='(2i)]']")
+ daySelect = allSelectors.filter("[name$='(3i)]']")
+ # We expect [day, month, year], so french
+ allVals = [daySelect, monthSelect, yearSelect].map (sel, index) ->
+ parseInt(sel.val())
+
correctedDay = correctDay allVals
- daySelector = allSelectors.first()
- $(daySelector).val(correctedDay)
+ daySelect.val(correctedDay)
$ ->
$(document).on 'change', '.smart_date select', smartCorrectDate
diff --git a/app/controllers/concerns/metadata_controller_support.rb b/app/controllers/concerns/metadata_controller_support.rb
index db83e79ae..4dcbfe5d0 100644
--- a/app/controllers/concerns/metadata_controller_support.rb
+++ b/app/controllers/concerns/metadata_controller_support.rb
@@ -20,7 +20,7 @@ module MetadataControllerSupport
def set_modifier_metadata
_resource = @resources || [resource]
_resource.flatten.each do |r|
- r.try :set_metadata!, :modifier_username, user_for_metadata
+ r.try(:set_metadata!, :modifier_username, user_for_metadata) if r.valid?
end
end
end
diff --git a/app/controllers/journey_patterns_collections_controller.rb b/app/controllers/journey_patterns_collections_controller.rb
index db92d48f3..c1a307464 100644
--- a/app/controllers/journey_patterns_collections_controller.rb
+++ b/app/controllers/journey_patterns_collections_controller.rb
@@ -25,6 +25,8 @@ class JourneyPatternsCollectionsController < ChouetteController
@q = @q.includes(:stop_points)
@ppage = 10
@journey_patterns ||= @q.paginate(page: params[:page], per_page: @ppage).order(:name)
+ @custom_fields = Chouette::JourneyPattern.custom_fields_definitions(referential.workgroup)
+
respond_to do |format|
format.json do
@journey_patterns = @journey_patterns.includes(stop_points: {stop_area: :stop_area_referential})
diff --git a/app/controllers/merges_controller.rb b/app/controllers/merges_controller.rb
index 1ce64ed58..663b6e750 100644
--- a/app/controllers/merges_controller.rb
+++ b/app/controllers/merges_controller.rb
@@ -1,5 +1,5 @@
class MergesController < ChouetteController
- # include PolicyChecker
+ include PolicyChecker
defaults resource_class: Merge
belongs_to :workbench
diff --git a/app/controllers/time_tables_controller.rb b/app/controllers/time_tables_controller.rb
index 2ac8532e0..4ca2293f0 100644
--- a/app/controllers/time_tables_controller.rb
+++ b/app/controllers/time_tables_controller.rb
@@ -77,7 +77,7 @@ class TimeTablesController < ChouetteController
end
def index
- request.format.kml? ? @per_page = nil : @per_page = 12
+ # request.format.kml? ? @per_page = nil : @per_page = 12
index! do |format|
format.html {
@@ -130,6 +130,7 @@ class TimeTablesController < ChouetteController
@time_tables ||= begin
time_tables = @q.result(:distinct => true)
+ sort_column
if sort_column == "bounding_dates"
time_tables = @q.result(:distinct => false).paginate(page: params[:page], per_page: 10)
ids = time_tables.pluck(:id).uniq
@@ -186,10 +187,13 @@ class TimeTablesController < ChouetteController
private
def sort_column
- valid_cols = referential.time_tables.column_names
- valid_cols << "bounding_dates"
- valid_cols << "vehicle_journeys_count"
- valid_cols.include?(params[:sort]) ? params[:sort] : 'comment'
+ @@valid_cols ||= begin
+ valid_cols = %w(id color comment)
+ valid_cols << "bounding_dates"
+ valid_cols << "vehicle_journeys_count"
+ valid_cols
+ end
+ @@valid_cols.include?(params[:sort]) ? params[:sort] : 'comment'
end
def sort_direction
%w[asc desc].include?(params[:direction]) ? params[:direction] : 'asc'
diff --git a/app/decorators/line_decorator.rb b/app/decorators/line_decorator.rb
index 0e7b6b9ae..077978c36 100644
--- a/app/decorators/line_decorator.rb
+++ b/app/decorators/line_decorator.rb
@@ -35,11 +35,6 @@ class LineDecorator < AF83::Decorator
edit_action_link do |l|
l.content {|l| l.primary? ? h.t('actions.edit') : h.t('lines.actions.edit') }
end
-
- action_link on: :index, secondary: :index do |l|
- l.content t('lines.actions.new')
- l.href { h.new_line_referential_line_path(context[:line_referential]) }
- end
end
### the option :policy will automatically check for the corresponding method
diff --git a/app/helpers/multiple_selection_toolbox_helper.rb b/app/helpers/multiple_selection_toolbox_helper.rb
index 7e02c6d73..012851b4a 100644
--- a/app/helpers/multiple_selection_toolbox_helper.rb
+++ b/app/helpers/multiple_selection_toolbox_helper.rb
@@ -4,7 +4,7 @@ module MultipleSelectionToolboxHelper
# #5206 method too long
def multiple_selection_toolbox(actions, collection_name:)
links = content_tag :ul do
-
+
# #5206 `if params[:controller]` mieux passer comme parametre si besoin
delete_path = nil
@@ -19,8 +19,7 @@ module MultipleSelectionToolboxHelper
method: :delete,
data: {
path: delete_path,
- # #5206 Missing Translations
- confirm: t('actions.are_you_sure')
+ confirm: t('are_you_sure')
},
title: t("actions.#{action}")
) do
@@ -38,7 +37,7 @@ module MultipleSelectionToolboxHelper
class: 'info-msg'
)
- content_tag :div, '',
+ content_tag :div, '',
class: 'select_toolbox noselect',
id: "selected-#{collection_name}-action-box" do
links + label
diff --git a/app/helpers/referentials_helper.rb b/app/helpers/referentials_helper.rb
index 9c3852322..a01d901e6 100644
--- a/app/helpers/referentials_helper.rb
+++ b/app/helpers/referentials_helper.rb
@@ -1,13 +1,15 @@
module ReferentialsHelper
# Outputs a green check icon and the text "Oui" or a red exclamation mark
# icon and the text "Non" based on `status`
- def line_status(status)
+ def line_status(status, verbose=true)
if status
- content_tag(:span, nil, class: 'fa fa-exclamation-circle fa-lg text-danger') +
- t('activerecord.attributes.line.deactivated')
+ out = content_tag(:span, nil, class: 'fa fa-exclamation-circle fa-lg text-danger')
+ out += t('activerecord.attributes.line.deactivated') if verbose
+ out
else
- content_tag(:span, nil, class: 'fa fa-check-circle fa-lg text-success') +
- t('activerecord.attributes.line.activated')
+ out = content_tag(:span, nil, class: 'fa fa-check-circle fa-lg text-success')
+ out += t('activerecord.attributes.line.activated') if verbose
+ out
end
end
diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb
index be70d974d..16081b660 100644
--- a/app/helpers/search_helper.rb
+++ b/app/helpers/search_helper.rb
@@ -15,7 +15,7 @@ module SearchHelper
if val.is_a?(Array)
active = val.any? &:present?
elsif val.is_a?(Hash)
- active = val.values.any? &:present?
+ active = val.values.any? {|v| v.present? && v != "false" }
else
active = true
end
diff --git a/app/javascript/vehicle_journeys/components/tools/CustomFieldsInputs.js b/app/javascript/helpers/CustomFieldsInputs.js
index 827c36b76..abc8097d5 100644
--- a/app/javascript/vehicle_journeys/components/tools/CustomFieldsInputs.js
+++ b/app/javascript/helpers/CustomFieldsInputs.js
@@ -34,8 +34,21 @@ export default class CustomFieldsInputs extends Component {
ref={'custom_fields.' + cf.code}
className='form-control'
disabled={this.props.disabled}
- defaultValue={cf.value}
- onChange={(e) => this.props.onUpdate(cf.code, e.target.value) }
+ value={cf.value}
+ onChange={(e) => {this.props.onUpdate(cf.code, e.target.value); this.forceUpdate()} }
+ />
+ )
+ }
+
+ integerInput(cf){
+ return(
+ <input
+ type='number'
+ ref={'custom_fields.' + cf.code}
+ className='form-control'
+ disabled={this.props.disabled}
+ value={cf.value}
+ onChange={(e) => {this.props.onUpdate(cf.code, e.target.value); this.forceUpdate()} }
/>
)
}
diff --git a/app/javascript/journey_patterns/components/CreateModal.js b/app/javascript/journey_patterns/components/CreateModal.js
index 946c13d9c..51f6f6c1b 100644
--- a/app/javascript/journey_patterns/components/CreateModal.js
+++ b/app/javascript/journey_patterns/components/CreateModal.js
@@ -1,15 +1,17 @@
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import actions from '../actions'
+import CustomFieldsInputs from '../../helpers/CustomFieldsInputs'
export default class CreateModal extends Component {
constructor(props) {
super(props)
+ this.custom_fields = _.assign({}, this.props.custom_fields)
}
handleSubmit() {
if(actions.validateFields(this.refs) == true) {
- this.props.onAddJourneyPattern(this.refs)
+ this.props.onAddJourneyPattern(_.assign({}, this.refs, {custom_fields: this.custom_fields}))
this.props.onModalClose()
$('#NewJourneyPatternModal').modal('hide')
}
@@ -78,8 +80,14 @@ export default class CreateModal extends Component {
/>
</div>
</div>
+ <CustomFieldsInputs
+ values={this.props.custom_fields}
+ onUpdate={(code, value) => this.custom_fields[code]["value"] = value}
+ disabled={false}
+ />
</div>
</div>
+
<div className='modal-footer'>
<button
className='btn btn-link'
diff --git a/app/javascript/journey_patterns/components/EditModal.js b/app/javascript/journey_patterns/components/EditModal.js
index 1960849fb..a23a57f96 100644
--- a/app/javascript/journey_patterns/components/EditModal.js
+++ b/app/javascript/journey_patterns/components/EditModal.js
@@ -1,19 +1,27 @@
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import actions from '../actions'
+import CustomFieldsInputs from '../../helpers/CustomFieldsInputs'
export default class EditModal extends Component {
constructor(props) {
super(props)
+ this.updateValue = this.updateValue.bind(this)
}
handleSubmit() {
if(actions.validateFields(this.refs) == true) {
- this.props.saveModal(this.props.modal.modalProps.index, this.refs)
+ this.props.saveModal(this.props.modal.modalProps.index, _.assign({}, this.refs, {custom_fields: this.custom_fields}))
$('#JourneyPatternModal').modal('hide')
}
}
+ updateValue(attribute, e) {
+ actions.resetValidation(e.currentTarget)
+ this.props.modal.modalProps.journeyPattern[attribute] = e.target.value
+ this.forceUpdate()
+ }
+
renderModalTitle() {
if (this.props.editMode) {
return (
@@ -28,6 +36,9 @@ export default class EditModal extends Component {
}
render() {
+ if(this.props.modal.modalProps.journeyPattern){
+ this.custom_fields = _.assign({}, this.props.modal.modalProps.journeyPattern.custom_fields)
+ }
return (
<div className={ 'modal fade ' + ((this.props.modal.type == 'edit') ? 'in' : '') } id='JourneyPatternModal'>
<div className='modal-container'>
@@ -48,8 +59,8 @@ export default class EditModal extends Component {
className='form-control'
disabled={!this.props.editMode}
id={this.props.modal.modalProps.index}
- defaultValue={this.props.modal.modalProps.journeyPattern.name}
- onKeyDown={(e) => actions.resetValidation(e.currentTarget)}
+ value={this.props.modal.modalProps.journeyPattern.name}
+ onChange={(e) => this.updateValue('name', e)}
required
/>
</div>
@@ -64,8 +75,8 @@ export default class EditModal extends Component {
className='form-control'
disabled={!this.props.editMode}
id={this.props.modal.modalProps.index}
- defaultValue={this.props.modal.modalProps.journeyPattern.published_name}
- onKeyDown={(e) => actions.resetValidation(e.currentTarget)}
+ value={this.props.modal.modalProps.journeyPattern.published_name}
+ onChange={(e) => this.updateValue('published_name', e)}
required
/>
</div>
@@ -79,12 +90,19 @@ export default class EditModal extends Component {
className='form-control'
disabled={!this.props.editMode}
id={this.props.modal.modalProps.index}
- defaultValue={this.props.modal.modalProps.journeyPattern.registration_number}
- onKeyDown={(e) => actions.resetValidation(e.currentTarget)}
+ value={this.props.modal.modalProps.journeyPattern.registration_number}
+ onChange={(e) => this.updateValue('registration_number', e)}
/>
</div>
</div>
</div>
+ <div className='row'>
+ <CustomFieldsInputs
+ values={this.props.modal.modalProps.journeyPattern.custom_fields}
+ onUpdate={(code, value) => this.custom_fields[code]["value"] = value}
+ disabled={!this.props.editMode}
+ />
+ </div>
<div>
<label className='control-label'>{I18n.attribute_name('journey_pattern', 'checksum')}</label>
<input
@@ -92,7 +110,7 @@ export default class EditModal extends Component {
ref='checksum'
className='form-control'
disabled='disabled'
- defaultValue={this.props.modal.modalProps.journeyPattern.checksum}
+ value={this.props.modal.modalProps.journeyPattern.checksum}
/>
</div>
</div>
diff --git a/app/javascript/journey_patterns/containers/AddJourneyPattern.js b/app/javascript/journey_patterns/containers/AddJourneyPattern.js
index b093fd111..9e85afd5e 100644
--- a/app/javascript/journey_patterns/containers/AddJourneyPattern.js
+++ b/app/javascript/journey_patterns/containers/AddJourneyPattern.js
@@ -7,7 +7,8 @@ const mapStateToProps = (state) => {
modal: state.modal,
journeyPatterns: state.journeyPatterns,
editMode: state.editMode,
- status: state.status
+ status: state.status,
+ custom_fields: state.custom_fields
}
}
diff --git a/app/javascript/journey_patterns/containers/Modal.js b/app/javascript/journey_patterns/containers/Modal.js
index 33ee8583c..fc04843e4 100644
--- a/app/javascript/journey_patterns/containers/Modal.js
+++ b/app/javascript/journey_patterns/containers/Modal.js
@@ -7,7 +7,8 @@ const mapStateToProps = (state) => {
return {
editMode: state.editMode,
modal: state.modal,
- journeyPattern: state.journeyPattern
+ journeyPattern: state.journeyPattern,
+ custom_fields: state.custom_fields,
}
}
diff --git a/app/javascript/journey_patterns/reducers/index.js b/app/javascript/journey_patterns/reducers/index.js
index 2ffaf86d4..d3a1d29a2 100644
--- a/app/javascript/journey_patterns/reducers/index.js
+++ b/app/javascript/journey_patterns/reducers/index.js
@@ -12,7 +12,8 @@ const journeyPatternsApp = combineReducers({
journeyPatterns,
pagination,
stopPointsList,
- modal
+ modal,
+ custom_fields: (state = [], action) => state
})
export default journeyPatternsApp
diff --git a/app/javascript/journey_patterns/reducers/journeyPatterns.js b/app/javascript/journey_patterns/reducers/journeyPatterns.js
index b046f2b38..1a6a27da6 100644
--- a/app/javascript/journey_patterns/reducers/journeyPatterns.js
+++ b/app/javascript/journey_patterns/reducers/journeyPatterns.js
@@ -103,7 +103,8 @@ export default function journeyPatterns (state = [], action) {
return _.assign({}, j, {
name: action.data.name.value,
published_name: action.data.published_name.value,
- registration_number: action.data.registration_number.value
+ registration_number: action.data.registration_number.value,
+ custom_fields: action.data.custom_fields,
})
} else {
return j
diff --git a/app/javascript/packs/journey_patterns/index.js b/app/javascript/packs/journey_patterns/index.js
index 075eea13a..bd7df2634 100644
--- a/app/javascript/packs/journey_patterns/index.js
+++ b/app/javascript/packs/journey_patterns/index.js
@@ -34,7 +34,8 @@ var initialState = {
type: '',
modalProps: {},
confirmModal: {}
- }
+ },
+ custom_fields: window.custom_fields
}
// const loggerMiddleware = createLogger()
diff --git a/app/javascript/time_tables/components/Metas.js b/app/javascript/time_tables/components/Metas.js
index d9746a379..186af540a 100644
--- a/app/javascript/time_tables/components/Metas.js
+++ b/app/javascript/time_tables/components/Metas.js
@@ -76,7 +76,6 @@ export default function Metas({metas, onUpdateDayTypes, onUpdateComment, onUpdat
<label htmlFor="" className="control-label col-sm-4">{I18n.attribute_name('time_table', 'tag_list')}</label>
<div className="col-sm-8">
<TagsSelect2
- initialTags={metas.initial_tags}
tags={metas.tags}
onSelect2Tags={(e) => onSelect2Tags(e)}
onUnselect2Tags={(e) => onUnselect2Tags(e)}
diff --git a/app/javascript/time_tables/components/TagsSelect2.js b/app/javascript/time_tables/components/TagsSelect2.js
index dd8d6e9c0..fe610ed58 100644
--- a/app/javascript/time_tables/components/TagsSelect2.js
+++ b/app/javascript/time_tables/components/TagsSelect2.js
@@ -27,7 +27,7 @@ export default class TagsSelect2 extends Component {
return (
<Select2
value={(this.props.tags.length) ? map(this.props.tags, 'id') : undefined}
- data={(this.props.initialTags.length) ? this.mapKeys(this.props.initialTags) : undefined}
+ data={(this.props.tags.length) ? this.mapKeys(this.props.tags) : undefined}
onSelect={(e) => this.props.onSelect2Tags(e)}
onUnselect={(e) => setTimeout( () => this.props.onUnselect2Tags(e, 150))}
multiple={true}
@@ -74,4 +74,4 @@ export default class TagsSelect2 extends Component {
const formatRepo = (props) => {
if(props.name) return props.name
-} \ No newline at end of file
+}
diff --git a/app/javascript/time_tables/containers/Metas.js b/app/javascript/time_tables/containers/Metas.js
index ebccf556e..7bc3ef4e1 100644
--- a/app/javascript/time_tables/containers/Metas.js
+++ b/app/javascript/time_tables/containers/Metas.js
@@ -24,6 +24,7 @@ const mapDispatchToProps = (dispatch) => {
},
onSelect2Tags: (e) => {
e.preventDefault()
+ $(e.target).find('[data-select2-tag]').remove()
dispatch(actions.select2Tags(e.params.data))
},
onUnselect2Tags: (e) => {
diff --git a/app/javascript/time_tables/reducers/metas.js b/app/javascript/time_tables/reducers/metas.js
index 51e1ec149..012f29511 100644
--- a/app/javascript/time_tables/reducers/metas.js
+++ b/app/javascript/time_tables/reducers/metas.js
@@ -31,11 +31,13 @@ export default function metas(state = {}, action) {
return assign({}, state, {color: action.color})
case 'UPDATE_SELECT_TAG':
let tags = [...state.tags]
- tags.push(action.selectedItem)
+ if(tags.length == 0 || tags[tags.length-1].name != action.selectedItem.name){
+ tags.push(action.selectedItem)
+ }
return assign({}, state, {tags: tags})
case 'UPDATE_UNSELECT_TAG':
return assign({}, state, {tags: filter(state.tags, (t) => (t.id != action.selectedItem.id))})
default:
return state
}
-} \ No newline at end of file
+}
diff --git a/app/javascript/vehicle_journeys/components/VehicleJourneys.js b/app/javascript/vehicle_journeys/components/VehicleJourneys.js
index c6f59ce9d..e4f5ad11c 100644
--- a/app/javascript/vehicle_journeys/components/VehicleJourneys.js
+++ b/app/javascript/vehicle_journeys/components/VehicleJourneys.js
@@ -87,16 +87,18 @@ export default class VehicleJourneys extends Component {
}
toggleTimetables(e) {
- $('.table-2entries .detailed-timetables').toggleClass('hidden')
- $('.table-2entries .detailed-timetables-bt').toggleClass('active')
+ let root = $(this.refs['vehicleJourneys'])
+ root.find('.table-2entries .detailed-timetables').toggleClass('hidden')
+ root.find('.table-2entries .detailed-timetables-bt').toggleClass('active')
this.componentDidUpdate()
e.preventDefault()
false
}
togglePurchaseWindows(e) {
- $('.table-2entries .detailed-purchase-windows').toggleClass('hidden')
- $('.table-2entries .detailed-purchase-windows-bt').toggleClass('active')
+ let root = $(this.refs['vehicleJourneys'])
+ root.find('.table-2entries .detailed-purchase-windows').toggleClass('hidden')
+ root.find('.table-2entries .detailed-purchase-windows-bt').toggleClass('active')
this.componentDidUpdate()
e.preventDefault()
false
@@ -186,7 +188,7 @@ export default class VehicleJourneys extends Component {
)
} else {
return (
- <div className='row'>
+ <div className='row' ref='vehicleJourneys'>
<div className='col-lg-12'>
{(this.props.status.fetchSuccess == false) && (
<div className='alert alert-danger mt-sm'>
diff --git a/app/javascript/vehicle_journeys/components/tools/CreateModal.js b/app/javascript/vehicle_journeys/components/tools/CreateModal.js
index f49b51f08..1d470cd43 100644
--- a/app/javascript/vehicle_journeys/components/tools/CreateModal.js
+++ b/app/javascript/vehicle_journeys/components/tools/CreateModal.js
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types'
import actions from '../../actions'
import MissionSelect2 from './select2s/MissionSelect2'
import CompanySelect2 from './select2s/CompanySelect2'
-import CustomFieldsInputs from './CustomFieldsInputs'
+import CustomFieldsInputs from '../../../helpers/CustomFieldsInputs'
export default class CreateModal extends Component {
constructor(props) {
diff --git a/app/javascript/vehicle_journeys/components/tools/EditVehicleJourney.js b/app/javascript/vehicle_journeys/components/tools/EditVehicleJourney.js
index e4e266c79..60d982845 100644
--- a/app/javascript/vehicle_journeys/components/tools/EditVehicleJourney.js
+++ b/app/javascript/vehicle_journeys/components/tools/EditVehicleJourney.js
@@ -2,7 +2,7 @@ import React, { Component } from 'react'
import PropTypes from 'prop-types'
import actions from '../../actions'
import CompanySelect2 from './select2s/CompanySelect2'
-import CustomFieldsInputs from './CustomFieldsInputs'
+import CustomFieldsInputs from '../../../helpers/CustomFieldsInputs'
export default class EditVehicleJourney extends Component {
constructor(props) {
diff --git a/app/models/chouette/journey_pattern.rb b/app/models/chouette/journey_pattern.rb
index 830a6a808..5b5015107 100644
--- a/app/models/chouette/journey_pattern.rb
+++ b/app/models/chouette/journey_pattern.rb
@@ -2,6 +2,7 @@ module Chouette
class JourneyPattern < Chouette::TridentActiveRecord
has_metadata
include ChecksumSupport
+ include CustomFieldsSupport
include JourneyPatternRestrictions
include ObjectidSupport
@@ -52,12 +53,19 @@ module Chouette
end
def self.state_permited_attributes item
- {
+ attrs = {
name: item['name'],
published_name: item['published_name'],
registration_number: item['registration_number'],
costs: item['costs']
}
+ attrs["custom_field_values"] = Hash[
+ *(item["custom_fields"] || {})
+ .map { |k, v| [k, v["value"]] }
+ .flatten
+ ]
+
+ attrs
end
def self.state_create_instance route, item
diff --git a/app/models/chouette/purchase_window.rb b/app/models/chouette/purchase_window.rb
index e10b106ec..d22674637 100644
--- a/app/models/chouette/purchase_window.rb
+++ b/app/models/chouette/purchase_window.rb
@@ -46,8 +46,9 @@ module Chouette
]
end
- # def checksum_attributes
- # end
-
+ def color
+ _color = read_attribute(:color)
+ _color.present? ? _color : nil
+ end
end
end
diff --git a/app/models/chouette/route.rb b/app/models/chouette/route.rb
index 14bfa47b6..c5e909d7e 100644
--- a/app/models/chouette/route.rb
+++ b/app/models/chouette/route.rb
@@ -7,11 +7,12 @@ module Chouette
include ObjectidSupport
extend Enumerize
- if Rails.env.development?
+ if ENV["CHOUETTE_ROUTE_POSITION_CHECK"] == "true" || !Rails.env.production?
after_commit do
positions = stop_points.pluck(:position)
+ Rails.logger.debug "Check positions in Route #{id} : #{positions.inspect}"
if positions.size != positions.uniq.size
- raise "DUPLICATED stop_points positions: #{positions}"
+ raise "DUPLICATED stop_points positions in Route #{id} : #{positions.inspect}"
end
end
end
@@ -77,7 +78,9 @@ module Chouette
validates_presence_of :published_name
validates_presence_of :line
validates :wayback, inclusion: { in: self.wayback.values }
- after_save :calculate_costs!, if: ->() { TomTom.enabled? }
+ after_commit :calculate_costs!,
+ on: [:create, :update],
+ if: ->() { TomTom.enabled? }
def duplicate opposite=false
overrides = {
diff --git a/app/models/chouette/stop_area.rb b/app/models/chouette/stop_area.rb
index 4ddc7403b..b933e1944 100644
--- a/app/models/chouette/stop_area.rb
+++ b/app/models/chouette/stop_area.rb
@@ -436,6 +436,12 @@ module Chouette
ActiveSupport::TimeZone[time_zone]&.utc_offset
end
+ def full_time_zone_name
+ return unless time_zone.present?
+ return unless ActiveSupport::TimeZone[time_zone].present?
+ ActiveSupport::TimeZone[time_zone].tzinfo.name
+ end
+
def country
return unless country_code
country = ISO3166::Country[country_code]
diff --git a/app/models/chouette/time_table.rb b/app/models/chouette/time_table.rb
index b59c95665..29e3808e7 100644
--- a/app/models/chouette/time_table.rb
+++ b/app/models/chouette/time_table.rb
@@ -16,7 +16,7 @@ module Chouette
end
ransacker :unaccented_comment, formatter: ->(val){ val.parameterize } do
- Arel.sql('unaccent(comment)')
+ Arel.sql('unaccent(time_tables.comment)')
end
has_and_belongs_to_many :vehicle_journeys, :class_name => 'Chouette::VehicleJourney'
@@ -81,6 +81,11 @@ module Chouette
chunk.values.delete_if {|dates| dates.count < 2}
end
+ def color
+ _color = read_attribute(:color)
+ _color.present? ? _color : nil
+ end
+
def convert_continuous_dates_to_periods
chunks = self.continuous_dates
diff --git a/app/models/custom_field.rb b/app/models/custom_field.rb
index 22118a15a..65eabb205 100644
--- a/app/models/custom_field.rb
+++ b/app/models/custom_field.rb
@@ -7,10 +7,6 @@ class CustomField < ApplicationModel
validates :name, uniqueness: {scope: [:resource_type, :workgroup_id]}
validates :code, uniqueness: {scope: [:resource_type, :workgroup_id], case_sensitive: false}, presence: true
- scope :for_workgroup, ->(workgroup){ where workgroup_id: workgroup.id }
-
- scope :for_workgroup, ->(workgroup){ where workgroup_id: workgroup.id }
-
class Collection < HashWithIndifferentAccess
def initialize object, workgroup=:all
vals = object.class.custom_fields(workgroup).map do |v|
diff --git a/app/models/import/gtfs.rb b/app/models/import/gtfs.rb
index 70f448132..a20c468c1 100644
--- a/app/models/import/gtfs.rb
+++ b/app/models/import/gtfs.rb
@@ -56,12 +56,16 @@ class Import::Gtfs < Import::Base
attr_accessor :download_host
def download_host
- @download_host ||= Rails.application.config.rails_host.gsub("http://","")
+ @download_host ||= Rails.application.config.rails_host
end
def local_temp_directory
- Rails.application.config.try(:import_temporary_directory) ||
- Rails.root.join('tmp', 'imports')
+ @local_temp_directory ||=
+ begin
+ directory = Rails.application.config.try(:import_temporary_directory) || Rails.root.join('tmp', 'imports')
+ FileUtils.mkdir_p directory
+ directory
+ end
end
def local_temp_file(&block)
@@ -75,11 +79,20 @@ class Import::Gtfs < Import::Base
Rails.application.routes.url_helpers.download_workbench_import_path(workbench, id, token: token_download)
end
+ def download_uri
+ @download_uri ||=
+ begin
+ host = download_host
+ host = "http://#{host}" unless host =~ %r{https?://}
+ URI.join(host, download_path)
+ end
+ end
+
def download_local_file
local_temp_file do |file|
begin
- Net::HTTP.start(download_host) do |http|
- http.request_get(download_path) do |response|
+ Net::HTTP.start(download_uri.host, download_uri.port) do |http|
+ http.request_get(download_uri.request_uri) do |response|
response.read_body do |segment|
file.write segment
end
diff --git a/app/models/merge.rb b/app/models/merge.rb
index 6e2a7036a..8d661f209 100644
--- a/app/models/merge.rb
+++ b/app/models/merge.rb
@@ -50,7 +50,7 @@ class Merge < ApplicationModel
new =
if workbench.output.current
Rails.logger.debug "Clone current output"
- Referential.new_from(workbench.output.current, fixme_functional_scope).tap do |clone|
+ Referential.new_from(workbench.output.current, workbench.organisation).tap do |clone|
clone.inline_clone = true
end
else
@@ -371,7 +371,7 @@ class Merge < ApplicationModel
def save_current
output.update current: new, new: nil
- output.current.update referential_suite: output
+ output.current.update referential_suite: output, ready: true
referentials.update_all merged_at: created_at, archived_at: created_at
end
diff --git a/app/policies/merge_policy.rb b/app/policies/merge_policy.rb
index 82eb72e08..154dc63f5 100644
--- a/app/policies/merge_policy.rb
+++ b/app/policies/merge_policy.rb
@@ -8,8 +8,4 @@ class MergePolicy < ApplicationPolicy
def create?
user.has_permission?('merges.create')
end
-
- def update?
- user.has_permission?('merges.update')
- end
end
diff --git a/app/views/api/v1/journey_patterns/show.rabl b/app/views/api/v1/journey_patterns/show.rabl
index aac66b6f3..d02781cfa 100644
--- a/app/views/api/v1/journey_patterns/show.rabl
+++ b/app/views/api/v1/journey_patterns/show.rabl
@@ -1,7 +1,7 @@
object @journey_pattern
extends "api/v1/trident_objects/show"
-[:id, :name, :published_name, :registration_number, :comment, :checksum].each do |attr|
+[:id, :name, :published_name, :registration_number, :comment, :checksum, :custom_fields].each do |attr|
attributes attr, :unless => lambda { |m| m.send( attr).nil?}
end
diff --git a/app/views/journey_patterns_collections/show.html.slim b/app/views/journey_patterns_collections/show.html.slim
index b389a1da7..38c7f1b1b 100644
--- a/app/views/journey_patterns_collections/show.html.slim
+++ b/app/views/journey_patterns_collections/show.html.slim
@@ -20,5 +20,6 @@
| window.perms = #{raw @perms};
| window.features = #{raw @features};
| window.routeCostsUrl = "#{costs_referential_line_route_url(@referential, @route.line, @route, format: :json).html_safe}";
-
+ | window.custom_fields = #{(@custom_fields.to_json).html_safe};
+
= javascript_pack_tag 'journey_patterns/index.js'
diff --git a/app/views/lines/show.html.slim b/app/views/lines/show.html.slim
index 9e1ae6d6f..b683b9be6 100644
--- a/app/views/lines/show.html.slim
+++ b/app/views/lines/show.html.slim
@@ -7,13 +7,13 @@
.col-lg-6.col-md-6.col-sm-12.col-xs-12
= definition_list t('metadatas'),
{ t('objectid') => @line.get_objectid.short_id,
- @line.human_attribute_name(:deactivated) => (@line.deactivated? ? t('false') : t('true')),
- @line.human_attribute_name(:network_id) => (@line.network.nil? ? t('lines.index.unset') : @line.network.name),
- @line.human_attribute_name(:company_id) => (@line.company.nil? ? t('lines.index.unset') : @line.company.name),
- @line.human_attribute_name(:secondary_companies) => (@line.secondary_companies.nil? ? t('lines.index.unset') : array_to_html_list(@line.secondary_companies.collect(&:name))),
- @line.human_attribute_name(:number) => @line.number,
- @line.human_attribute_name(:registration_number) => (@line.registration_number ? @line.registration_number : '-'),
- @line.human_attribute_name(:transport_mode) => (@line.transport_mode.present? ? t("enumerize.transport_mode.#{@line.transport_mode}") : '-'),
- @line.human_attribute_name(:transport_submode) => (@line.transport_submode.present? ? t("enumerize.transport_submode.#{@line.transport_submode}") : '-'),
- @line.human_attribute_name(:url) => (@line.url ? @line.url : '-'),
- @line.human_attribute_name(:seasonal) => (@line.seasonal? ? t('true') : t('false')),}
+ Chouette::Line.tmf(:state) => line_status(@line.deactivated),
+ Chouette::Line.tmf(:network_id) => (@line.network.nil? ? t('lines.index.unset') : @line.network.name),
+ Chouette::Line.tmf(:company_id) => (@line.company.nil? ? t('lines.index.unset') : @line.company.name),
+ Chouette::Line.tmf(:secondary_companies) => (@line.secondary_companies.nil? ? t('lines.index.unset') : array_to_html_list(@line.secondary_companies.collect(&:name))),
+ Chouette::Line.tmf(:number) => @line.number,
+ Chouette::Line.tmf(:registration_number) => (@line.registration_number ? @line.registration_number : '-'),
+ Chouette::Line.tmf(:transport_mode) => (@line.transport_mode.present? ? t("enumerize.transport_mode.#{@line.transport_mode}") : '-'),
+ Chouette::Line.tmf(:transport_submode) => (@line.transport_submode.present? ? t("enumerize.transport_submode.#{@line.transport_submode}") : '-'),
+ Chouette::Line.tmf(:url) => (@line.url ? @line.url : '-'),
+ Chouette::Line.tmf(:seasonal) => (@line.seasonal? ? t('true') : t('false')),}
diff --git a/app/views/referential_lines/show.html.slim b/app/views/referential_lines/show.html.slim
index 91868a002..4804da527 100644
--- a/app/views/referential_lines/show.html.slim
+++ b/app/views/referential_lines/show.html.slim
@@ -7,10 +7,10 @@
.col-lg-6.col-md-6.col-sm-12.col-xs-12
= definition_list t('metadatas'),
{ t('id_codif') => @line.get_objectid.short_id,
- Chouette::Line.tmf('activated') => (@line.deactivated? ? t('false') : t('true')),
+ Chouette::Line.tmf('state') => line_status(@line.deactivated),
Chouette::Line.tmf('network_id') => (@line.network.nil? ? t('lines.index.unset') : link_to(@line.network.name, [@referential, @line.network]) ),
Chouette::Line.tmf('company') => (@line.company.nil? ? t('lines.index.unset') : link_to(@line.company.name, [@referential, @line.company]) ),
- Chouette::Line.tmf('secondary_company') => (@line.secondary_companies.nil? ? t('lines.index.unset') : @line.secondary_companies.collect(&:name).join(', ')),
+ Chouette::Line.tmf('secondary_companies') => (@line.secondary_companies.nil? ? t('lines.index.unset') : @line.secondary_companies.collect(&:name).join(', ')),
Chouette::Line.tmf('registration_number') => @line.number,
Chouette::Line.tmf('published_name') => (@line.registration_number ? @line.registration_number : '-'),
Chouette::Line.tmf('transport_mode') => (@line.transport_mode.present? ? t("enumerize.transport_mode.#{@line.transport_mode}") : '-'),
diff --git a/app/views/referentials/_period_fields.html.slim b/app/views/referentials/_period_fields.html.slim
index 4d2372f7b..b0038c6b3 100644
--- a/app/views/referentials/_period_fields.html.slim
+++ b/app/views/referentials/_period_fields.html.slim
@@ -8,8 +8,8 @@
.wrapper
div
- = f.input :begin, as: :date, label: false, wrapper_html: { class: 'date smart_date' }
+ = f.input :begin, as: :date, label: false, start_year: Date.today.year - 15, end_year: Date.today.year + 15, wrapper_html: { class: 'date smart_date' }
div
- = f.input :end, as: :date, label: false, wrapper_html: { class: 'date smart_date' }
+ = f.input :end, as: :date, label: false, start_year: Date.today.year - 15, end_year: Date.today.year + 15, wrapper_html: { class: 'date smart_date' }
div
= link_to_remove_association '', f, class: 'fa fa-trash', data: { confirm: t('are_you_sure')}, title: t('actions.delete')
diff --git a/app/workers/route_way_cost_worker.rb b/app/workers/route_way_cost_worker.rb
index d6bfed592..b62416c3d 100644
--- a/app/workers/route_way_cost_worker.rb
+++ b/app/workers/route_way_cost_worker.rb
@@ -7,10 +7,11 @@ class RouteWayCostWorker
# Prevent recursive worker spawning since this call updates the
# `costs` field of the route.
- Chouette::Route.skip_callback(:save, :after, :calculate_costs!)
-
- RouteWayCostCalculator.new(route).calculate!
-
- Chouette::Route.set_callback(:save, :after, :calculate_costs!)
+ begin
+ Chouette::Route.skip_callback(:commit, :after, :calculate_costs!)
+ RouteWayCostCalculator.new(route).calculate!
+ ensure
+ Chouette::Route.set_callback(:commit, :after, :calculate_costs!)
+ end
end
end