summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2014-02-07 07:57:59 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2014-02-07 07:57:59 +0000
commit7b127ee489a134436ab457467c2da42e32aa652d (patch)
tree3b0437c386393ba8690998debd616a76a7f4b312
parent09b95905dc2df3476ac46d2266bb6c9fd4bc2c93 (diff)
downloadredmine-7b127ee489a134436ab457467c2da42e32aa652d.tar.gz
redmine-7b127ee489a134436ab457467c2da42e32aa652d.zip
Show tabs for existing custom field types only and adds a view for choosing the type when adding a new custom field.
git-svn-id: http://svn.redmine.org/redmine/trunk@12849 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--app/controllers/custom_fields_controller.rb2
-rw-r--r--app/helpers/application_helper.rb8
-rw-r--r--app/helpers/custom_fields_helper.rb9
-rw-r--r--app/views/common/_tabs.html.erb2
-rw-r--r--app/views/custom_fields/_index.html.erb2
-rw-r--r--app/views/custom_fields/index.html.erb10
-rw-r--r--app/views/custom_fields/select_type.html.erb15
-rw-r--r--config/locales/en.yml1
-rw-r--r--config/locales/fr.yml1
-rw-r--r--test/functional/custom_fields_controller_test.rb21
10 files changed, 59 insertions, 12 deletions
diff --git a/app/controllers/custom_fields_controller.rb b/app/controllers/custom_fields_controller.rb
index 3f721b145..28178e98b 100644
--- a/app/controllers/custom_fields_controller.rb
+++ b/app/controllers/custom_fields_controller.rb
@@ -77,7 +77,7 @@ class CustomFieldsController < ApplicationController
def build_new_custom_field
@custom_field = CustomField.new_subclass_instance(params[:type], params[:custom_field])
if @custom_field.nil?
- render_404
+ render :action => 'select_type'
end
end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 25096a11d..363653cd8 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -309,9 +309,13 @@ module ApplicationHelper
end
# Renders tabs and their content
- def render_tabs(tabs)
+ def render_tabs(tabs, selected=params[:tab])
if tabs.any?
- render :partial => 'common/tabs', :locals => {:tabs => tabs}
+ unless tabs.detect {|tab| tab[:name] == selected}
+ selected = nil
+ end
+ selected ||= tabs.first[:name]
+ render :partial => 'common/tabs', :locals => {:tabs => tabs, :selected_tab => selected}
else
content_tag 'p', l(:label_no_data), :class => "nodata"
end
diff --git a/app/helpers/custom_fields_helper.rb b/app/helpers/custom_fields_helper.rb
index 5447130a5..173e0d5f8 100644
--- a/app/helpers/custom_fields_helper.rb
+++ b/app/helpers/custom_fields_helper.rb
@@ -40,8 +40,13 @@ module CustomFieldsHelper
:label => DocumentCategory::OptionName}
]
- def custom_fields_tabs
- CUSTOM_FIELDS_TABS
+ def render_custom_fields_tabs(types)
+ tabs = CUSTOM_FIELDS_TABS.select {|h| types.include?(h[:name]) }
+ render_tabs tabs
+ end
+
+ def custom_field_type_options
+ CUSTOM_FIELDS_TABS.map {|h| [l(h[:label]), h[:name]]}
end
def render_custom_field_format_partial(form, custom_field)
diff --git a/app/views/common/_tabs.html.erb b/app/views/common/_tabs.html.erb
index 8cbcda51a..34fd570ea 100644
--- a/app/views/common/_tabs.html.erb
+++ b/app/views/common/_tabs.html.erb
@@ -1,5 +1,3 @@
-<% selected_tab = params[:tab] ? params[:tab].to_s : tabs.first[:name] %>
-
<div class="tabs">
<ul>
<% tabs.each do |tab| -%>
diff --git a/app/views/custom_fields/_index.html.erb b/app/views/custom_fields/_index.html.erb
index 4752c2519..0b578d6ee 100644
--- a/app/views/custom_fields/_index.html.erb
+++ b/app/views/custom_fields/_index.html.erb
@@ -28,5 +28,3 @@
<% end; reset_cycle %>
</tbody>
</table>
-
-<p><%= link_to l(:label_custom_field_new), new_custom_field_path(:type => tab[:name]), :class => 'icon icon-add' %></p>
diff --git a/app/views/custom_fields/index.html.erb b/app/views/custom_fields/index.html.erb
index b4e87f066..e4464132f 100644
--- a/app/views/custom_fields/index.html.erb
+++ b/app/views/custom_fields/index.html.erb
@@ -1,3 +1,11 @@
+<div class="contextual">
+<%= link_to l(:label_custom_field_new), new_custom_field_path, :class => 'icon icon-add' %>
+</div>
+
<%= title l(:label_custom_field_plural) %>
-<%= render_tabs custom_fields_tabs %>
+<% if @custom_fields_by_type.present? %>
+ <%= render_custom_fields_tabs(@custom_fields_by_type.keys) %>
+<% else %>
+ <p class="nodata"><%= l(:label_no_data) %></p>
+<% end %>
diff --git a/app/views/custom_fields/select_type.html.erb b/app/views/custom_fields/select_type.html.erb
new file mode 100644
index 000000000..fd9c5a210
--- /dev/null
+++ b/app/views/custom_fields/select_type.html.erb
@@ -0,0 +1,15 @@
+<%= title [l(:label_custom_field_plural), custom_fields_path],
+ l(:label_custom_field_new) %>
+
+<% selected = 0 %>
+<%= form_tag new_custom_field_path, :method => 'get' do %>
+ <div class="box">
+ <p><%= l(:label_custom_field_select_type) %>:</p>
+ <p>
+ <% custom_field_type_options.each do |name, type| %>
+ <label style="display:block;"><%= radio_button_tag 'type', type, 1==selected+=1 %> <%= name %></label>
+ <% end %>
+ </p>
+ </div>
+ <p><%= submit_tag l(:label_next).html_safe + " &#187;".html_safe, :name => nil %></p>
+<% end %>
diff --git a/config/locales/en.yml b/config/locales/en.yml
index c9256ae40..39b7d8f04 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -910,6 +910,7 @@ en:
label_drop_down_list: drop-down list
label_checkboxes: checkboxes
label_link_values_to: Link values to URL
+ label_custom_field_select_type: Select the type of object to which the custom field is to be attached
button_login: Login
button_submit: Submit
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 2eff8fcd3..ad7ca550d 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -886,6 +886,7 @@ fr:
label_drop_down_list: liste déroulante
label_checkboxes: cases à cocher
label_link_values_to: Lier les valeurs vers l'URL
+ label_custom_field_select_type: Selectionner le type d'objet auquel attacher le champ personnalisé
button_login: Connexion
button_submit: Soumettre
diff --git a/test/functional/custom_fields_controller_test.rb b/test/functional/custom_fields_controller_test.rb
index 394ede20a..76579d74a 100644
--- a/test/functional/custom_fields_controller_test.rb
+++ b/test/functional/custom_fields_controller_test.rb
@@ -30,6 +30,14 @@ class CustomFieldsControllerTest < ActionController::TestCase
assert_template 'index'
end
+ def test_new_without_type_should_render_select_type
+ get :new
+ assert_response :success
+ assert_template 'select_type'
+ assert_select 'input[name=type]', CustomField.subclasses.size
+ assert_select 'input[name=type][checked=checked]', 1
+ end
+
def test_new_should_work_for_each_customized_class_and_format
custom_field_classes.each do |klass|
Redmine::FieldFormat.available_formats.each do |format_name|
@@ -113,9 +121,10 @@ class CustomFieldsControllerTest < ActionController::TestCase
assert_equal 'list', field.field_format
end
- def test_new_with_invalid_custom_field_class_should_render_404
+ def test_new_with_invalid_custom_field_class_should_render_select_type
get :new, :type => 'UnknownCustomField'
- assert_response 404
+ assert_response :success
+ assert_template 'select_type'
end
def test_create_list_custom_field
@@ -160,6 +169,14 @@ class CustomFieldsControllerTest < ActionController::TestCase
assert_template 'new'
end
+ def test_create_without_type_should_render_select_type
+ assert_no_difference 'CustomField.count' do
+ post :create, :custom_field => {:name => ''}
+ end
+ assert_response :success
+ assert_template 'select_type'
+ end
+
def test_edit
get :edit, :id => 1
assert_response :success