aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/helpers/exports_helper.rb37
-rw-r--r--app/javascript/helpers/master_slave.coffee17
-rw-r--r--app/models/export/base.rb12
-rw-r--r--app/models/export/netex.rb15
-rw-r--r--app/models/export/option_proxy.rb21
-rw-r--r--app/views/exports/_form.html.slim8
-rw-r--r--config/locales/exports.en.yml8
-rw-r--r--config/locales/exports.fr.yml8
-rw-r--r--spec/controllers/exports_controller_spec.rb2
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
}}