diff --git a/app/models/custom_field.rb b/app/models/custom_field.rb index 5a134c4e..6be081b0 100644 --- a/app/models/custom_field.rb +++ b/app/models/custom_field.rb @@ -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) diff --git a/app/models/custom_value.rb b/app/models/custom_value.rb index c3d6b7bb..94b797bc 100644 --- a/app/models/custom_value.rb +++ b/app/models/custom_value.rb @@ -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? diff --git a/app/views/custom_fields/_form.rhtml b/app/views/custom_fields/_form.rhtml index 915daab3..5e4eadf2 100644 --- a/app/views/custom_fields/_form.rhtml +++ b/app/views/custom_fields/_form.rhtml @@ -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); - Element.hide(p_searchable.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); + 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) { <%= text_field_tag 'custom_field[possible_values][]', value, :size => 30 %> <%= image_to_function "delete.png", "deleteValueField(this);return false" %>
<% end %>

+

<%= @custom_field.field_format == 'bool' ? f.check_box(:default_value) : f.text_field(:default_value) %>

diff --git a/lang/bg.yml b/lang/bg.yml index 7f994acd..2c83b966 100644 --- a/lang/bg.yml +++ b/lang/bg.yml @@ -161,6 +161,7 @@ field_delay: Отместване field_assignable: Възможно е възлагане на задачи за тази роля field_redirect_existing_links: Пренасочване на съществуващи линкове field_estimated_hours: Изчислено време +field_default_value: Статус по подразбиране setting_app_title: Заглавие setting_app_subtitle: Описание diff --git a/lang/cs.yml b/lang/cs.yml index 6e904c10..cde58fe1 100644 --- a/lang/cs.yml +++ b/lang/cs.yml @@ -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 diff --git a/lang/de.yml b/lang/de.yml index 27ca40a3..a23e9c53 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -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 diff --git a/lang/en.yml b/lang/en.yml index 6580d398..dc7b04dd 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -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 diff --git a/lang/es.yml b/lang/es.yml index 1c677655..8e9ffaa2 100644 --- a/lang/es.yml +++ b/lang/es.yml @@ -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 diff --git a/lang/fi.yml b/lang/fi.yml index 7eba540a..497647ad 100644 --- a/lang/fi.yml +++ b/lang/fi.yml @@ -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 diff --git a/lang/fr.yml b/lang/fr.yml index ce3817d3..854ed585 100644 --- a/lang/fr.yml +++ b/lang/fr.yml @@ -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 diff --git a/lang/he.yml b/lang/he.yml index 928c68ba..3e8ad416 100644 --- a/lang/he.yml +++ b/lang/he.yml @@ -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: תת-כותרת ישום diff --git a/lang/it.yml b/lang/it.yml index a1622814..ca4b3391 100644 --- a/lang/it.yml +++ b/lang/it.yml @@ -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 diff --git a/lang/ja.yml b/lang/ja.yml index 56f84694..713af6b4 100644 --- a/lang/ja.yml +++ b/lang/ja.yml @@ -162,6 +162,7 @@ field_delay: 遅延 field_assignable: 問題はこのロールに割り当てることができます field_redirect_existing_links: 既存のリンクをリダイレクトする field_estimated_hours: 予定工数 +field_default_value: デフォルトのステータス setting_app_title: アプリケーションのタイトル setting_app_subtitle: アプリケーションのサブタイトル diff --git a/lang/ko.yml b/lang/ko.yml index 7a509478..564e6725 100644 --- a/lang/ko.yml +++ b/lang/ko.yml @@ -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: 레드마인 부제목 diff --git a/lang/lt.yml b/lang/lt.yml index 8455260f..d95da746 100644 --- a/lang/lt.yml +++ b/lang/lt.yml @@ -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 diff --git a/lang/nl.yml b/lang/nl.yml index 92e5a597..8d29ab90 100644 --- a/lang/nl.yml +++ b/lang/nl.yml @@ -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 diff --git a/lang/pl.yml b/lang/pl.yml index 548917a3..69bf5306 100644 --- a/lang/pl.yml +++ b/lang/pl.yml @@ -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 diff --git a/lang/pt-br.yml b/lang/pt-br.yml index 45e66cd5..926c913a 100644 --- a/lang/pt-br.yml +++ b/lang/pt-br.yml @@ -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: Padrao setting_app_title: Titulo da aplicacao setting_app_subtitle: Sub-titulo da aplicacao diff --git a/lang/pt.yml b/lang/pt.yml index 54b74c47..88fd9cf7 100644 --- a/lang/pt.yml +++ b/lang/pt.yml @@ -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 diff --git a/lang/ro.yml b/lang/ro.yml index c3427d26..2eb17609 100644 --- a/lang/ro.yml +++ b/lang/ro.yml @@ -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 diff --git a/lang/ru.yml b/lang/ru.yml index 7bf47c8f..62799bdf 100644 --- a/lang/ru.yml +++ b/lang/ru.yml @@ -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: Подзаголовок приложения diff --git a/lang/sr.yml b/lang/sr.yml index 6c486a83..6d88d34f 100644 --- a/lang/sr.yml +++ b/lang/sr.yml @@ -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 diff --git a/lang/sv.yml b/lang/sv.yml index 0cb9a2d6..5f4a0112 100644 --- a/lang/sv.yml +++ b/lang/sv.yml @@ -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 diff --git a/lang/zh-tw.yml b/lang/zh-tw.yml index 465855b5..2a431266 100644 --- a/lang/zh-tw.yml +++ b/lang/zh-tw.yml @@ -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: 副標題 diff --git a/lang/zh.yml b/lang/zh.yml index c42c60fa..b87a1515 100644 --- a/lang/zh.yml +++ b/lang/zh.yml @@ -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: 应用程序子标题 diff --git a/test/fixtures/custom_fields.yml b/test/fixtures/custom_fields.yml index e73e6de9..e58d8e3d 100644 --- a/test/fixtures/custom_fields.yml +++ b/test/fixtures/custom_fields.yml @@ -10,6 +10,7 @@ custom_fields_001: id: 1 is_required: false field_format: list + default_value: "" custom_fields_002: name: Searchable field min_length: 1 @@ -22,6 +23,7 @@ custom_fields_002: is_required: false field_format: string searchable: true + default_value: "Default string" custom_fields_003: name: Development status min_length: 0 @@ -33,6 +35,7 @@ custom_fields_003: id: 3 is_required: true field_format: list + default_value: "" custom_fields_004: name: Phone number min_length: 0 @@ -44,6 +47,7 @@ custom_fields_004: id: 4 is_required: false field_format: string + default_value: "" custom_fields_005: name: Money min_length: 0 @@ -55,4 +59,5 @@ custom_fields_005: id: 5 is_required: false field_format: float + default_value: "" \ No newline at end of file diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb index 05bfc96e..f4c99f1e 100644 --- a/test/functional/issues_controller_test.rb +++ b/test/functional/issues_controller_test.rb @@ -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 diff --git a/test/integration/issues_test.rb b/test/integration/issues_test.rb index 81d27c30..7249ed3d 100644 --- a/test/integration/issues_test.rb +++ b/test/integration/issues_test.rb @@ -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 diff --git a/test/unit/custom_value_test.rb b/test/unit/custom_value_test.rb index 24d09fe4..4d488bae 100644 --- a/test/unit/custom_value_test.rb +++ b/test/unit/custom_value_test.rb @@ -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