]> source.dussan.org Git - redmine.git/commitdiff
Added default value for custom fields. Fixed javascript on custom field form for...
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 20 Jan 2008 21:29:51 +0000 (21:29 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 20 Jan 2008 21:29:51 +0000 (21:29 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1090 e93f8b46-1217-0410-a6f0-8f06a7374b81

29 files changed:
app/models/custom_field.rb
app/models/custom_value.rb
app/views/custom_fields/_form.rhtml
lang/bg.yml
lang/cs.yml
lang/de.yml
lang/en.yml
lang/es.yml
lang/fi.yml
lang/fr.yml
lang/he.yml
lang/it.yml
lang/ja.yml
lang/ko.yml
lang/lt.yml
lang/nl.yml
lang/pl.yml
lang/pt-br.yml
lang/pt.yml
lang/ro.yml
lang/ru.yml
lang/sr.yml
lang/sv.yml
lang/zh-tw.yml
lang/zh.yml
test/fixtures/custom_fields.yml
test/functional/issues_controller_test.rb
test/integration/issues_test.rb
test/unit/custom_value_test.rb

index 5a134c4ec965fe922d6c17d837b94fbaec85d77a..6be081b0be61f9dafdd35cb36c1b1ebe9033de38 100644 (file)
@@ -53,6 +53,11 @@ class CustomField < ActiveRecord::Base
       errors.add(:possible_values, :activerecord_error_blank) if self.possible_values.nil? || self.possible_values.empty?
       errors.add(:possible_values, :activerecord_error_invalid) unless self.possible_values.is_a? Array
     end
+    
+    # validate default value
+    v = CustomValue.new(:custom_field => self.dup, :value => default_value, :customized => nil)
+    v.custom_field.is_required = false
+    errors.add(:default_value, :activerecord_error_invalid) unless v.valid?
   end
 
   def <=>(field)
index c3d6b7bb9d1deaa33bd547639b259f4382770a6a..94b797bcca315dcb174fa3170aec7dc669de34a3 100644 (file)
@@ -19,6 +19,12 @@ class CustomValue < ActiveRecord::Base
   belongs_to :custom_field
   belongs_to :customized, :polymorphic => true
 
+  def after_initialize
+    if custom_field && new_record? && (customized_type.blank? || (customized && customized.new_record?))
+      self.value ||= custom_field.default_value
+    end
+  end
+  
 protected
   def validate
     errors.add(:value, :activerecord_error_blank) and return if custom_field.is_required? and value.blank?    
index 915daab32bebfeb6230f3d0ad594281174f5c165..5e4eadf21f713f924b1fb9225b37d2771dc319d7 100644 (file)
@@ -8,31 +8,42 @@ function toggle_custom_field_format() {
   p_regexp = $("custom_field_regexp");
   p_values = $("custom_field_possible_values");
   p_searchable = $("custom_field_searchable");
+  p_default = $("custom_field_default_value");
+  
+  p_default.setAttribute('type','text');
+  Element.show(p_default.parentNode);
+  
   switch (format.value) {
     case "list":
       Element.hide(p_length.parentNode);
       Element.hide(p_regexp.parentNode);
-      Element.show(p_searchable.parentNode);
+      if (p_searchable) Element.show(p_searchable.parentNode);
       Element.show(p_values);
       break;
-    case "date":
     case "bool":
+      p_default.setAttribute('type','checkbox');
+      Element.hide(p_length.parentNode);
+      Element.hide(p_regexp.parentNode);
+      if (p_searchable) Element.hide(p_searchable.parentNode);
+      Element.hide(p_values);
+      break;
+    case "date":
       Element.hide(p_length.parentNode);
       Element.hide(p_regexp.parentNode);
-      Element.hide(p_searchable.parentNode);
+      if (p_searchable) Element.hide(p_searchable.parentNode);
       Element.hide(p_values);
       break;
     case "float":
     case "int":
       Element.show(p_length.parentNode);
       Element.show(p_regexp.parentNode);
-      Element.hide(p_searchable.parentNode);
+      if (p_searchable) Element.hide(p_searchable.parentNode);
       Element.hide(p_values);
       break;
     default:
       Element.show(p_length.parentNode);
       Element.show(p_regexp.parentNode);
-      Element.show(p_searchable.parentNode);
+      if (p_searchable) Element.show(p_searchable.parentNode);
       Element.hide(p_values);
       break;
   }
@@ -70,6 +81,7 @@ function deleteValueField(e) {
 <span><%= text_field_tag 'custom_field[possible_values][]', value, :size => 30 %> <%= image_to_function "delete.png", "deleteValueField(this);return false" %><br /></span>
 <% end %>
 </p>
+<p><%= @custom_field.field_format == 'bool' ? f.check_box(:default_value) : f.text_field(:default_value) %></p>
 </div>
 
 <div class="box">
index 7f994acd404b3ed658132a37631c5125e5e4a4b2..2c83b966f15a180d7d55973cb1eddc474b64f250 100644 (file)
@@ -161,6 +161,7 @@ field_delay: Отместване
 field_assignable: Възможно е възлагане на задачи за тази роля
 field_redirect_existing_links: Пренасочване на съществуващи линкове
 field_estimated_hours: Изчислено време
+field_default_value: Статус по подразбиране
 
 setting_app_title: Заглавие
 setting_app_subtitle: Описание
index 6e904c106eaaf4e0b6ef90c6b2c56d1fb9ad4238..cde58fe17237289ed40c9495615f6262f607bd8e 100644 (file)
@@ -159,6 +159,7 @@ field_is_filter: Used as a filter
 field_issue_to_id: Vztažený požadavek
 field_delay: Zpoždění
 field_assignable: Požadavky mohou být přiřazeny této roli
+field_default_value: Výchozí stav
 
 setting_app_title: Titulek aplikace
 setting_app_subtitle: Podtitulek aplikace
index 27ca40a3d774e11f1109aab87af82b0ca7209abc..a23e9c53312840eecb82b8d9a1c31c8cdcfd97d3 100644 (file)
@@ -161,6 +161,7 @@ field_delay: Pufferzeit
 field_assignable: Tickets können dieser Rolle zugewiesen werden
 field_redirect_existing_links: Existierende Links umleiten
 field_estimated_hours: Geschätzter Aufwand
+field_default_value: Default
 
 setting_app_title: Applikations-Titel
 setting_app_subtitle: Applikations-Untertitel
index 6580d398aedd0aa56f7c06b4d933851a3e46e9e9..dc7b04dd2b92d0c00131ab664b2467b55db976a8 100644 (file)
@@ -174,6 +174,7 @@ field_estimated_hours: Estimated time
 field_column_names: Columns
 field_time_zone: Time zone
 field_searchable: Searchable
+field_default_value: Default value
 
 setting_app_title: Application title
 setting_app_subtitle: Application subtitle
index 1c6776555a4f6fc87750476f5010c159a37a8820..8e9ffaa2fcce946cfdda7b6a2c7d2b364481b94b 100644 (file)
@@ -155,6 +155,7 @@ field_identifier: Identificador
 field_is_filter: Usado como filtro
 field_issue_to_id: Petición Relacionada
 field_delay: Retraso
+field_default_value: Estado por defecto
 
 setting_app_title: Título de la aplicación
 setting_app_subtitle: Subtítulo de la aplicación
index 7eba540a721d266bef68d212b55d5f957e1a090f..497647ad98ab709b2788603d8f1f28000c6ed3a5 100644 (file)
@@ -174,6 +174,7 @@ field_estimated_hours: Arvioitu aika
 field_column_names: Saraketta
 field_time_zone: Aikavyöhyke
 field_searchable: Haettava
+field_default_value: Vakio arvo
 
 setting_app_title: Ohjelman otsikko
 setting_app_subtitle: Ohjelman alaotsikko
index ce3817d3c861b46de7346a903a7e52f601c0ad80..854ed585943c341a927b0b4146c613b16ec160b0 100644 (file)
@@ -174,6 +174,7 @@ field_estimated_hours: Temps estimé
 field_column_names: Colonnes
 field_time_zone: Fuseau horaire
 field_searchable: Utilisé pour les recherches
+field_default_value: Valeur par défaut
 
 setting_app_title: Titre de l'application
 setting_app_subtitle: Sous-titre de l'application
index 928c68baacaf42ebfaeadc9ccb54d532891453e5..3e8ad4160ee2d1497f7e5d4849facbd2d850ac56 100644 (file)
@@ -164,6 +164,7 @@ field_assignable: ניתן להקצות נושאים לתפקיד זה
 field_redirect_existing_links: העבר קישורים קיימים
 field_estimated_hours: זמן משוער
 field_column_names: עמודות
+field_default_value: ערך ברירת מחדל
 
 setting_app_title: כותרת ישום
 setting_app_subtitle: תת-כותרת ישום
index a162281499760deee884208b6fb92434dcf17c26..ca4b3391acd3912ef1ee3e2eff784afc890649f1 100644 (file)
@@ -161,6 +161,7 @@ field_delay: Delay
 field_assignable: Issues can be assigned to this role
 field_redirect_existing_links: Redirect existing links
 field_estimated_hours: Estimated time
+field_default_value: Stato predefinito
 
 setting_app_title: Titolo applicazione
 setting_app_subtitle: Sottotitolo applicazione
index 56f846947b4b2a3e5a15a8d69f734e0ed8e4e756..713af6b467f523986e60133b2fc394f29caa3d88 100644 (file)
@@ -162,6 +162,7 @@ field_delay: 遅延
 field_assignable: 問題はこのロールに割り当てることができます
 field_redirect_existing_links: 既存のリンクをリダイレクトする
 field_estimated_hours: 予定工数
+field_default_value: デフォルトのステータス
 
 setting_app_title: アプリケーションのタイトル
 setting_app_subtitle: アプリケーションのサブタイトル
index 7a509478e4c1841f49b503e5ba80132fb9a44519..564e67253452c01acea8c926bf0da5d2c1b258af 100644 (file)
@@ -164,6 +164,7 @@ field_assignable: 이 역할에 할당될수 있는 티켓
 field_redirect_existing_links: Redirect existing links
 field_estimated_hours: 추정시간
 field_column_names: 컬럼
+field_default_value: 기본값
 
 setting_app_title: 레드마인 제목
 setting_app_subtitle: 레드마인 부제목
index 8455260f178bc6b454421f22b0bf165c7e882f4d..d95da746948a6451ea3ab47e9669e8a7941bd39a 100644 (file)
@@ -171,7 +171,8 @@ field_estimated_hours: Apskaičiuotas laikas
 field_column_names: Skiltys 
 field_time_zone: Laiko juosta 
 field_searchable: Randamas 
+field_default_value: Numatytoji vertė 
+
 setting_app_title: Programos pavadinimas 
 setting_app_subtitle: Programos paantraštė 
 setting_welcome_text: Pasveikinimas 
index 92e5a5971111ee05eb480bf66fb68541b6c250bc..8d29ab90235aba52fea6d7214328387137bd68bb 100644 (file)
@@ -109,7 +109,7 @@ field_issue: Issue
 field_status: Status
 field_notes: Notities
 field_is_closed: Issue gesloten
-field_is_default: Default status
+field_is_default: Default
 field_tracker: Tracker
 field_subject: Onderwerp
 field_due_date: Verwachte datum gereed
@@ -161,6 +161,7 @@ field_delay: Vertraging
 field_assignable: Issues can be assigned to this role
 field_redirect_existing_links: Redirect existing links
 field_estimated_hours: Estimated time
+field_default_value: Default value
 
 setting_app_title: Applicatie titel
 setting_app_subtitle: Applicatie ondertitel
index 548917a363e539f77607660a1e17145344d18510..69bf5306af9b23ae37a4782aef77f628703fd94f 100644 (file)
@@ -155,6 +155,7 @@ field_identifier: Identifikator
 field_is_filter: Atrybut filtrowania
 field_issue_to_id: Powiązania zagadnienia
 field_delay: Opóźnienie
+field_default_value: Domyślny
 
 setting_app_title: Tytuł aplikacji
 setting_app_subtitle: Podtytuł aplikacji
index 45e66cd528e15ed5efcdb96f88999cd2b8f7748b..926c913a06698a09ed9258d41203720122e1eccf 100644 (file)
@@ -161,6 +161,7 @@ field_delay: Delay
 field_assignable: Issues can be assigned to this role\r
 field_redirect_existing_links: Redirect existing links\r
 field_estimated_hours: Estimated time\r
+field_default_value: Padrao\r
 \r
 setting_app_title: Titulo da aplicacao\r
 setting_app_subtitle: Sub-titulo da aplicacao\r
index 54b74c47cea64179d5e9d851c5ba740db216b5b7..88fd9cf745aac8896cd7e20922f99d968f6e5c0d 100644 (file)
@@ -161,6 +161,7 @@ field_delay: Atraso
 field_assignable: Issues can be assigned to this role
 field_redirect_existing_links: Redirect existing links
 field_estimated_hours: Estimated time
+field_default_value: Padrão
 
 setting_app_title: Título da aplicação
 setting_app_subtitle: Sub-título da aplicação
index c3427d26121c35b9d6e9a7abe13debbbccc0f60f..2eb17609c27b6f0c07f174de39e90af13d12cdf2 100644 (file)
@@ -161,6 +161,7 @@ field_delay: Intarziere
 field_assignable: La acest rol se poate atribui tichete
 field_redirect_existing_links: Redirectare linkuri existente
 field_estimated_hours: Timpul estimat
+field_default_value: Default value
 
 setting_app_title: Titlul aplicatiei
 setting_app_subtitle: Subtitlul aplicatiei
index 7bf47c8fce5f265d6daa448f6fad55360315fb57..62799bdf8b2c82e433b28a5274b4a0f228061496 100644 (file)
@@ -166,6 +166,7 @@ field_assignable: Задача может быть назначена этой 
 field_redirect_existing_links: Перенаправить существующие ссылки
 field_estimated_hours: Оцененное время
 field_column_names: Колонки
+field_default_value: Default value
 
 setting_app_title: Название приложения
 setting_app_subtitle: Подзаголовок приложения 
index 6c486a83f510a8349dc0b7f42ef3130379a58de6..6d88d34ffae448e767bc9817d2e94063befb571d 100644 (file)
@@ -166,6 +166,7 @@ field_assignable: Kartice mogu biti dodeljene ovoj ulozi
 field_redirect_existing_links: Redirekcija postojećih linkova
 field_estimated_hours: Procenjeno vreme
 field_column_names: Kolone
+field_default_value: Default value
 
 setting_app_title: Naziv aplikacije
 setting_app_subtitle: Podnaslov aplikacije
index 0cb9a2d67bc030a508e8f3df51769e09f1328aaa..5f4a011267f0661d85baef419186c17dddddbac7 100644 (file)
@@ -161,6 +161,7 @@ field_delay: Delay
 field_assignable: Issues can be assigned to this role
 field_redirect_existing_links: Redirect existing links
 field_estimated_hours: Estimated time
+field_default_value: Default value
 
 setting_app_title: Applikationstitel
 setting_app_subtitle: Applicationsunderrubrik
index 465855b589410d2cf2e218562c5e86740e098a87..2a431266e7de3f97f68185fa3280f7f2fe34e1ae 100644 (file)
@@ -174,6 +174,7 @@ field_estimated_hours: 預估工時
 field_column_names: Columns
 field_time_zone: 時區
 field_searchable: 可用做搜尋條件
+field_default_value: Default value
 
 setting_app_title: 標題
 setting_app_subtitle: 副標題
index c42c60face0fd0e2dcf61ddfb24ee5ad81667484..b87a1515d8547da2eab997bef378c6ecf1c7c397 100644 (file)
@@ -164,6 +164,7 @@ field_delay: Delay
 field_assignable: Issues can be assigned to this role
 field_redirect_existing_links: Redirect existing links
 field_estimated_hours: Estimated time
+field_default_value: Default value
 
 setting_app_title: 应用程序标题
 setting_app_subtitle: 应用程序子标题
index e73e6de96a5dec20fc63818238a24fe607fea4b1..e58d8e3dc1b7b18484415fc9faa69b765b1fef29 100644 (file)
@@ -10,6 +10,7 @@ custom_fields_001:
   id: 1\r
   is_required: false\r
   field_format: list\r
+  default_value: ""\r
 custom_fields_002: \r
   name: Searchable field\r
   min_length: 1\r
@@ -22,6 +23,7 @@ custom_fields_002:
   is_required: false\r
   field_format: string\r
   searchable: true\r
+  default_value: "Default string"\r
 custom_fields_003: \r
   name: Development status\r
   min_length: 0\r
@@ -33,6 +35,7 @@ custom_fields_003:
   id: 3\r
   is_required: true\r
   field_format: list\r
+  default_value: ""\r
 custom_fields_004: \r
   name: Phone number\r
   min_length: 0\r
@@ -44,6 +47,7 @@ custom_fields_004:
   id: 4\r
   is_required: false\r
   field_format: string\r
+  default_value: ""\r
 custom_fields_005: \r
   name: Money\r
   min_length: 0\r
@@ -55,4 +59,5 @@ custom_fields_005:
   id: 5\r
   is_required: false\r
   field_format: float\r
+  default_value: ""\r
   
\ No newline at end of file
index 05bfc96e3d86f6b5f327b224a2a832e5630bcc93..f4c99f1edf173db642eaa876e0a6fb9216ad336e 100644 (file)
@@ -34,7 +34,10 @@ class IssuesControllerTest < Test::Unit::TestCase
            :enabled_modules,
            :enumerations,
            :attachments,
-           :workflows
+           :workflows,
+           :custom_fields,
+           :custom_values,
+           :custom_fields_trackers
   
   def setup
     @controller = IssuesController.new
@@ -132,6 +135,9 @@ class IssuesControllerTest < Test::Unit::TestCase
     get :new, :project_id => 1, :tracker_id => 1
     assert_response :success
     assert_template 'new'
+    
+    assert_tag :tag => 'input', :attributes => { :name => 'custom_fields[2]',
+                                                 :value => 'Default string' }
   end
 
   def test_get_new_without_tracker_id
@@ -162,9 +168,16 @@ class IssuesControllerTest < Test::Unit::TestCase
                :issue => {:tracker_id => 1,
                           :subject => 'This is the test_new issue',
                           :description => 'This is the description',
-                          :priority_id => 5}
+                          :priority_id => 5},
+               :custom_fields => {'2' => 'Value for field 2'}
     assert_redirected_to 'projects/ecookbook/issues'
-    assert Issue.find_by_subject('This is the test_new issue')
+    
+    issue = Issue.find_by_subject('This is the test_new issue')
+    assert_not_nil issue
+    assert_equal 2, issue.author_id
+    v = issue.custom_values.find_by_custom_field_id(2)
+    assert_not_nil v
+    assert_equal 'Value for field 2', v.value
   end
   
   def test_copy_issue
index 81d27c30fb5f71b04c212c8f07843de77a66ad59..7249ed3da37c8743aeeeb139402a431683769176 100644 (file)
@@ -1,7 +1,16 @@
 require "#{File.dirname(__FILE__)}/../test_helper"
 
 class IssuesTest < ActionController::IntegrationTest
-  fixtures :projects, :users, :trackers, :issue_statuses, :issues,  :enumerations
+  fixtures :projects, 
+           :users,
+           :trackers,
+           :projects_trackers,
+           :issue_statuses,
+           :issues,
+           :enumerations,
+           :custom_fields,
+           :custom_values,
+           :custom_fields_trackers
 
   # create an issue
   def test_add_issue
@@ -18,7 +27,8 @@ class IssuesTest < ActionController::IntegrationTest
                                              :description => "new issue", 
                                              :done_ratio => "0",
                                              :due_date => "",
-                                             :assigned_to_id => "" }
+                                             :assigned_to_id => "" },
+                                 :custom_fields => {'2' => 'Value for field 2'}
     # find created issue
     issue = Issue.find_by_subject("new test issue")
     assert_kind_of Issue, issue
index 24d09fe494da162efa4ac27567eeac755a5f3313..4d488bae222ff05d1c83212b08ae427f52841f28 100644 (file)
@@ -31,4 +31,15 @@ class CustomValueTest < Test::Unit::TestCase
     v.value = '6a'
     assert !v.save
   end
+  
+  def test_default_value
+    field = CustomField.find_by_default_value('Default string')
+    assert_not_nil field
+    
+    v = CustomValue.new(:custom_field => field)
+    assert_equal 'Default string', v.value
+
+    v = CustomValue.new(:custom_field => field, :value => 'Not empty')
+    assert_equal 'Not empty', v.value
+  end
 end