diff options
| author | Alban Peignier | 2015-06-15 15:00:00 +0200 |
|---|---|---|
| committer | Alban Peignier | 2015-06-15 15:00:15 +0200 |
| commit | cb9b401df1cffdb4411378e13fb65174b6991c31 (patch) | |
| tree | 5003eba0fbe5271db095282d44bc681e098b44f3 | |
| parent | 275b1893722ec09bc04033344865bea399eb9ca3 (diff) | |
| download | chouette-core-cb9b401df1cffdb4411378e13fb65174b6991c31.tar.bz2 | |
Manage optional attributes in ExportTask. Hide these fields in form. Refs #36455
| -rw-r--r-- | Gemfile | 1 | ||||
| -rw-r--r-- | Gemfile.lock | 3 | ||||
| -rw-r--r-- | app/assets/javascripts/export_tasks/new.js.coffee | 33 | ||||
| -rw-r--r-- | app/models/export_task.rb | 17 | ||||
| -rw-r--r-- | app/models/gtfs_export.rb | 12 | ||||
| -rw-r--r-- | app/views/export_tasks/new.html.erb | 24 | ||||
| -rw-r--r-- | spec/models/export_task_spec.rb | 8 | ||||
| -rw-r--r-- | spec/models/gtfs_export_spec.rb | 39 |
8 files changed, 103 insertions, 34 deletions
@@ -159,6 +159,7 @@ group :test, :development do gem 'rb-fsevent', :require => RUBY_PLATFORM.include?('darwin') && 'rb-fsevent' gem 'transpec' gem 'database_cleaner' + gem 'shoulda-matchers' end group :production do diff --git a/Gemfile.lock b/Gemfile.lock index 54d781fd3..711760304 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -398,6 +398,8 @@ GEM json (~> 1.7, >= 1.7.7) rdoc (~> 4.0) shellany (0.0.1) + shoulda-matchers (2.8.0) + activesupport (>= 3.0.0) simple_form (3.1.0) actionpack (~> 4.0) activemodel (~> 4.0) @@ -546,6 +548,7 @@ DEPENDENCIES sass-rails (~> 4.0.3) sawyer (~> 0.6.0) sdoc (~> 0.4.0) + shoulda-matchers simple_form (~> 3.1.0) spring sqlite3 diff --git a/app/assets/javascripts/export_tasks/new.js.coffee b/app/assets/javascripts/export_tasks/new.js.coffee index 466486df6..f46711b6b 100644 --- a/app/assets/javascripts/export_tasks/new.js.coffee +++ b/app/assets/javascripts/export_tasks/new.js.coffee @@ -1,14 +1,31 @@ $(".export_tasks.new").ready -> + toggle_input = (li, enabled) -> + # Hide li block + li.toggle(enabled) + # Disable input/select to ignore it in POST data + li.find("input,select").attr("disabled", !enabled) + export_references_type_change = (event) -> + form = $(event.target).parents('form') + + # Display the reference_ids input for the selected type references_type = $(event.target).val() + for li in form.find("li.reference_ids") + li = $(li) + enabled = li.data("type") == references_type + toggle_input li, enabled + + disabled_inputs = form.find("li.input").not("li.reference_ids").find("input:disabled,select:disabled") + for disabled_input in disabled_inputs + li = $(disabled_input).parents('li') + toggle_input li, true + + hidden_attributes = $(event.target).find(":selected").data("hidden-attributes") + return unless hidden_attributes - toggle_input = (li) -> - enabled = (li.data("type") == references_type) - # Hide li block - li.toggle(enabled) - # Disable textarea to ignore it in POST data - li.find(".token-input").attr("disabled", !enabled) - - toggle_input($(li)) for li in $(event.target).parents('form').find("li.reference_ids") + hidden_attributes = hidden_attributes.split(',') + for attribute in hidden_attributes + li = form.find("##{form.attr('id')}_export_task_#{attribute}_input") + toggle_input li, false $('form select[name="export_task[references_type]"]').change( export_references_type_change ) diff --git a/app/models/export_task.rb b/app/models/export_task.rb index 59a2103aa..f02cb914e 100644 --- a/app/models/export_task.rb +++ b/app/models/export_task.rb @@ -30,8 +30,9 @@ class ExportTask end def period_validation - st_date = Date.parse(start_date) unless start_date.blank? - ed_date = Date.parse(end_date) unless end_date.blank? + st_date = start_date.is_a?(String) ? Date.parse(start_date) : start_date + ed_date = end_date.is_a?(String) ? Date.parse(end_date) : end_date + unless Chouette::TimeTable.start_validity_period.nil? || st_date.nil? tt_st_date = Chouette::TimeTable.start_validity_period errors.add(:start_date, ExportTask.human_attribute_name("start_date_greater_than" , {:tt_st_date => tt_st_date})) unless tt_st_date <= st_date @@ -103,4 +104,16 @@ class ExportTask Faraday::UploadIO.new(file, "application/json", "parameters.json") end + def self.optional_attributes(references_type) + [] + end + + def optional_attributes + self.class.optional_attributes(references_type.to_s) + end + + def optional_attribute?(attribute) + optional_attributes.include? attribute.to_sym + end + end diff --git a/app/models/gtfs_export.rb b/app/models/gtfs_export.rb index bef468c32..d0b9fc4f9 100644 --- a/app/models/gtfs_export.rb +++ b/app/models/gtfs_export.rb @@ -1,12 +1,12 @@ class GtfsExport < ExportTask - validates_presence_of :time_zone + validates_presence_of :time_zone, unless: Proc.new { |e| e.optional_attribute? :time_zone } attr_accessor :object_id_prefix, :time_zone enumerize :references_type, in: %w( network line company group_of_line stop_area ) - + after_initialize :init_params - + def init_params if time_zone.nil? self.time_zone = "Paris" @@ -34,6 +34,12 @@ class GtfsExport < ExportTask } end + def self.optional_attributes(references_type) + super.tap do |optional_attributes| + optional_attributes.push :time_zone, :start_date, :end_date if references_type == "stop_area" + end + end + def data_format "gtfs" end diff --git a/app/views/export_tasks/new.html.erb b/app/views/export_tasks/new.html.erb index 1cdb4fa79..751bbc1a0 100644 --- a/app/views/export_tasks/new.html.erb +++ b/app/views/export_tasks/new.html.erb @@ -1,6 +1,6 @@ <%= title_tag t(".title") %> <ul class="nav nav-pills"> - <% ExportTask.data_formats.each do |format| %> + <% ExportTask.data_formats.each do |format| %> <li role="presentation"><a href="#<%= format %>" class='<%= @export_task.data_format == format ? "#{format} active" : "#{format}" %>' title='<%= t(:"enumerize.data_format_detail.#{format}")%>' data-toggle="tab"><%= t(:"enumerize.data_format.#{format}") %></a></li> <% end %> </ul> @@ -8,23 +8,22 @@ <div class="tab-content"> <% @available_exports.each do |export_task| %> <%= semantic_form_for [@referential, export_task], :as => :export_task, :url => referential_export_tasks_path(@referential), :namespace => export_task.data_format ,:html => { :id => "#{export_task.data_format}", :class => "tab-pane highlight"} do |form| %> - <%= form.inputs do %> + <%= form.inputs do %> <%= form.input :user_name, :as => :hidden, :input_html => { :value => current_user.name } %> <%= form.input :user_id, :as => :hidden, :input_html => { :value => current_user.id } %> <%= form.input :data_format, :as => :hidden %> - <%= form.input :referential_id, :as => :hidden, :input_html => { :value => @referential.id } %> - <%= form.input :name %> - <%= form.input :references_type, :as => :select, :include_blank => t(".all") %> + <%= form.input :referential_id, :as => :hidden, :input_html => { :value => @referential.id } %> + <%= form.input :name %> + <%= form.input :references_type, as: :select, include_blank: t(".all"), collection: export_task.class.references_type.options.map { |o| o << {data:{"hidden-attributes": export_task.class.optional_attributes(o.second).join(',') }} } %> <% export_task.class.references_types.each do |type| %> - <%= form.input :reference_ids, :as => :reference_ids, :json => references_referential_export_tasks_path(@referential, :format => :json) + "?filter=#{type}", :hint_text => t('search_hint'), :no_result_text => t('no_result_text'),:searching_text => t('searching_term'), :id => "#{export_task.data_format}_#{type}_reference_ids", :input_html => { :id => "#{export_task.data_format}_#{type}_reference_ids" }, :wrapper_html => { :style => "display:none;", :id => "#{export_task.data_format}_#{type}", :"data-type" => "#{type}" } %> - <% end %> - <% end %> + <%= form.input :reference_ids, :as => :reference_ids, :json => references_referential_export_tasks_path(@referential, :format => :json) + "?filter=#{type}", :hint_text => t('search_hint'), :no_result_text => t('no_result_text'),:searching_text => t('searching_term'), :id => "#{export_task.data_format}_#{type}_reference_ids", :input_html => { :id => "#{export_task.data_format}_#{type}_reference_ids" }, :wrapper_html => { style: "display:none;", "data-type": type.to_s } %> + <% end %> + <% end %> - <%= form.input :start_date, :as => :date_picker, :input_html => { :title => t("formtastic.titles.export_task.start_date")} %> - <%= form.input :end_date, :as => :date_picker, :input_html => { :title => t("formtastic.titles.export_task.end_date")} %> + <%= form.input :start_date, :as => :date_picker, :input_html => { :title => t("formtastic.titles.export_task.start_date")} %> + <%= form.input :end_date, :as => :date_picker, :input_html => { :title => t("formtastic.titles.export_task.end_date")} %> - - <%= render partial: "fields_#{export_task.data_format}_export", :locals => { :form => form } %> + <%= render partial: "fields_#{export_task.data_format}_export", :locals => { :form => form } %> <%= form.actions do %> <%= form.action :submit, :as => :button , :label => t( 'formtastic.export' ) %> @@ -36,4 +35,3 @@ </div> <%= javascript_include_tag new_referential_export_task_path(@referential, :format => :js) %> - diff --git a/spec/models/export_task_spec.rb b/spec/models/export_task_spec.rb new file mode 100644 index 000000000..1a52a6175 --- /dev/null +++ b/spec/models/export_task_spec.rb @@ -0,0 +1,8 @@ +require 'spec_helper' + +describe ExportTask, :type => :model do + + it { should_not validate_presence_of(:start_date) } + it { should_not validate_presence_of(:end_date) } + +end diff --git a/spec/models/gtfs_export_spec.rb b/spec/models/gtfs_export_spec.rb index a5e5d0335..6051497a7 100644 --- a/spec/models/gtfs_export_spec.rb +++ b/spec/models/gtfs_export_spec.rb @@ -1,10 +1,33 @@ -# require 'spec_helper' +require 'spec_helper' -# describe GtfsExport, :type => :model do +describe GtfsExport, :type => :model do -# describe '#export_options' do -# subject { super().export_options } -# it { is_expected.to include(:format => :gtfs) } -# end - -# end + describe "#time_zone" do + + context "when exported data are not StopAreas" do + + before do + subject.references_type = "network" + end + + it "should be mandatory" do + subject.should validate_presence_of(:time_zone) + end + + end + + context "when export data are StopArea" do + + before do + subject.references_type = "stop_area" + end + + it "should be mandatory" do + subject.should_not validate_presence_of(:time_zone) + end + + end + + end + +end |
