diff options
| -rw-r--r-- | app/controllers/compliance_check_messages_controller.rb | 34 | ||||
| -rw-r--r-- | app/controllers/import_messages_controller.rb | 2 | ||||
| -rw-r--r-- | app/helpers/compliance_check_resources_helper.rb | 12 | ||||
| -rw-r--r-- | app/javascript/helpers/save_button.js | 47 | ||||
| -rw-r--r-- | app/javascript/journey_patterns/components/SaveJourneyPattern.js | 38 | ||||
| -rw-r--r-- | app/javascript/vehicle_journeys/components/SaveVehicleJourneys.js | 38 | ||||
| -rw-r--r-- | app/models/compliance_check_message_export.rb | 46 | ||||
| -rw-r--r-- | app/models/import_message_export.rb | 4 | ||||
| -rw-r--r-- | app/views/compliance_check_sets/show.html.slim | 10 | ||||
| -rw-r--r-- | config/routes.rb | 1 | ||||
| -rw-r--r-- | db/schema.rb | 8 | ||||
| -rw-r--r-- | package.json | 2 | ||||
| -rw-r--r-- | spec/javascript/time_table/reducers/timetable_spec.js | 3 | ||||
| -rw-r--r-- | spec/javascript/vehicle_journeys/components/CustomFieldsInputs_spec.js | 1 | ||||
| -rw-r--r-- | yarn.lock | 4 | 
15 files changed, 184 insertions, 66 deletions
| diff --git a/app/controllers/compliance_check_messages_controller.rb b/app/controllers/compliance_check_messages_controller.rb new file mode 100644 index 000000000..1e4fff6e5 --- /dev/null +++ b/app/controllers/compliance_check_messages_controller.rb @@ -0,0 +1,34 @@ +class ComplianceCheckMessagesController < ChouetteController +  defaults resource_class: ComplianceCheckMessage, collection_name: 'compliance_check_messages', instance_name: 'compliance_check_message' +  respond_to :csv +  belongs_to :compliance_check_set, :parent_class => ComplianceCheckSet + + +  def index +    index! do |format| +      format.csv { +        send_data ComplianceCheckMessageExport.new(compliance_check_messages: collection).to_csv(:col_sep => "\;", :quote_char=>'"', force_quotes: true) , :filename => "compliance_check_set_errors_#{line_code}_#{Time.now.to_i}.csv" +      } +    end +  end + +  protected +  def collection +    parent.compliance_check_messages.where(compliance_check_resource_id: params[:compliance_check_resource_id]) +  end + +  def parent +    @compliance_check_set ||= ComplianceCheckSet.find(params[:compliance_check_set_id]) +  end + +  def compliance_check_resource +    ComplianceCheckResource.find(params[:compliance_check_resource_id])  +  end + +  private  + +  def line_code +    Chouette::Line.find_by_objectid("#{compliance_check_resource.reference}").get_objectid.local_id +  end + +end diff --git a/app/controllers/import_messages_controller.rb b/app/controllers/import_messages_controller.rb index 6546b25f8..286bb0ce8 100644 --- a/app/controllers/import_messages_controller.rb +++ b/app/controllers/import_messages_controller.rb @@ -9,7 +9,7 @@ class ImportMessagesController < ChouetteController    def index      index! do |format|        format.csv { -        send_data ImportMessageExport.new(:import_messages => @import_messages).to_csv(:col_sep => ";") , :filename => "#{File.basename(@import_resource.name)}_#{Time.now.to_i}.csv" +        send_data ImportMessageExport.new(:import_messages => @import_messages).to_csv(:col_sep => "\;", :quote_char=>'"', force_quotes: true) , :filename => "import_errors_#{@import_resource.name.gsub('.xml', '')}_#{Time.now.to_i}.csv"        }      end    end diff --git a/app/helpers/compliance_check_resources_helper.rb b/app/helpers/compliance_check_resources_helper.rb new file mode 100644 index 000000000..95cabed88 --- /dev/null +++ b/app/helpers/compliance_check_resources_helper.rb @@ -0,0 +1,12 @@ +module ComplianceCheckResourcesHelper + +    # Comlpiance Check Resources statuses helper +  def compliance_check_resource_status(status) +      cls = '' +      cls = 'success' if status == 'OK' +      cls = 'warning' if status == 'WARNING' +      cls = 'danger' if %w[ERROR IGNORED].include? status + +      content_tag :span, '', class: "fa fa-circle text-#{cls}" +  end +end diff --git a/app/javascript/helpers/save_button.js b/app/javascript/helpers/save_button.js new file mode 100644 index 000000000..7e0bd5bbe --- /dev/null +++ b/app/javascript/helpers/save_button.js @@ -0,0 +1,47 @@ +import React, { PropTypes, Component } from 'react' + +export default class SaveButton extends Component{ +  constructor(props){ +    super(props) +  } + +  btnDisabled(){ +    return !this.props.status.fetchSuccess || this.props.status.isFetching +  } + +  btnClass(){ +    let className = ['btn btn-default'] +    if(this.btnDisabled()){ +      className.push('disabled') +    } +    return className.join(' ') +  } + +  render() { +    if (!this.hasPolicy()) { +      return false +    }else{ +      return ( +        <div className='row mt-md'> +          <div className='col-lg-12 text-right'> +            <form className={this.formClassName() + ' formSubmitr ml-xs'} onSubmit={e => {e.preventDefault()}}> +              <div className="btn-group sticky-actions"> +                <button +                  className={this.btnClass()} +                  type='button' +                  disabled={this.btnDisabled()} +                  onClick={e => { +                    e.preventDefault() +                    this.props.editMode ? this.submitForm() : this.props.onEnterEditMode() +                  }} +                > +                  {this.props.editMode ? "Valider" : "Editer"} +                </button> +              </div> +            </form> +          </div> +        </div> +      ) +    } +  } +} diff --git a/app/javascript/journey_patterns/components/SaveJourneyPattern.js b/app/javascript/journey_patterns/components/SaveJourneyPattern.js index 7e4492e0e..4bb6a73a0 100644 --- a/app/javascript/journey_patterns/components/SaveJourneyPattern.js +++ b/app/javascript/journey_patterns/components/SaveJourneyPattern.js @@ -1,35 +1,19 @@  import React, { Component } from 'react'  import PropTypes from 'prop-types' +import SaveButton from '../../helpers/save_button'  import actions from '../actions' -export default class SaveJourneyPattern extends Component { -  constructor(props){ -    super(props) +export default class SaveJourneyPattern extends SaveButton { +  hasPolicy(){ +    return this.props.status.policy['journey_patterns.update'] == true    } -  render() { -    if(this.props.status.policy['journey_patterns.update'] == false) { -      return false -    }else{ -      return ( -        <div className='row mt-md'> -          <div className='col-lg-12 text-right'> -            <form className='jp_collection formSubmitr ml-xs' onSubmit={e => {e.preventDefault()}}> -              <button -                className='btn btn-default' -                type='button' -                onClick={e => { -                  e.preventDefault() -                  this.props.editMode ? this.props.onSubmitJourneyPattern(this.props.dispatch, this.props.journeyPatterns) : this.props.onEnterEditMode() -                }} -                > -                {this.props.editMode ? "Valider" : "Editer"} -              </button> -            </form> -          </div> -        </div> -      ) -    } +  formClassName(){ +    return 'jp_collection' +  } + +  submitForm(){ +    this.props.onSubmitJourneyPattern(this.props.dispatch, this.props.journeyPatterns)    }  } @@ -37,4 +21,4 @@ SaveJourneyPattern.propTypes = {    journeyPatterns: PropTypes.array.isRequired,    status: PropTypes.object.isRequired,    page: PropTypes.number.isRequired -}
\ No newline at end of file +} diff --git a/app/javascript/vehicle_journeys/components/SaveVehicleJourneys.js b/app/javascript/vehicle_journeys/components/SaveVehicleJourneys.js index c5161b917..6e94b04a3 100644 --- a/app/javascript/vehicle_journeys/components/SaveVehicleJourneys.js +++ b/app/javascript/vehicle_journeys/components/SaveVehicleJourneys.js @@ -1,37 +1,19 @@  import React, { Component } from 'react'  import PropTypes from 'prop-types' +import SaveButton from '../../helpers/save_button'  import actions from '../actions' -export default class SaveVehicleJourneys extends Component{ -  constructor(props){ -    super(props) +export default class SaveVehicleJourneys extends SaveButton{ +  hasPolicy(){ +    return this.props.filters.policy['vehicle_journeys.update'] == true    } -  render() { -    if (this.props.filters.policy['vehicle_journeys.update'] == false) { -      return false -    }else{ -      return ( -        <div className='row mt-md'> -          <div className='col-lg-12 text-right'> -            <form className='vehicle_journeys formSubmitr ml-xs' onSubmit={e => {e.preventDefault()}}> -              <div className="btn-group sticky-actions"> -                <button -                  className={'btn btn-default' + (this.props.status.fetchSuccess ? '' : ' disabled')} -                  type='button' -                  onClick={e => { -                    e.preventDefault() -                    this.props.editMode ? this.props.onSubmitVehicleJourneys(this.props.dispatch, this.props.vehicleJourneys) : this.props.onEnterEditMode() -                  }} -                > -                  {this.props.editMode ? "Valider" : "Editer"} -                </button> -              </div> -            </form> -          </div> -        </div> -      ) -    } +  formClassName(){ +    return 'vehicle_journeys' +  } + +  submitForm(){ +    this.props.onSubmitVehicleJourneys(this.props.dispatch, this.props.vehicleJourneys)    }  } diff --git a/app/models/compliance_check_message_export.rb b/app/models/compliance_check_message_export.rb new file mode 100644 index 000000000..b3e3f80cf --- /dev/null +++ b/app/models/compliance_check_message_export.rb @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +require "csv" +require "zip" + +class ComplianceCheckMessageExport +  include ActiveModel::Validations +  include ActiveModel::Conversion +  extend  ActiveModel::Naming + +  attr_accessor :compliance_check_messages + +  def initialize(attributes = {}) +    attributes.each { |name, value| send("#{name}=", value) } +  end + +  def persisted? +    false +  end + +  def label(name) +    I18n.t "vehicle_journey_exports.label.#{name}" +  end + +  def column_names +    ["criticity", "message key", "message", "resource objectid"] +  end + +  def to_csv(options = {}) +    CSV.generate(options) do |csv| +      csv << column_names +      compliance_check_messages.each do |compliance_check_message| +        csv << [compliance_check_message.compliance_check.criticity, compliance_check_message.message_attributes[:test_id], I18n.t("compliance_check_messages.#{compliance_check_message.message_key}", compliance_check_message.message_attributes.deep_symbolize_keys), compliance_check_message.resource_attributes[:objectid] ] +      end +    end +  end + +  def to_zip(temp_file,options = {}) +    ::Zip::OutputStream.open(temp_file) { |zos| } +    ::Zip::File.open(temp_file.path, ::Zip::File::CREATE) do |zipfile| +      zipfile.get_output_stream(label("vj_filename")+route.id.to_s+".csv") { |f| f.puts to_csv(options) } +      zipfile.get_output_stream(label("tt_filename")+".csv") { |f| f.puts time_tables_to_csv(options) } +      zipfile.get_output_stream(label("ftn_filename")+".csv") { |f| f.puts footnotes_to_csv(options) } +    end +  end + +end diff --git a/app/models/import_message_export.rb b/app/models/import_message_export.rb index 88d0f27e2..eeb6ebb18 100644 --- a/app/models/import_message_export.rb +++ b/app/models/import_message_export.rb @@ -22,14 +22,14 @@ class ImportMessageExport    end    def column_names -    ["criticity", "message key", "message"] +    ["criticity", "message key", "message", "file name", "line", "column"]    end    def to_csv(options = {})      CSV.generate(options) do |csv|        csv << column_names        import_messages.each do |import_message| -        csv << [import_message.criticity, import_message.message_key, I18n.t("import_messages.compliance_check_messages.#{import_message.message_key}", import_message.message_attributes.deep_symbolize_keys) ] +        csv << [import_message.criticity, import_message.message_key, I18n.t("import_messages.compliance_check_messages.#{import_message.message_key}", import_message.message_attributes.deep_symbolize_keys), *import_message.resource_attributes.values_at("filename", "line_number", "column_number")  ]        end      end    end diff --git a/app/views/compliance_check_sets/show.html.slim b/app/views/compliance_check_sets/show.html.slim index 5d8e3fa15..35a60eb52 100644 --- a/app/views/compliance_check_sets/show.html.slim +++ b/app/views/compliance_check_sets/show.html.slim @@ -46,11 +46,19 @@              ), \              TableBuilderHelper::Column.new( \                key: :status, \ -              attribute: Proc.new { |n| compliance_check_set_status(n.status) } \ +              attribute: Proc.new { |n| compliance_check_resource_status(n.status) } \              ), \              TableBuilderHelper::Column.new( \                key: :metrics, \                attribute: Proc.new { |n| I18n.t('compliance_check_sets.show.metrics', n.metrics.deep_symbolize_keys) } \ +            ), \ +            TableBuilderHelper::Column.new( \ +              name: 'Téléchargement' , \ +              attribute: Proc.new { |n| '<i class="fa fa-download" aria-hidden="true"></i>'.html_safe }, \ +              sortable: false, \ +              link_to: lambda do |compliance_check_resource| \ +                workbench_compliance_check_set_compliance_check_messages_path(@compliance_check_set.workbench, @compliance_check_set, format: 'csv', compliance_check_resource_id: compliance_check_resource.id  ) \ +              end \              ) \            ],            sortable: false, \ diff --git a/config/routes.rb b/config/routes.rb index 8b5faff03..0f60733af 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -14,6 +14,7 @@ ChouetteIhm::Application.routes.draw do      resources :compliance_check_sets, only: [:index, :show] do        get :executed, on: :member        resources :compliance_checks, only: [:show] +      resources :compliance_check_messages, only: [:index]      end      resource :output, controller: :workbench_outputs diff --git a/db/schema.rb b/db/schema.rb index f2cf6b4b6..0f5d796c5 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -416,9 +416,9 @@ ActiveRecord::Schema.define(version: 20180111200406) do      t.string   "type"      t.integer  "parent_id",             limit: 8      t.string   "parent_type" -    t.datetime "notified_parent_at"      t.integer  "current_step",                    default: 0      t.integer  "total_steps",                     default: 0 +    t.datetime "notified_parent_at"      t.string   "creator"    end @@ -956,7 +956,7 @@ ActiveRecord::Schema.define(version: 20180111200406) do      t.integer  "route_id",                        limit: 8      t.integer  "journey_pattern_id",              limit: 8      t.integer  "company_id",                      limit: 8 -    t.string   "objectid",                                              null: false +    t.string   "objectid",                                               null: false      t.integer  "object_version",                  limit: 8      t.string   "comment"      t.string   "status_value" @@ -968,13 +968,13 @@ ActiveRecord::Schema.define(version: 20180111200406) do      t.integer  "number",                          limit: 8      t.boolean  "mobility_restricted_suitability"      t.boolean  "flexible_service" -    t.integer  "journey_category",                          default: 0, null: false +    t.integer  "journey_category",                          default: 0,  null: false      t.datetime "created_at"      t.datetime "updated_at"      t.string   "checksum"      t.text     "checksum_source"      t.string   "data_source_ref" -    t.jsonb    "custom_field_values" +    t.jsonb    "custom_field_values",                       default: {}    end    add_index "vehicle_journeys", ["objectid"], name: "vehicle_journeys_objectid_key", unique: true, using: :btree diff --git a/package.json b/package.json index 01625839c..80ca22f83 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@      "grunt-watch-change": "^0.1.1",      "jest": "22.0.4",      "jest-context": "^2.1.0", +    "jest-environment-jsdom-global": "^1.0.2",      "jest-set": "^2.0.0",      "react-addons-test-utils": "15.6.2",      "react-test-renderer": "^16.2.0", @@ -47,6 +48,7 @@      "roots": [        "<rootDir>/spec/javascript"      ], +    "testEnvironment": "jest-environment-jsdom-global",      "setupFiles": [        "<rootDir>/spec/javascript/spec_helper.js",        "jest-context/setup", diff --git a/spec/javascript/time_table/reducers/timetable_spec.js b/spec/javascript/time_table/reducers/timetable_spec.js index f0f9eaa8c..926fb2687 100644 --- a/spec/javascript/time_table/reducers/timetable_spec.js +++ b/spec/javascript/time_table/reducers/timetable_spec.js @@ -22,8 +22,6 @@ let json = {    time_table_dates: time_table_dates  } - -  describe('timetable reducer with empty state', () => {    beforeEach(() => {      state = { @@ -87,6 +85,7 @@ describe('timetable reducer with filled state', () => {        periode_range: periode_range,        currentPage: current_periode_range      } +    jsdom.reconfigure({url: "http://example.com/foo/bar"})      expect(        timetableReducer(state, {          type: 'GO_TO_PREVIOUS_PAGE', diff --git a/spec/javascript/vehicle_journeys/components/CustomFieldsInputs_spec.js b/spec/javascript/vehicle_journeys/components/CustomFieldsInputs_spec.js index 786b74cc7..4f8d42d2d 100644 --- a/spec/javascript/vehicle_journeys/components/CustomFieldsInputs_spec.js +++ b/spec/javascript/vehicle_journeys/components/CustomFieldsInputs_spec.js @@ -2,7 +2,6 @@ import React, { Component } from 'react'  import CustomFieldsInputs from '../../../../app/javascript/vehicle_journeys/components/tools/CustomFieldsInputs'  import renderer from 'react-test-renderer'  require('select2') -console.log($().jquery)  describe('CustomFieldsInputs', () => {    set('values', () => { @@ -3462,6 +3462,10 @@ jest-docblock@^22.0.3:    dependencies:      detect-newline "^2.1.0" +jest-environment-jsdom-global@^1.0.2: +  version "1.0.2" +  resolved "https://registry.yarnpkg.com/jest-environment-jsdom-global/-/jest-environment-jsdom-global-1.0.2.tgz#b3449e016e0b13cb0779704e29a1377f927b38a3" +  jest-environment-jsdom@^22.0.5:    version "22.0.5"    resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.0.5.tgz#7b479452e387aef5b4bf8b9fe03e8be77493f5ea" | 
