diff options
Diffstat (limited to 'app')
| -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 | 
6 files changed, 86 insertions, 24 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' | 
