diff options
| -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 }} |
