diff --git a/app/assets/javascripts/activate_error_messages.js b/app/assets/javascripts/activate_error_messages.js
new file mode 100644
index 0000000000..9c62645173
--- /dev/null
+++ b/app/assets/javascripts/activate_error_messages.js
@@ -0,0 +1,32 @@
+//-- copyright
+// OpenProject is a project management system.
+// Copyright (C) 2012-2013 the OpenProject Foundation (OPF)
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License version 3.
+//
+// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+// Copyright (C) 2006-2013 Jean-Philippe Lang
+// Copyright (C) 2010-2013 the ChiliProject Team
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// See doc/COPYRIGHT.rdoc for more details.
+//++
+
+jQuery(document).ajaxComplete(function() {
+ activateError();
+});
+
diff --git a/app/assets/javascripts/application.js.erb b/app/assets/javascripts/application.js.erb
index 4b2ea03252..ee12e9810a 100644
--- a/app/assets/javascripts/application.js.erb
+++ b/app/assets/javascripts/application.js.erb
@@ -1263,6 +1263,22 @@ var I18nForms = (function ($) {
jQuery(document).ready(I18nForms.init);
+var activateError = function() {
+ var errorHeader = jQuery('.errorExplanation h2[role="alert"]');
+
+ errorHeader.show();
+}
+
+var activateFlash = function() {
+ var flashMessage = jQuery('.flash');
+
+ flashMessage.hide();
+ flashMessage.show();
+}
+
+jQuery(document).ready(activateError);
+jQuery(document).ready(activateFlash);
+
var SubmitConfirm = (function($) {
var init;
diff --git a/app/assets/stylesheets/content/_flash_messages.css.sass b/app/assets/stylesheets/content/_flash_messages.css.sass
index 534130cd59..c4c8f8a04a 100644
--- a/app/assets/stylesheets/content/_flash_messages.css.sass
+++ b/app/assets/stylesheets/content/_flash_messages.css.sass
@@ -43,6 +43,8 @@ div.flash.error a:hover, div.flash.warning a:hover, div.flash.notice a:hover, #e
font-size: 0.9em
margin-left: 30px
h2, p
+ @include hidden_for_sighted
+ h2
display: none
div.flash.error, #errorExplanation
diff --git a/app/assets/stylesheets/global/_accessibility.css.sass b/app/assets/stylesheets/global/_accessibility.css.sass
new file mode 100644
index 0000000000..51ccb66868
--- /dev/null
+++ b/app/assets/stylesheets/global/_accessibility.css.sass
@@ -0,0 +1,35 @@
+/*-- copyright
+ * OpenProject is a project management system.
+ * Copyright (C) 2012-2013 the OpenProject Foundation (OPF)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 3.
+ *
+ * OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+ * Copyright (C) 2006-2013 Jean-Philippe Lang
+ * Copyright (C) 2010-2013 the ChiliProject Team
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * See doc/COPYRIGHT.rdoc for more details. ++
+ */
+
+@mixin hidden_for_sighted
+ position: absolute
+ left: -10000px
+ top: auto
+ width: 1px
+ height: 1px
+ overflow: hidden
diff --git a/app/assets/stylesheets/global/all.sass b/app/assets/stylesheets/global/all.sass
index 53689410d9..a084a0364a 100644
--- a/app/assets/stylesheets/global/all.sass
+++ b/app/assets/stylesheets/global/all.sass
@@ -26,5 +26,6 @@
* See doc/COPYRIGHT.rdoc for more details. ++
*/
+@import global/accessibility
@import global/variables
@import global/mixins
diff --git a/app/controllers/project_types_controller.rb b/app/controllers/project_types_controller.rb
index 298b5b0d21..db1cc0e8c9 100644
--- a/app/controllers/project_types_controller.rb
+++ b/app/controllers/project_types_controller.rb
@@ -59,7 +59,6 @@ class ProjectTypesController < ApplicationController
flash[:notice] = l(:notice_successful_create)
redirect_to project_types_path
else
- flash.now[:error] = l('timelines.project_type_could_not_be_saved')
render :action => 'new'
end
end
@@ -84,7 +83,6 @@ class ProjectTypesController < ApplicationController
flash[:notice] = l(:notice_successful_update)
redirect_to project_types_path
else
- flash.now[:error] = l('timelines.project_type_could_not_be_saved')
render :action => :edit
end
end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index a05dc9cf6a..240e432a5e 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -267,6 +267,37 @@ module ApplicationHelper
end
end
+ def error_messages_for(*params)
+ objects, options = extract_objects_from_params(params)
+
+ error_messages = objects.map{ |o| o.errors.full_messages }.flatten
+
+ unless error_messages.empty?
+ render partial: 'common/validation_error', locals: { error_messages: error_messages,
+ object_name: options[:object_name].to_s.gsub('_', '') }
+ end
+ end
+
+ # Taken from Dynamic Form
+ #
+ # lib/action_view/helpers/dynamic_form.rb:187-198
+ def extract_objects_from_params(params)
+ options = params.extract_options!.symbolize_keys
+
+ objects = Array.wrap(options.delete(:object) || params).map do |object|
+ object = instance_variable_get("@#{object}") unless object.respond_to?(:to_model)
+ object = convert_to_model(object)
+
+ if object.class.respond_to?(:model_name)
+ options[:object_name] ||= object.class.model_name.human.downcase
+ end
+
+ object
+ end
+
+ [objects.compact, options]
+ end
+
# Renders flash messages
def render_flash_messages
flash.map { |k,v| render_flash_message(k, v) }.join.html_safe
@@ -281,7 +312,7 @@ module ApplicationHelper
end
def render_flash_message(type, message, html_options = {})
- html_options = {:class => "flash #{type} icon icon-#{type}"}.merge(html_options)
+ html_options = { :class => "flash #{type} icon icon-#{type}", role: "alert" }.merge(html_options)
if User.current.impaired?
content_tag('div', content_tag('a', join_flash_messages(message), :href => 'javascript:;'), html_options)
else
diff --git a/app/views/common/_validation_error.html.erb b/app/views/common/_validation_error.html.erb
new file mode 100644
index 0000000000..b85e64a1e0
--- /dev/null
+++ b/app/views/common/_validation_error.html.erb
@@ -0,0 +1,38 @@
+<%#-- copyright
+OpenProject is a project management system.
+Copyright (C) 2012-2013 the OpenProject Foundation (OPF)
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License version 3.
+
+OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+Copyright (C) 2006-2013 Jean-Philippe Lang
+Copyright (C) 2010-2013 the ChiliProject Team
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+See doc/COPYRIGHT.rdoc for more details.
+
+++#%>
+
+
+
<%= l("activerecord.errors.template.header.#{(error_messages.count == 1) ? 'one' : 'other'}", count: error_messages.count, model: object_name) %>
+
<%= l("errors.header_invalid_fields") %>
+
+ <% error_messages.each do |message| %>
+ <%= message %>
+ <% end %>
+
+
diff --git a/app/views/members/_member_form_impaired.html.erb b/app/views/members/_member_form_impaired.html.erb
index 76055a82fc..390c350919 100644
--- a/app/views/members/_member_form_impaired.html.erb
+++ b/app/views/members/_member_form_impaired.html.erb
@@ -32,7 +32,7 @@ See doc/COPYRIGHT.rdoc for more details.
:method => :post,
:remote => true,
:loading => '$(\'member-add-submit\').disable();',
- :complete => 'if($(\'member-add-submit\')) $(\'member-add-submit\').enable();',
+ :complete => 'if($(\'member-add-submit\')) $(\'member-add-submit\').enable(); activateError();',
:html => {:id => "members_add_form"}) do |f| %>
<%=l(:label_member_new)%>
diff --git a/app/views/members/_member_form_non_impaired.html.erb b/app/views/members/_member_form_non_impaired.html.erb
index 3a79c22e74..8a5d8f6fed 100644
--- a/app/views/members/_member_form_non_impaired.html.erb
+++ b/app/views/members/_member_form_non_impaired.html.erb
@@ -28,6 +28,7 @@ See doc/COPYRIGHT.rdoc for more details.
++#%>
<%= javascript_include_tag "members_select_boxes.js" %>
+<%= javascript_include_tag "activate_error_messages" %>
<%= form_for(:member, :url => {:controller => 'members', :action => 'create', :project_id => project},
:remote => true,
diff --git a/app/views/project_associations/_form.html.erb b/app/views/project_associations/_form.html.erb
index 01cdb63439..0cf9f2166e 100644
--- a/app/views/project_associations/_form.html.erb
+++ b/app/views/project_associations/_form.html.erb
@@ -27,7 +27,6 @@ See doc/COPYRIGHT.rdoc for more details.
++#%>
-<%= f.error_messages %>
<%= ProjectAssociation.human_attribute_name(:description)%>:
diff --git a/app/views/project_associations/edit.html.erb b/app/views/project_associations/edit.html.erb
index 5cabbc2f97..e4b19f685c 100644
--- a/app/views/project_associations/edit.html.erb
+++ b/app/views/project_associations/edit.html.erb
@@ -42,6 +42,8 @@ See doc/COPYRIGHT.rdoc for more details.
<%= title.tap { |t| html_title t } %>
+ <%= error_messages_for 'project_association' %>
+
<%= render :partial => 'form', :locals => {:f => f, :project => @project} %>
<%= f.submit l(:button_update), :name => nil %>
diff --git a/app/views/project_associations/new.html.erb b/app/views/project_associations/new.html.erb
index fa43f13862..fbb1626eab 100644
--- a/app/views/project_associations/new.html.erb
+++ b/app/views/project_associations/new.html.erb
@@ -47,6 +47,8 @@ See doc/COPYRIGHT.rdoc for more details.
:project_b => '?') %>
<%= title.tap { |t| html_title t } %>
+ <%= error_messages_for 'project_association' %>
+
<%= label_tag 'project_association_select_project_b_id', l('timelines.project_association_new_for_with',
:project_a => h(@project.name)) %>
diff --git a/app/views/project_types/_form.html.erb b/app/views/project_types/_form.html.erb
index 858278bb84..9f8d18d3ba 100644
--- a/app/views/project_types/_form.html.erb
+++ b/app/views/project_types/_form.html.erb
@@ -35,8 +35,6 @@ See doc/COPYRIGHT.rdoc for more details.
:project_type => ProjectType
%>
-<%= error_messages_for 'project_type' %>
-
<% if project_type.new_record? %>
<% html_title l("timelines.new_project_type") %>
@@ -47,6 +45,8 @@ See doc/COPYRIGHT.rdoc for more details.
<% end %>
+<%= error_messages_for 'project_type' %>
+
<%= f.text_field :name, :required => true %>
<%= f.check_box :allows_association %>
diff --git a/app/views/reportings/edit.html.erb b/app/views/reportings/edit.html.erb
index 38f26252e3..cb070c43b3 100644
--- a/app/views/reportings/edit.html.erb
+++ b/app/views/reportings/edit.html.erb
@@ -48,7 +48,7 @@ See doc/COPYRIGHT.rdoc for more details.
:url => project_reporting_path(@project, @reporting),
:html => {:method => 'put'} do |f| %>
- <%= f.error_messages %>
+ <%= error_messages_for 'project' %>
<%= l('timelines.properties') %>
diff --git a/app/views/reportings/new.html.erb b/app/views/reportings/new.html.erb
index ce81983514..ef19a8f5bd 100644
--- a/app/views/reportings/new.html.erb
+++ b/app/views/reportings/new.html.erb
@@ -43,7 +43,7 @@ See doc/COPYRIGHT.rdoc for more details.
:url => project_reportings_path(@project),
:html => {:method => 'post'} do |f| %>
- <%= f.error_messages %>
+ <%= error_messages_for 'project' %>
<%= l('timelines.properties') %>
diff --git a/app/views/work_packages/_relations.html.erb b/app/views/work_packages/_relations.html.erb
index cde7deb81b..d6b7f4fc2a 100644
--- a/app/views/work_packages/_relations.html.erb
+++ b/app/views/work_packages/_relations.html.erb
@@ -27,6 +27,8 @@ See doc/COPYRIGHT.rdoc for more details.
++#%>
+<%= javascript_include_tag "activate_error_messages" %>
+
<%=l(:label_related_work_packages)%>
<% if authorize_for('work_package_relations', 'create') %>
diff --git a/app/views/work_packages/index.html.erb b/app/views/work_packages/index.html.erb
index e2c76597ca..2719d57a98 100644
--- a/app/views/work_packages/index.html.erb
+++ b/app/views/work_packages/index.html.erb
@@ -50,6 +50,8 @@ See doc/COPYRIGHT.rdoc for more details.
<%= render :partial => 'layouts/action_menu_specific' %>
+<%= error_messages_for 'query' %>
+
-<%= error_messages_for 'query' %>
-
<% if query.valid? %>
<% if work_packages.empty? %>
<%= l(:label_no_data) %>
diff --git a/config/locales/de.yml b/config/locales/de.yml
index 858271881e..1cfe601078 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -268,6 +268,10 @@ de:
wiki: "Wiki"
wiki_page: "Wiki-Seite"
workflow: "Workflow"
+ work_package: "Arbeitspaket"
+
+ errors:
+ header_invalid_fields: "Bei den folgenden Feldern traten Fehler auf:"
activity:
created: "Erstellt: %{title}"
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 513ec4697a..1f7b5795c3 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -267,6 +267,9 @@ en:
wiki_page: "Wiki page"
workflow: "Workflow"
+ errors:
+ header_invalid_fields: "There were problems with the following fields:"
+
activity:
created: "Created: %{title}"
updated: "Updated: %{title}"
diff --git a/features/project_types/project_types_administration.feature b/features/project_types/project_types_administration.feature
index e447137214..3fe614eb70 100644
--- a/features/project_types/project_types_administration.feature
+++ b/features/project_types/project_types_administration.feature
@@ -123,7 +123,6 @@ Feature:
And I follow "New project type"
And I fill in "" for "Name"
And I press "Save"
- Then I should see an error flash stating "Project type could not be saved"
And I should see an error explanation stating "Name can't be blank"
When I fill in "Some other Project" for "Name"
@@ -137,7 +136,6 @@ Feature:
And I follow the edit link of the project type "Extraordinary Project"
And I fill in "" for "Name"
And I press "Save"
- Then I should see an error flash stating "Project type could not be saved"
Then I should see an error explanation stating "Name can't be blank"
When I fill in "Super-Extraordinary Project" for "Name"
diff --git a/lib/plugins/dynamic_form/MIT-LICENSE b/lib/plugins/dynamic_form/MIT-LICENSE
deleted file mode 100644
index 700c59bf75..0000000000
--- a/lib/plugins/dynamic_form/MIT-LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2010 David Heinemeier Hansson
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/lib/plugins/dynamic_form/README b/lib/plugins/dynamic_form/README
deleted file mode 100644
index 216c309877..0000000000
--- a/lib/plugins/dynamic_form/README
+++ /dev/null
@@ -1,13 +0,0 @@
-DynamicForm
-===========
-
-DynamicForm holds a few helpers method to help you deal with your models, they are:
-
-* input(record, method, options = {})
-* form(record, options = {})
-* error_message_on(object, method, options={})
-* error_messages_for(record, options={})
-
-It also adds f.error_messages and f.error_messages_on to your form builders.
-
-Copyright (c) 2010 David Heinemeier Hansson, released under the MIT license
diff --git a/lib/plugins/dynamic_form/Rakefile b/lib/plugins/dynamic_form/Rakefile
deleted file mode 100644
index e1df65df86..0000000000
--- a/lib/plugins/dynamic_form/Rakefile
+++ /dev/null
@@ -1,10 +0,0 @@
-require 'rake/testtask'
-
-desc 'Default: run unit tests.'
-task :default => :test
-
-desc 'Test the active_model_helper plugin.'
-Rake::TestTask.new(:test) do |t|
- t.libs << 'test'
- t.pattern = 'test/**/*_test.rb'
-end
diff --git a/lib/plugins/dynamic_form/dynamic_form.gemspec b/lib/plugins/dynamic_form/dynamic_form.gemspec
deleted file mode 100644
index 1d73a8e6fc..0000000000
--- a/lib/plugins/dynamic_form/dynamic_form.gemspec
+++ /dev/null
@@ -1,12 +0,0 @@
-Gem::Specification.new do |s|
- s.name = 'dynamic_form'
- s.version = '1.0.0'
- s.author = 'David Heinemeier Hansson'
- s.email = 'david@loudthinking.com'
- s.summary = 'Deprecated dynamic form helpers: input, form, error_messages_for, error_messages_on'
-
- s.add_dependency('rails', '>= 3.0.0')
-
- s.files = Dir['lib/**/*']
- s.require_path = 'lib'
-end
diff --git a/lib/plugins/dynamic_form/init.rb b/lib/plugins/dynamic_form/init.rb
deleted file mode 100644
index 17d09fa8a6..0000000000
--- a/lib/plugins/dynamic_form/init.rb
+++ /dev/null
@@ -1 +0,0 @@
-require 'dynamic_form'
diff --git a/lib/plugins/dynamic_form/lib/action_view/helpers/dynamic_form.rb b/lib/plugins/dynamic_form/lib/action_view/helpers/dynamic_form.rb
deleted file mode 100644
index b34d4bcbeb..0000000000
--- a/lib/plugins/dynamic_form/lib/action_view/helpers/dynamic_form.rb
+++ /dev/null
@@ -1,300 +0,0 @@
-require 'action_view/helpers'
-require 'active_support/i18n'
-require 'active_support/core_ext/enumerable'
-require 'active_support/core_ext/object/blank'
-
-module ActionView
- module Helpers
- # The Active Record Helper makes it easier to create forms for records kept in instance variables. The most far-reaching is the +form+
- # method that creates a complete form for all the basic content types of the record (not associations or aggregations, though). This
- # is a great way of making the record quickly available for editing, but likely to prove lackluster for a complicated real-world form.
- # In that case, it's better to use the +input+ method and the specialized +form+ methods in link:classes/ActionView/Helpers/FormHelper.html
- module DynamicForm
- # Returns a default input tag for the type of object returned by the method. For example, if @post
- # has an attribute +title+ mapped to a +VARCHAR+ column that holds "Hello World":
- #
- # input("post", "title")
- # # =>
- def input(record_name, method, options = {})
- InstanceTag.new(record_name, method, self).to_tag(options)
- end
-
- # Returns an entire form with all needed input tags for a specified Active Record object. For example, if @post
- # has attributes named +title+ of type +VARCHAR+ and +body+ of type +TEXT+ then
- #
- # form("post")
- #
- # would yield a form like the following (modulus formatting):
- #
- #
- #
- # It's possible to specialize the form builder by using a different action name and by supplying another
- # block renderer. For example, if @entry has an attribute +message+ of type +VARCHAR+ then
- #
- # form("entry",
- # :action => "sign",
- # :input_block => Proc.new { |record, column|
- # "#{column.human_name}: #{input(record, column.name)} "
- # })
- #
- # would yield a form like the following (modulus formatting):
- #
- #
- # Message:
- #
- #
- #
- #
- # It's also possible to add additional content to the form by giving it a block, such as:
- #
- # form("entry", :action => "sign") do |form|
- # form << content_tag("b", "Department")
- # form << collection_select("department", "id", @departments, "id", "name")
- # end
- #
- # The following options are available:
- #
- # * :action - The action used when submitting the form (default: +create+ if a new record, otherwise +update+).
- # * :input_block - Specialize the output using a different block, see above.
- # * :method - The method used when submitting the form (default: +post+).
- # * :multipart - Whether to change the enctype of the form to "multipart/form-data", used when uploading a file (default: +false+).
- # * :submit_value - The text of the submit button (default: "Create" if a new record, otherwise "Update").
- def form(record_name, options = {})
- record = instance_variable_get("@#{record_name}")
- record = convert_to_model(record)
-
- options = options.symbolize_keys
- options[:action] ||= record.persisted? ? "update" : "create"
- action = url_for(:action => options[:action], :id => record)
-
- submit_value = options[:submit_value] || options[:action].gsub(/[^\w]/, '').capitalize
-
- contents = form_tag({:action => action}, :method =>(options[:method] || 'post'), :enctype => options[:multipart] ? 'multipart/form-data': nil)
- contents.safe_concat hidden_field(record_name, :id) if record.persisted?
- contents.safe_concat all_input_tags(record, record_name, options)
- yield contents if block_given?
- contents.safe_concat submit_tag(submit_value)
- contents.safe_concat('')
- end
-
- # Returns a string containing the error message attached to the +method+ on the +object+ if one exists.
- # This error message is wrapped in a DIV tag by default or with :html_tag if specified,
- # which can be extended to include a :prepend_text and/or :append_text (to properly explain
- # the error), and a :css_class to style it accordingly. +object+ should either be the name of an
- # instance variable or the actual object. The method can be passed in either as a string or a symbol.
- # As an example, let's say you have a model @post that has an error message on the +title+ attribute:
- #
- # <%= error_message_on "post", "title" %>
- # # => can't be empty
- #
- # <%= error_message_on @post, :title %>
- # # => can't be empty
- #
- # <%= error_message_on "post", "title",
- # :prepend_text => "Title simply ",
- # :append_text => " (or it won't work).",
- # :html_tag => "span",
- # :css_class => "inputError" %>
- # # => Title simply can't be empty (or it won't work).
- def error_message_on(object, method, *args)
- options = args.extract_options!
- unless args.empty?
- ActiveSupport::Deprecation.warn('error_message_on takes an option hash instead of separate ' +
- 'prepend_text, append_text, html_tag, and css_class arguments', caller)
-
- options[:prepend_text] = args[0] || ''
- options[:append_text] = args[1] || ''
- options[:html_tag] = args[2] || 'div'
- options[:css_class] = args[3] || 'formError'
- end
- options.reverse_merge!(:prepend_text => '', :append_text => '', :html_tag => 'div', :css_class => 'formError')
-
- object = convert_to_model(object)
-
- if (obj = (object.respond_to?(:errors) ? object : instance_variable_get("@#{object}"))) &&
- (errors = obj.errors[method]).presence
- content_tag(options[:html_tag],
- (options[:prepend_text].html_safe << errors.first).safe_concat(options[:append_text]),
- :class => options[:css_class]
- )
- else
- ''
- end
- end
-
- # Returns a string with a DIV containing all of the error messages for the objects located as instance variables by the names
- # given. If more than one object is specified, the errors for the objects are displayed in the order that the object names are
- # provided.
- #
- # This DIV can be tailored by the following options:
- #
- # * :header_tag - Used for the header of the error div (default: "h2").
- # * :id - The id of the error div (default: "errorExplanation").
- # * :class - The class of the error div (default: "errorExplanation").
- # * :object - The object (or array of objects) for which to display errors,
- # if you need to escape the instance variable convention.
- # * :object_name - The object name to use in the header, or any text that you prefer.
- # If :object_name is not set, the name of the first object will be used.
- # * :header_message - The message in the header of the error div. Pass +nil+
- # or an empty string to avoid the header message altogether. (Default: "X errors
- # prohibited this object from being saved").
- # * :message - The explanation message after the header message and before
- # the error list. Pass +nil+ or an empty string to avoid the explanation message
- # altogether. (Default: "There were problems with the following fields:").
- #
- # To specify the display for one object, you simply provide its name as a parameter.
- # For example, for the @user model:
- #
- # error_messages_for 'user'
- #
- # You can also supply an object:
- #
- # error_messages_for @user
- #
- # This will use the last part of the model name in the presentation. For instance, if
- # this is a MyKlass::User object, this will use "user" as the name in the String. This
- # is taken from MyKlass::User.model_name.human, which can be overridden.
- #
- # To specify more than one object, you simply list them; optionally, you can add an extra :object_name parameter, which
- # will be the name used in the header message:
- #
- # error_messages_for 'user_common', 'user', :object_name => 'user'
- #
- # You can also use a number of objects, which will have the same naming semantics
- # as a single object.
- #
- # error_messages_for @user, @post
- #
- # If the objects cannot be located as instance variables, you can add an extra :object parameter which gives the actual
- # object (or array of objects to use):
- #
- # error_messages_for 'user', :object => @question.user
- #
- # NOTE: This is a pre-packaged presentation of the errors with embedded strings and a certain HTML structure. If what
- # you need is significantly different from the default presentation, it makes plenty of sense to access the object.errors
- # instance yourself and set it up. View the source of this method to see how easy it is.
- def error_messages_for(*params)
- options = params.extract_options!.symbolize_keys
-
- objects = Array.wrap(options.delete(:object) || params).map do |object|
- object = instance_variable_get("@#{object}") unless object.respond_to?(:to_model)
- object = convert_to_model(object)
-
- if object.class.respond_to?(:model_name)
- options[:object_name] ||= object.class.model_name.human.downcase
- end
-
- object
- end
-
- objects.compact!
- count = objects.inject(0) {|sum, object| sum + object.errors.count }
-
- unless count.zero?
- html = {}
- [:id, :class].each do |key|
- if options.include?(key)
- value = options[key]
- html[key] = value unless value.blank?
- else
- html[key] = 'errorExplanation'
- end
- end
- options[:object_name] ||= params.first
-
- I18n.with_options :locale => options[:locale], :scope => [:errors, :template] do |locale|
- header_message = if options.include?(:header_message)
- options[:header_message]
- else
- locale.t :header, :count => count, :model => options[:object_name].to_s.gsub('_', ' ')
- end
-
- message = options.include?(:message) ? options[:message] : locale.t(:body)
-
- error_messages = objects.sum do |object|
- object.errors.full_messages.map do |msg|
- content_tag(:li, msg)
- end
- end.join.html_safe
-
- contents = ''
- contents << content_tag(options[:header_tag] || :h2, header_message) unless header_message.blank?
- contents << content_tag(:p, message) unless message.blank?
- contents << content_tag(:ul, error_messages)
-
- content_tag(:div, contents.html_safe, html)
- end
- else
- ''
- end
- end
-
- private
-
- def all_input_tags(record, record_name, options)
- input_block = options[:input_block] || default_input_block
- record.class.content_columns.collect{ |column| input_block.call(record_name, column) }.join("\n")
- end
-
- def default_input_block
- Proc.new { |record, column| %(#{column.human_name} #{input(record, column.name)}
) }
- end
-
- module InstanceTagMethods
- def to_tag(options = {})
- case column_type
- when :string
- field_type = @method_name.include?("password") ? "password" : "text"
- to_input_field_tag(field_type, options)
- when :text
- to_text_area_tag(options)
- when :integer, :float, :decimal
- to_input_field_tag("text", options)
- when :date
- to_date_select_tag(options)
- when :datetime, :timestamp
- to_datetime_select_tag(options)
- when :time
- to_time_select_tag(options)
- when :boolean
- to_boolean_select_tag(options)
- end
- end
-
- def column_type
- object.send(:column_for_attribute, @method_name).type
- end
- end
-
- module FormBuilderMethods
- def error_message_on(method, *args)
- @template.error_message_on(@object || @object_name, method, *args)
- end
-
- def error_messages(options = {})
- @template.error_messages_for(@object_name, objectify_options(options))
- end
- end
- end
-
- class InstanceTag
- include DynamicForm::InstanceTagMethods
- end
-
- class FormBuilder
- include DynamicForm::FormBuilderMethods
- end
- end
-end
-
-I18n.load_path << File.expand_path("../../locale/en.yml", __FILE__)
diff --git a/lib/plugins/dynamic_form/lib/action_view/locale/en.yml b/lib/plugins/dynamic_form/lib/action_view/locale/en.yml
deleted file mode 100644
index c7c6326c5e..0000000000
--- a/lib/plugins/dynamic_form/lib/action_view/locale/en.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-#-- copyright
-# OpenProject is a project management system.
-# Copyright (C) 2012-2013 the OpenProject Foundation (OPF)
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License version 3.
-#
-# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
-# Copyright (C) 2006-2013 Jean-Philippe Lang
-# Copyright (C) 2010-2013 the ChiliProject Team
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# See doc/COPYRIGHT.rdoc for more details.
-#++
-
-en:
- errors:
- template:
- header:
- one: "1 error prohibited this %{model} from being saved"
- other: "%{count} errors prohibited this %{model} from being saved"
- # The variable :count is also available
- body: "There were problems with the following fields:"
diff --git a/lib/plugins/dynamic_form/lib/dynamic_form.rb b/lib/plugins/dynamic_form/lib/dynamic_form.rb
deleted file mode 100644
index c1d1a3a43d..0000000000
--- a/lib/plugins/dynamic_form/lib/dynamic_form.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-require 'action_view/helpers/dynamic_form'
-
-class ActionView::Base
- include DynamicForm
-end
diff --git a/lib/plugins/dynamic_form/test/dynamic_form_i18n_test.rb b/lib/plugins/dynamic_form/test/dynamic_form_i18n_test.rb
deleted file mode 100644
index 81dfedb682..0000000000
--- a/lib/plugins/dynamic_form/test/dynamic_form_i18n_test.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-require 'test_helper'
-
-class DynamicFormI18nTest < Test::Unit::TestCase
- include ActionView::Context
- include ActionView::Helpers::DynamicForm
-
- attr_reader :request
-
- def setup
- @object = stub :errors => stub(:count => 1, :full_messages => ['full_messages'])
- @object.stub :to_model => @object
- @object.stub :class => stub(:model_name => stub(:human => ""))
-
- @object_name = 'book_seller'
- @object_name_without_underscore = 'book seller'
-
- stub(:content_tag).and_return 'content_tag'
-
- I18n.stub(:t).with(:'header', :locale => 'en', :scope => [:errors, :template], :count => 1, :model => '').and_return "1 error prohibited this from being saved"
- I18n.stub(:t).with(:'body', :locale => 'en', :scope => [:errors, :template]).and_return 'There were problems with the following fields:'
- end
-
- def test_error_messages_for_given_a_header_option_it_does_not_translate_header_message
- I18n.should_receive(:t).with(:'header', :locale => 'en', :scope => [:errors, :template], :count => 1, :model => '').never
- error_messages_for(:object => @object, :header_message => 'header message', :locale => 'en')
- end
-
- def test_error_messages_for_given_no_header_option_it_translates_header_message
- I18n.should_receive(:t).with(:'header', :locale => 'en', :scope => [:errors, :template], :count => 1, :model => '').and_return 'header message'
- error_messages_for(:object => @object, :locale => 'en')
- end
-
- def test_error_messages_for_given_a_message_option_it_does_not_translate_message
- I18n.should_receive(:t).with(:'body', :locale => 'en', :scope => [:errors, :template]).never
- error_messages_for(:object => @object, :message => 'message', :locale => 'en')
- end
-
- def test_error_messages_for_given_no_message_option_it_translates_message
- I18n.should_receive(:t).with(:'body', :locale => 'en', :scope => [:errors, :template]).and_return 'There were problems with the following fields:'
- error_messages_for(:object => @object, :locale => 'en')
- end
-end
\ No newline at end of file
diff --git a/lib/plugins/dynamic_form/test/dynamic_form_test.rb b/lib/plugins/dynamic_form/test/dynamic_form_test.rb
deleted file mode 100644
index e616cba4e2..0000000000
--- a/lib/plugins/dynamic_form/test/dynamic_form_test.rb
+++ /dev/null
@@ -1,370 +0,0 @@
-require 'test_helper'
-require 'action_view/template/handlers/erb'
-
-class DynamicFormTest < ActionView::TestCase
- tests ActionView::Helpers::DynamicForm
-
- def form_for(*)
- @output_buffer = super
- end
-
- silence_warnings do
- class Post < Struct.new(:title, :author_name, :body, :secret, :written_on)
- extend ActiveModel::Naming
- include ActiveModel::Conversion
- end
-
- class User < Struct.new(:email)
- extend ActiveModel::Naming
- include ActiveModel::Conversion
- end
-
- class Column < Struct.new(:type, :name, :human_name)
- extend ActiveModel::Naming
- include ActiveModel::Conversion
- end
- end
-
- class DirtyPost
- class Errors
- def empty?
- false
- end
-
- def count
- 1
- end
-
- def full_messages
- ["Author name can't be empty "]
- end
-
- def [](field)
- ["can't be empty "]
- end
- end
-
- def errors
- Errors.new
- end
- end
-
- def setup_post
- @post = Post.new
- def @post.errors
- Class.new {
- def [](field)
- case field.to_s
- when "author_name"
- ["can't be empty"]
- when "body"
- ['foo']
- else
- []
- end
- end
- def empty?() false end
- def count() 1 end
- def full_messages() [ "Author name can't be empty" ] end
- }.new
- end
-
- def @post.persisted?() false end
- def @post.to_param() nil end
-
- def @post.column_for_attribute(attr_name)
- Post.content_columns.select { |column| column.name == attr_name }.first
- end
-
- silence_warnings do
- def Post.content_columns() [ Column.new(:string, "title", "Title"), Column.new(:text, "body", "Body") ] end
- end
-
- @post.title = "Hello World"
- @post.author_name = ""
- @post.body = "Back to the hill and over it again!"
- @post.secret = 1
- @post.written_on = Date.new(2004, 6, 15)
- end
-
- def setup_user
- @user = User.new
- def @user.errors
- Class.new {
- def [](field) field == "email" ? ['nonempty'] : [] end
- def empty?() false end
- def count() 1 end
- def full_messages() [ "User email can't be empty" ] end
- }.new
- end
-
- def @user.new_record?() true end
- def @user.to_param() nil end
-
- def @user.column_for_attribute(attr_name)
- User.content_columns.select { |column| column.name == attr_name }.first
- end
-
- silence_warnings do
- def User.content_columns() [ Column.new(:string, "email", "Email") ] end
- end
-
- @user.email = ""
- end
-
- def protect_against_forgery?
- @protect_against_forgery ? true : false
- end
- attr_accessor :request_forgery_protection_token, :form_authenticity_token
-
- def setup
- super
- setup_post
- setup_user
-
- @response = ActionController::TestResponse.new
- end
-
- def url_for(options)
- options = options.symbolize_keys
- [options[:action], options[:id].to_param].compact.join('/')
- end
-
- def test_generic_input_tag
- assert_dom_equal(
- %( ), input("post", "title")
- )
- end
-
- def test_text_area_with_errors
- assert_dom_equal(
- %(Back to the hill and over it again!
),
- text_area("post", "body")
- )
- end
-
- def test_text_field_with_errors
- assert_dom_equal(
- %(
),
- text_field("post", "author_name")
- )
- end
-
- def test_field_error_proc
- old_proc = ActionView::Base.field_error_proc
- ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
- %(#{html_tag} #{[instance.error_message].join(', ')}
).html_safe
- end
-
- assert_dom_equal(
- %( can't be empty
),
- text_field("post", "author_name")
- )
- ensure
- ActionView::Base.field_error_proc = old_proc if old_proc
- end
-
- def test_form_with_string
- assert_dom_equal(
- %(Title
\nBody
Back to the hill and over it again!
),
- form("post")
- )
-
- silence_warnings do
- class << @post
- def persisted?() true end
- def to_param() id end
- def id() 1 end
- end
- end
-
- assert_dom_equal(
- %(Title
\nBody
Back to the hill and over it again!
),
- form("post")
- )
- end
-
- def test_form_with_protect_against_forgery
- @protect_against_forgery = true
- @request_forgery_protection_token = 'authenticity_token'
- @form_authenticity_token = '123'
- assert_dom_equal(
- %(
Title
\nBody
Back to the hill and over it again!
),
- form("post")
- )
- end
-
- def test_form_with_method_option
- assert_dom_equal(
- %(Title
\nBody
Back to the hill and over it again!
),
- form("post", :method=>'get')
- )
- end
-
- def test_form_with_action_option
- output_buffer << form("post", :action => "sign")
- assert_select "form[action=sign]" do |form|
- assert_select "input[type=submit][value=Sign]"
- end
- end
-
- def test_form_with_date
- silence_warnings do
- def Post.content_columns() [ Column.new(:date, "written_on", "Written on") ] end
- end
-
- assert_dom_equal(
- %(Written on \n1999 \n2000 \n2001 \n2002 \n2003 \n2004 \n2005 \n2006 \n2007 \n2008 \n2009 \n \n\nJanuary \nFebruary \nMarch \nApril \nMay \nJune \nJuly \nAugust \nSeptember \nOctober \nNovember \nDecember \n \n\n1 \n2 \n3 \n4 \n5 \n6 \n7 \n8 \n9 \n10 \n11 \n12 \n13 \n14 \n15 \n16 \n17 \n18 \n19 \n20 \n21 \n22 \n23 \n24 \n25 \n26 \n27 \n28 \n29 \n30 \n31 \n \n
),
- form("post")
- )
- end
-
- def test_form_with_datetime
- silence_warnings do
- def Post.content_columns() [ Column.new(:datetime, "written_on", "Written on") ] end
- end
- @post.written_on = Time.gm(2004, 6, 15, 16, 30)
-
- assert_dom_equal(
- %(Written on \n1999 \n2000 \n2001 \n2002 \n2003 \n2004 \n2005 \n2006 \n2007 \n2008 \n2009 \n \n\nJanuary \nFebruary \nMarch \nApril \nMay \nJune \nJuly \nAugust \nSeptember \nOctober \nNovember \nDecember \n \n\n1 \n2 \n3 \n4 \n5 \n6 \n7 \n8 \n9 \n10 \n11 \n12 \n13 \n14 \n15 \n16 \n17 \n18 \n19 \n20 \n21 \n22 \n23 \n24 \n25 \n26 \n27 \n28 \n29 \n30 \n31 \n \n — \n00 \n01 \n02 \n03 \n04 \n05 \n06 \n07 \n08 \n09 \n10 \n11 \n12 \n13 \n14 \n15 \n16 \n17 \n18 \n19 \n20 \n21 \n22 \n23 \n \n : \n00 \n01 \n02 \n03 \n04 \n05 \n06 \n07 \n08 \n09 \n10 \n11 \n12 \n13 \n14 \n15 \n16 \n17 \n18 \n19 \n20 \n21 \n22 \n23 \n24 \n25 \n26 \n27 \n28 \n29 \n30 \n31 \n32 \n33 \n34 \n35 \n36 \n37 \n38 \n39 \n40 \n41 \n42 \n43 \n44 \n45 \n46 \n47 \n48 \n49 \n50 \n51 \n52 \n53 \n54 \n55 \n56 \n57 \n58 \n59 \n \n
),
- form("post")
- )
- end
-
- def test_error_for_block
- assert_dom_equal %(1 error prohibited this post from being saved There were problems with the following fields:
Author name can't be empty ), error_messages_for("post")
- assert_equal %(1 error prohibited this post from being saved There were problems with the following fields:
Author name can't be empty ), error_messages_for("post", :class => "errorDeathByClass", :id => "errorDeathById", :header_tag => "h1")
- assert_equal %(1 error prohibited this post from being saved There were problems with the following fields:
Author name can't be empty ), error_messages_for("post", :class => nil, :id => "errorDeathById", :header_tag => "h1")
- assert_equal %(1 error prohibited this post from being saved There were problems with the following fields:
Author name can't be empty ), error_messages_for("post", :class => "errorDeathByClass", :id => nil, :header_tag => "h1")
- end
-
- def test_error_messages_for_escapes_html
- @dirty_post = DirtyPost.new
- assert_dom_equal %(1 error prohibited this dirty post from being saved There were problems with the following fields:
Author name can't be <em>empty</em> ), error_messages_for("dirty_post")
- end
-
- def test_error_messages_for_handles_nil
- assert_equal "", error_messages_for("notthere")
- end
-
- def test_error_message_on_escapes_html
- @dirty_post = DirtyPost.new
- assert_dom_equal "can't be <em>empty</em>
", error_message_on(:dirty_post, :author_name)
- end
-
- def test_error_message_on_handles_nil
- assert_equal "", error_message_on("notthere", "notthere")
- end
-
- def test_error_message_on
- assert_dom_equal "can't be empty
", error_message_on(:post, :author_name)
- end
-
- def test_error_message_on_no_instance_variable
- other_post = @post
- assert_dom_equal "can't be empty
", error_message_on(other_post, :author_name)
- end
-
- def test_error_message_on_with_options_hash
- assert_dom_equal "beforecan't be emptyafter
", error_message_on(:post, :author_name, :css_class => 'differentError', :prepend_text => 'before', :append_text => 'after')
- end
-
- def test_error_message_on_with_tag_option_in_options_hash
- assert_dom_equal "beforecan't be emptyafter ", error_message_on(:post, :author_name, :html_tag => "span", :css_class => 'differentError', :prepend_text => 'before', :append_text => 'after')
- end
-
- def test_error_message_on_handles_empty_errors
- assert_equal "", error_message_on(@post, :tag)
- end
-
- def test_error_messages_for_many_objects
- assert_dom_equal %(2 errors prohibited this post from being saved There were problems with the following fields:
Author name can't be empty User email can't be empty ), error_messages_for("post", "user")
-
- # reverse the order, error order changes and so does the title
- assert_dom_equal %(2 errors prohibited this user from being saved There were problems with the following fields:
User email can't be empty Author name can't be empty ), error_messages_for("user", "post")
-
- # add the default to put post back in the title
- assert_dom_equal %(2 errors prohibited this post from being saved There were problems with the following fields:
User email can't be empty Author name can't be empty ), error_messages_for("user", "post", :object_name => "post")
-
- # symbols work as well
- assert_dom_equal %(2 errors prohibited this post from being saved There were problems with the following fields:
User email can't be empty Author name can't be empty ), error_messages_for(:user, :post, :object_name => :post)
-
- # any default works too
- assert_dom_equal %(2 errors prohibited this monkey from being saved There were problems with the following fields:
User email can't be empty Author name can't be empty ), error_messages_for(:user, :post, :object_name => "monkey")
-
- # should space object name
- assert_dom_equal %(2 errors prohibited this chunky bacon from being saved There were problems with the following fields:
User email can't be empty Author name can't be empty ), error_messages_for(:user, :post, :object_name => "chunky_bacon")
-
- # hide header and explanation messages with nil or empty string
- assert_dom_equal %(User email can't be empty Author name can't be empty ), error_messages_for(:user, :post, :header_message => nil, :message => "")
-
- # override header and explanation messages
- header_message = "Yikes! Some errors"
- message = "Please fix the following fields and resubmit:"
- assert_dom_equal %(#{header_message} #{message}
User email can't be empty Author name can't be empty ), error_messages_for(:user, :post, :header_message => header_message, :message => message)
- end
-
- def test_error_messages_for_non_instance_variable
- actual_user = @user
- actual_post = @post
- @user = nil
- @post = nil
-
- #explicitly set object
- assert_dom_equal %(1 error prohibited this post from being saved There were problems with the following fields:
Author name can't be empty ), error_messages_for("post", :object => actual_post)
-
- #multiple objects
- assert_dom_equal %(2 errors prohibited this user from being saved There were problems with the following fields:
User email can't be empty Author name can't be empty ), error_messages_for("user", "post", :object => [actual_user, actual_post])
-
- #nil object
- assert_equal '', error_messages_for('user', :object => nil)
- end
-
- def test_error_messages_for_model_objects
- error = error_messages_for(@post)
- assert_dom_equal %(1 error prohibited this post from being saved There were problems with the following fields:
Author name can't be empty ),
- error
-
- error = error_messages_for(@user, @post)
- assert_dom_equal %(2 errors prohibited this user from being saved There were problems with the following fields:
User email can't be empty Author name can't be empty ),
- error
- end
-
- def test_form_with_string_multipart
- assert_dom_equal(
- %(Title
\nBody
Back to the hill and over it again!
),
- form("post", :multipart => true)
- )
- end
-
- def test_default_form_builder_with_dynamic_form_helpers
- form_for(@post, :as => :post, :url => {}) do |f|
- concat f.error_message_on('author_name')
- concat f.error_messages
- end
-
- expected = %() +
- %(can't be empty
) +
- %(1 error prohibited this post from being saved There were problems with the following fields:
Author name can't be empty ) +
- %( )
-
- assert_dom_equal expected, output_buffer
- end
-
- def test_default_form_builder_no_instance_variable
- post = @post
- @post = nil
-
- form_for(post, :as => :post, :url => {}) do |f|
- concat f.error_message_on('author_name')
- concat f.error_messages
- end
-
- expected = %() +
- %(can't be empty
) +
- %(1 error prohibited this post from being saved There were problems with the following fields:
Author name can't be empty ) +
- %( )
-
- assert_dom_equal expected, output_buffer
- end
-end
\ No newline at end of file
diff --git a/lib/plugins/dynamic_form/test/test_helper.rb b/lib/plugins/dynamic_form/test/test_helper.rb
deleted file mode 100644
index f62a43cce0..0000000000
--- a/lib/plugins/dynamic_form/test/test_helper.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-require 'rubygems'
-require 'test/unit'
-require 'active_support'
-require 'active_support/core_ext'
-require 'action_view'
-require 'action_controller'
-require 'action_controller/test_case'
-require 'active_model'
-require 'action_view/helpers/dynamic_form'