diff --git a/app/helpers/custom_fields_helper.rb b/app/helpers/custom_fields_helper.rb
index 40a4c785..f3fcc1fc 100644
--- a/app/helpers/custom_fields_helper.rb
+++ b/app/helpers/custom_fields_helper.rb
@@ -108,6 +108,6 @@ module CustomFieldsHelper
# Return an array of custom field formats which can be used in select_tag
def custom_field_formats_for_select
- CustomField::FIELD_FORMATS.sort {|a,b| a[1][:order]<=>b[1][:order]}.collect { |k| [ l(k[1][:name]), k[0] ] }
+ Redmine::CustomFieldFormat.as_select
end
end
diff --git a/app/models/custom_field.rb b/app/models/custom_field.rb
index c7031afe..7cc6e865 100644
--- a/app/models/custom_field.rb
+++ b/app/models/custom_field.rb
@@ -20,20 +20,11 @@ class CustomField < ActiveRecord::Base
acts_as_list :scope => 'type = \'#{self.class}\''
serialize :possible_values
- FIELD_FORMATS = { "string" => { :name => :label_string, :order => 1 },
- "text" => { :name => :label_text, :order => 2 },
- "int" => { :name => :label_integer, :order => 3 },
- "float" => { :name => :label_float, :order => 4 },
- "list" => { :name => :label_list, :order => 5 },
- "date" => { :name => :label_date, :order => 6 },
- "bool" => { :name => :label_boolean, :order => 7 }
- }.freeze
-
validates_presence_of :name, :field_format
validates_uniqueness_of :name, :scope => :type
validates_length_of :name, :maximum => 30
validates_format_of :name, :with => /^[\w\s\.\'\-]*$/i
- validates_inclusion_of :field_format, :in => FIELD_FORMATS.keys
+ validates_inclusion_of :field_format, :in => Redmine::CustomFieldFormat.available_formats
def initialize(attributes = nil)
super
diff --git a/app/views/custom_fields/_index.rhtml b/app/views/custom_fields/_index.rhtml
index 8ef7dcba..21ae01be 100644
--- a/app/views/custom_fields/_index.rhtml
+++ b/app/views/custom_fields/_index.rhtml
@@ -14,7 +14,7 @@
<% (@custom_fields_by_type[tab[:name]] || []).sort.each do |custom_field| -%>
">
<%= link_to custom_field.name, :action => 'edit', :id => custom_field %> |
- <%= l(CustomField::FIELD_FORMATS[custom_field.field_format][:name]) %> |
+ <%= l(Redmine::CustomFieldFormat.label_for(custom_field.field_format)) %> |
<%= checked_image custom_field.is_required? %> |
<% if tab[:name] == 'IssueCustomField' %>
<%= checked_image custom_field.is_for_all? %> |
diff --git a/lib/redmine.rb b/lib/redmine.rb
index df57b08d..f510d5d1 100644
--- a/lib/redmine.rb
+++ b/lib/redmine.rb
@@ -2,6 +2,7 @@ require 'redmine/access_control'
require 'redmine/menu_manager'
require 'redmine/activity'
require 'redmine/search'
+require 'redmine/custom_field_format'
require 'redmine/mime_type'
require 'redmine/core_ext'
require 'redmine/themes'
@@ -31,6 +32,16 @@ Redmine::Scm::Base.add "Bazaar"
Redmine::Scm::Base.add "Git"
Redmine::Scm::Base.add "Filesystem"
+Redmine::CustomFieldFormat.map do |fields|
+ fields.register Redmine::CustomFieldFormat.new('string', :label => :label_string, :order => 1)
+ fields.register Redmine::CustomFieldFormat.new('text', :label => :label_text, :order => 2)
+ fields.register Redmine::CustomFieldFormat.new('int', :label => :label_integer, :order => 3)
+ fields.register Redmine::CustomFieldFormat.new('float', :label => :label_float, :order => 4)
+ fields.register Redmine::CustomFieldFormat.new('list', :label => :label_list, :order => 5)
+ fields.register Redmine::CustomFieldFormat.new('date', :label => :label_date, :order => 6)
+ fields.register Redmine::CustomFieldFormat.new('bool', :label => :label_boolean, :order => 7)
+end
+
# Permissions
Redmine::AccessControl.map do |map|
map.permission :view_project, {:projects => [:show, :activity]}, :public => true
diff --git a/lib/redmine/custom_field_format.rb b/lib/redmine/custom_field_format.rb
new file mode 100644
index 00000000..6d42dfba
--- /dev/null
+++ b/lib/redmine/custom_field_format.rb
@@ -0,0 +1,66 @@
+# Redmine - project management software
+# Copyright (C) 2006-2009 Jean-Philippe Lang
+#
+# 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.
+
+module Redmine
+ class CustomFieldFormat
+ include Redmine::I18n
+
+ cattr_accessor :available
+ @@available = {}
+
+ attr_accessor :name, :order, :label
+
+ def initialize(name, options={})
+ self.name = name
+ self.label = options[:label]
+ self.order = options[:order]
+ end
+
+ class << self
+ def map(&block)
+ yield self
+ end
+
+ # Registers a custom field format
+ def register(custom_field_format, options={})
+ @@available[custom_field_format.name] = custom_field_format unless @@available.keys.include?(custom_field_format.name)
+ end
+
+ def available_formats
+ @@available.keys
+ end
+
+ def find_by_name(name)
+ @@available[name.to_s]
+ end
+
+ def label_for(name)
+ format = @@available[name.to_s]
+ format.label if format
+ end
+
+ # Return an array of custom field formats which can be used in select_tag
+ def as_select
+ @@available.values.sort {|a,b|
+ a.order <=> b.order
+ }.collect {|custom_field_format|
+ [ l(custom_field_format.label), custom_field_format.name ]
+ }
+ end
+ end
+ end
+end