diff options
| author | Luc Donnet | 2018-05-31 11:39:40 +0200 | 
|---|---|---|
| committer | GitHub | 2018-05-31 11:39:40 +0200 | 
| commit | 3642e0741c96cf4855dc7731a22ac0b9fabea5f4 (patch) | |
| tree | d754f0abc83d261c0f2057e5be56914e7486dd02 | |
| parent | 255c8c3a86f86f64eb04a2e8ed7e036f56d505d0 (diff) | |
| parent | c49242a8a51f16635f67acd850b3bbcd6ad2ac5e (diff) | |
| download | chouette-core-3642e0741c96cf4855dc7731a22ac0b9fabea5f4.tar.bz2 | |
Merge pull request #592 from af83/7159-netex-exports
7159 Update options for netex exports
| -rw-r--r-- | app/helpers/exports_helper.rb | 37 | ||||
| -rw-r--r-- | app/javascript/helpers/master_slave.coffee | 17 | ||||
| -rw-r--r-- | app/models/export/base.rb | 12 | ||||
| -rw-r--r-- | app/models/export/netex.rb | 15 | ||||
| -rw-r--r-- | app/models/export/option_proxy.rb | 21 | ||||
| -rw-r--r-- | app/views/exports/_form.html.slim | 8 | ||||
| -rw-r--r-- | config/locales/exports.en.yml | 8 | ||||
| -rw-r--r-- | config/locales/exports.fr.yml | 8 | ||||
| -rw-r--r-- | spec/controllers/exports_controller_spec.rb | 2 | 
9 files changed, 103 insertions, 25 deletions
| diff --git a/app/helpers/exports_helper.rb b/app/helpers/exports_helper.rb index 4de539b73..cc6fc3046 100644 --- a/app/helpers/exports_helper.rb +++ b/app/helpers/exports_helper.rb @@ -4,12 +4,37 @@ module ExportsHelper      import_status status    end -  def export_option_input form, export, attr, option_def, type -    opts = { required: option_def[:required], input_html: {value: export.try(attr) || option_def[:default_value]}, as: option_def[:type], selected:  export.try(attr) || option_def[:default_value]} -    opts[:collection] = option_def[:collection] if option_def.has_key?(:collection) -    opts[:collection] = export.instance_exec(&option_def[:collection]) if option_def[:collection].is_a?(Proc) -    opts[:label] = t "activerecord.attributes.export.#{type.name.demodulize.underscore}.#{attr}" -    form.input attr, opts +  def export_option_input form, export, attr, option_def, type, referentials +    if !!option_def[:depends_on_referential] +      out = "" +      referentials.each do |referential| +        out += content_tag :div, class: "slave", data: {master: "[name='export[referential_id]']", value: referential.id} do +          _opts = {depends_on_referential: false, collection: option_def[:collection].call(referential)}.reverse_update(option_def) +          export_option_input form, export, attr, _opts, type, referentials +        end +      end +      out.html_safe +    else +      opts = { required: option_def[:required], input_html: {value: export.try(attr) || option_def[:default_value]}, as: option_def[:type], selected:  export.try(attr) || option_def[:default_value]} + +      if option_def.has_key?(:collection) +        if option_def[:collection].is_a?(Array) && !option_def[:collection].first.is_a?(Array) +          opts[:collection] = option_def[:collection].map{|k| [export.class.tmf("#{type.name.demodulize.underscore}.#{attr}_collection.#{k}"), k]} +        else +          opts[:collection] = option_def[:collection] +        end +        opts[:collection] = export.instance_exec(&option_def[:collection]) if option_def[:collection].is_a?(Proc) +      end +      opts[:label] =  export.class.tmf("#{type.name.demodulize.underscore}.#{attr}") +      opts[:input_html]['data-select2ed'] = true if opts[:collection] +      out = form.input attr, opts +      if option_def[:depends] +        out = content_tag :div, class: "slave", data: {master: "[name='export[#{option_def[:depends][:option]}]']", value: option_def[:depends][:value]} do +          out +        end.html_safe +      end +      out +    end    end    def export_message_content message diff --git a/app/javascript/helpers/master_slave.coffee b/app/javascript/helpers/master_slave.coffee index 81bebe36a..e1bd46281 100644 --- a/app/javascript/helpers/master_slave.coffee +++ b/app/javascript/helpers/master_slave.coffee @@ -3,14 +3,21 @@ class MasterSlave      $(selector).find('[data-master]').each (i, slave)->        $slave = $(slave)        master = $($slave.data().master) -      $slave.find("input:disabled, select:disabled").attr "data-slave-force-disabled", "true" -      toggle = -> +      if $slave.find('[data-master]').length == 0 +        $slave.find("input:disabled, select:disabled").attr "data-slave-force-disabled", "true" +      toggle = (disableInputs=true)->          val = master.filter(":checked").val() if master.filter("[type=radio]").length > 0          val ||= master.val() -        selected = val == $slave.data().value +        selected = "#{val}" == "#{$slave.data().value}"          $slave.toggle selected -        $slave.find("input, select").filter(":not([data-slave-force-disabled])").attr "disabled", !selected +        $slave.toggleClass "active", selected +        if disableInputs +          disabled = !selected +          disabled = disabled || $slave.parents("[data-master]:not(.active)").length > 0 +          $slave.find("input, select").filter(":not([data-slave-force-disabled])").attr "disabled", disabled +        if selected +          $("[data-select2ed='true']").select2()        master.change toggle -      toggle() +      toggle($slave.find('[data-master]').length == 0)  export default MasterSlave diff --git a/app/models/export/base.rb b/app/models/export/base.rb index c65539635..6afa6b8e0 100644 --- a/app/models/export/base.rb +++ b/app/models/export/base.rb @@ -52,7 +52,7 @@ class Export::Base < ActiveRecord::Base            begin              klass_name.constantize            rescue => e -            Rails.logger.info "Failed: #{e.message}" +            Rails.logger.info "Failed: #{e.message}".red              nil            end          end @@ -83,10 +83,18 @@ class Export::Base < ActiveRecord::Base      end      if !!opts[:required] -      validates name, presence: true +      if opts[:depends] +        validates name, presence: true, if: ->(record){ record.send(opts[:depends][:option]) == opts[:depends][:value]} +      else +        validates name, presence: true +      end      end      @options ||= {}      @options[name] = opts + +    if block_given? +      yield Export::OptionProxy.new(self, opts.update(name: name)) +    end    end    def self.options diff --git a/app/models/export/netex.rb b/app/models/export/netex.rb index 069ec2209..d471682b0 100644 --- a/app/models/export/netex.rb +++ b/app/models/export/netex.rb @@ -1,8 +1,13 @@  class Export::Netex < Export::Base    after_commit :call_iev_callback, on: :create -  option :export_type, collection: %w(line full), required: true -  option :duration, type: :integer, default_value: 90, required: true -  option :line_code +  option :export_type, collection: %w(line full), required: true do |val| +    val.full do +      option :duration, type: :integer, default_value: 90, required: true +    end +    val.line do +      option :line_code, collection: ->(referential){referential.lines.map{|l| [l.display_name, l.id]}}, depends_on_referential: true +    end +  end    private @@ -10,10 +15,6 @@ class Export::Netex < Export::Base      URI("#{Rails.configuration.iev_url}/boiv_iev/referentials/exporter/new?id=#{id}")    end -  # def self.user_visible? -  #   false -  # end -    def destroy_non_ready_referential      if referential && !referential.ready        referential.destroy diff --git a/app/models/export/option_proxy.rb b/app/models/export/option_proxy.rb new file mode 100644 index 000000000..8141f3b54 --- /dev/null +++ b/app/models/export/option_proxy.rb @@ -0,0 +1,21 @@ +class Export::OptionProxy +  def initialize export, parent_option +    @export = export +    @parent_option = parent_option + +    if parent_option[:collection].is_a?(Array) +      parent_option[:collection].each do |val| +        define_singleton_method val do |&block| +          @_collection_value = val +          instance_exec &block +          @_collection_value = nil +        end +      end +    end +  end + +  def option name, opts={} +    opts.update depends: {option: @parent_option[:name], value: @_collection_value} +    @export.option name, opts +  end +end diff --git a/app/views/exports/_form.html.slim b/app/views/exports/_form.html.slim index 999e33e34..1ce0bfffa 100644 --- a/app/views/exports/_form.html.slim +++ b/app/views/exports/_form.html.slim @@ -4,13 +4,13 @@      .col-lg-12        = form.input :name      .col-lg-12 -      = form.input :type, as: :select, collection: workgroup_exports(workbench.workgroup), label_method: :human_name -      = form.input :referential_id, as: :select, collection: workbench.referentials, label_method: :name +      = form.input :type, as: :select, collection: workgroup_exports(workbench.workgroup), label_method: :human_name, input_html: {"data-select2ed" => true} +      = form.input :referential_id, as: :select, collection: workbench.referentials, label_method: :name, input_html: {"data-select2ed" => true} -      - Export::Base.user_visible_descendants.each do |child| +      - workgroup_exports(workbench.workgroup).each do |child|          .slave data-master="[name='export[type]']" data-value=child.name            - child.options.each do |attr, option_def| -            = export_option_input form, export, attr, option_def, child +            = export_option_input form, export, attr, option_def, child, workbench.referentials    = form.button :submit, t('actions.submit'), class: 'btn btn-default formSubmitr', form: 'wb_export_form' diff --git a/config/locales/exports.en.yml b/config/locales/exports.en.yml index 9a4c65d41..722874838 100644 --- a/config/locales/exports.en.yml +++ b/config/locales/exports.en.yml @@ -92,6 +92,14 @@ en:          <<: *attrs          base:            <<: *attrs +        netex: +          <<: *attrs +          duration: Duration (in days) +          line_code: Line +          export_type: Export subtype +          export_type_collection: +            line: By line +            full: Full          workgroup:            duration: Duration          referential_companies: diff --git a/config/locales/exports.fr.yml b/config/locales/exports.fr.yml index e3479b052..562aa9f7c 100644 --- a/config/locales/exports.fr.yml +++ b/config/locales/exports.fr.yml @@ -92,6 +92,14 @@ fr:          <<: *attrs          base:            <<: *attrs +        netex: +          <<: *attrs +          duration: Durée (en jours) +          line_code: Ligne +          export_type: Sous-type d'export +          export_type_collection: +            line: Par ligne +            full: Complet          workgroup:            duration: Durée          referential_companies: diff --git a/spec/controllers/exports_controller_spec.rb b/spec/controllers/exports_controller_spec.rb index e2b89fc26..ae48fc3b8 100644 --- a/spec/controllers/exports_controller_spec.rb +++ b/spec/controllers/exports_controller_spec.rb @@ -29,7 +29,7 @@ RSpec.describe ExportsController, :type => :controller do          name: "foo",          type: "Export::Netex",          duration: 12, -        export_type: :line, +        export_type: :full,          referential_id: first_referential.id        }} | 
