diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 820aa6c..0ab0940 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -33,6 +33,7 @@ class ProjectsController < ApplicationController
helper :queries
helper :repositories
helper :members
+ helper :trackers
# Lists visible projects
def index
diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb
index 972e6b9..46e4e89 100644
--- a/app/helpers/issues_helper.rb
+++ b/app/helpers/issues_helper.rb
@@ -188,13 +188,18 @@ module IssuesHelper
end
def trackers_options_for_select(issue)
+ trackers = trackers_for_select(issue)
+ trackers.collect {|t| [t.name, t.id]}
+ end
+
+ def trackers_for_select(issue)
trackers = issue.allowed_target_trackers
if issue.new_record? && issue.parent_issue_id.present?
trackers = trackers.reject do |tracker|
issue.tracker_id != tracker.id && tracker.disabled_core_fields.include?('parent_issue_id')
end
end
- trackers.collect {|t| [t.name, t.id]}
+ trackers
end
class IssueFieldsRows
diff --git a/app/helpers/trackers_helper.rb b/app/helpers/trackers_helper.rb
index ffb2ca3..6fd42fe 100644
--- a/app/helpers/trackers_helper.rb
+++ b/app/helpers/trackers_helper.rb
@@ -18,4 +18,10 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
module TrackersHelper
+
+ def tracker_name_tag(tracker)
+ title = tracker.description.presence
+ css = title ? "field-description" : nil
+ content_tag 'span', tracker.name, :class => css, :title => title
+ end
end
diff --git a/app/models/tracker.rb b/app/models/tracker.rb
index d90ab3e..6e8e248 100644
--- a/app/models/tracker.rb
+++ b/app/models/tracker.rb
@@ -36,6 +36,7 @@ class Tracker < ActiveRecord::Base
validates_presence_of :name
validates_uniqueness_of :name
validates_length_of :name, :maximum => 30
+ validates_length_of :description, :maximum => 255
scope :sorted, lambda { order(:position) }
scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)}
@@ -69,7 +70,8 @@ class Tracker < ActiveRecord::Base
'core_fields',
'position',
'custom_field_ids',
- 'project_ids'
+ 'project_ids',
+ 'description'
def to_s; name end
diff --git a/app/views/issues/_form.html.erb b/app/views/issues/_form.html.erb
index ab19fee..3a05f10 100644
--- a/app/views/issues/_form.html.erb
+++ b/app/views/issues/_form.html.erb
@@ -15,8 +15,13 @@
<% end %>
<% if @issue.safe_attribute?('tracker_id') || (@issue.persisted? && @issue.tracker_id_changed?) %>
-
<%= f.select :tracker_id, trackers_options_for_select(@issue), {:required => true},
- :onchange => "updateIssueFrom('#{escape_javascript update_issue_form_path(@project, @issue)}', this)" %>
+
+ <%= f.select :tracker_id, trackers_options_for_select(@issue), {:required => true},
+ :onchange => "updateIssueFrom('#{escape_javascript update_issue_form_path(@project, @issue)}', this)",
+ :title => @issue.tracker.description %>
+ <%= content_tag 'a', l(:label_open_trackers_description), :class => 'icon-only icon-help', :title => l(:label_open_trackers_description), :onclick => "showModal('trackers_description', '500px'); return false;", :href => '#' if trackers_for_select(@issue).any? {|t| t.description.present? } %>
+
+ <%= render partial: 'issues/trackers_description', locals: {trackers: trackers_for_select(@issue)} %>
<% end %>
<% if @issue.safe_attribute? 'subject' %>
diff --git a/app/views/issues/_trackers_description.html.erb b/app/views/issues/_trackers_description.html.erb
new file mode 100644
index 0000000..63c3619
--- /dev/null
+++ b/app/views/issues/_trackers_description.html.erb
@@ -0,0 +1,13 @@
+<% if trackers.any? {|t| t.description.present? } %>
+
+
<%= l(:label_trackers_description) %>
+
+ <% trackers.each do |tracker| %>
+ <% if tracker.description.present? %>
+ - <%= tracker.name %>
+ - <%= tracker.description %>
+ <% end %>
+ <% end %>
+
+
+<% end %>
diff --git a/app/views/projects/settings/_issues.html.erb b/app/views/projects/settings/_issues.html.erb
index 7f99c80..8c1d2b8 100644
--- a/app/views/projects/settings/_issues.html.erb
+++ b/app/views/projects/settings/_issues.html.erb
@@ -6,7 +6,7 @@
<% @trackers.each do |tracker| %>
<% end %>
<%= hidden_field_tag 'project[tracker_ids][]', '' %>
diff --git a/app/views/projects/show.html.erb b/app/views/projects/show.html.erb
index 2368a29..53a93ef 100644
--- a/app/views/projects/show.html.erb
+++ b/app/views/projects/show.html.erb
@@ -51,7 +51,7 @@
<% @trackers.each do |tracker| %>
- <%= link_to tracker.name, project_issues_path(@project, :set_filter => 1, :tracker_id => tracker.id) %>
+ <%= link_to tracker.name, project_issues_path(@project, :set_filter => 1, :tracker_id => tracker.id), :title => tracker.description %>
|
<%= link_to @open_issues_by_tracker[tracker].to_i, project_issues_path(@project, :set_filter => 1, :tracker_id => tracker.id) %>
diff --git a/app/views/trackers/_form.html.erb b/app/views/trackers/_form.html.erb
index 7b5b7ea..19dd364 100644
--- a/app/views/trackers/_form.html.erb
+++ b/app/views/trackers/_form.html.erb
@@ -10,6 +10,7 @@
:required => true %>
<%= f.check_box :is_in_roadmap %>
+<%= f.text_area :description, :rows => 4 %>
<% Tracker::CORE_FIELDS.each do |field| %>
diff --git a/app/views/trackers/index.api.rsb b/app/views/trackers/index.api.rsb
index de85791..59affd7 100644
--- a/app/views/trackers/index.api.rsb
+++ b/app/views/trackers/index.api.rsb
@@ -4,6 +4,7 @@ api.array :trackers do
api.id tracker.id
api.name tracker.name
api.default_status(:id => tracker.default_status.id, :name => tracker.default_status.name) unless tracker.default_status.nil?
+ api.description tracker.description
end
end
end
diff --git a/app/views/trackers/index.html.erb b/app/views/trackers/index.html.erb
index 633edbc..20d0975 100644
--- a/app/views/trackers/index.html.erb
+++ b/app/views/trackers/index.html.erb
@@ -9,6 +9,7 @@
<%=l(:label_tracker)%> |
<%=l(:field_default_status)%> |
+ <%=l(:field_description)%> |
|
|
@@ -17,6 +18,7 @@
|
<%= link_to tracker.name, edit_tracker_path(tracker) %> |
<%= tracker.default_status.name %> |
+ <%= tracker.description %> |
<% unless tracker.workflow_rules.exists? %>
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 3fb86c1..c2701fb 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1025,6 +1025,8 @@ en:
label_font_monospace: Monospaced font
label_font_proportional: Proportional font
label_last_notes: Last notes
+ label_trackers_description: Trackers description
+ label_open_trackers_description: View all trackers description
button_login: Login
button_submit: Submit
diff --git a/db/migrate/20170503103500_add_trackers_description.rb b/db/migrate/20170503103500_add_trackers_description.rb
new file mode 100644
index 0000000..2a16095
--- /dev/null
+++ b/db/migrate/20170503103500_add_trackers_description.rb
@@ -0,0 +1,8 @@
+class AddTrackersDescription < ActiveRecord::Migration[5.1]
+ def self.up
+ add_column :trackers, :description, :string, :after => :name
+ end
+ def self.down
+ remove_column :trackers, :description
+ end
+end
diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css
index f70358b..0a021aa 100644
--- a/public/stylesheets/application.css
+++ b/public/stylesheets/application.css
@@ -477,6 +477,10 @@ div.issue.overdue .due-date .value { color: #c22; }
#issue_tree td.checkbox, #relations td.checkbox {display:none;}
#relations td.buttons {padding:0;}
+#trackers_description {display:none;}
+#trackers_description dt {font-weight: bold; text-decoration: underline;}
+#trackers_description dd {margin: 0; padding: 0 0 1em 0;}
+
fieldset.collapsible {border-width: 1px 0 0 0;}
fieldset.collapsible>legend { padding-left: 16px; background: url(../images/arrow_expanded.png) no-repeat 0% 40%; cursor:pointer; }
fieldset.collapsible.collapsed>legend { background-image: url(../images/arrow_collapsed.png); }
@@ -1497,3 +1501,4 @@ color: #555; text-shadow: 1px 1px 0 #fff;
height:1px;
overflow:hidden;
}
+
diff --git a/public/stylesheets/responsive.css b/public/stylesheets/responsive.css
index 118039d..0a6d49d 100644
--- a/public/stylesheets/responsive.css
+++ b/public/stylesheets/responsive.css
@@ -747,6 +747,10 @@
float: none !important;
}
+ #all_attributes #issue_tracker_id {
+ width: 90%;
+ }
+
#issue_is_private_label {
display: inline;
}
diff --git a/test/fixtures/trackers.yml b/test/fixtures/trackers.yml
index c969549..c08b259 100644
--- a/test/fixtures/trackers.yml
+++ b/test/fixtures/trackers.yml
@@ -5,12 +5,14 @@ trackers_001:
is_in_chlog: true
default_status_id: 1
position: 1
+ description: Description for Bug tracker
trackers_002:
name: Feature request
id: 2
is_in_chlog: true
default_status_id: 1
position: 2
+ description: Description for Feature request tracker
trackers_003:
name: Support request
id: 3
diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb
index c423d6d..a203872 100644
--- a/test/functional/issues_controller_test.rb
+++ b/test/functional/issues_controller_test.rb
@@ -2774,6 +2774,49 @@ class IssuesControllerTest < Redmine::ControllerTest
assert_select 'option', text: /#{t.name}/, count: 0
end
+ def test_get_new_should_show_trackers_description
+ @request.session[:user_id] = 2
+ get :new, :params => {
+ :project_id => 1,
+ :issue => {
+ :tracker_id => 1
+ }
+ }
+ assert_response :success
+
+ assert_select 'form#issue-form' do
+ assert_select 'a[title=?]', 'View all trackers description', :text => 'View all trackers description'
+ assert_select 'select[name=?][title=?]', 'issue[tracker_id]', 'Description for Bug tracker'
+ end
+
+ assert_select 'div#trackers_description' do
+ assert_select 'h3', 1, :text => 'Trackers description'
+ # only Bug and Feature have descriptions
+ assert_select 'dt', 2, :text => 'Bug'
+ assert_select 'dd', 2, :text => 'Description for Bug tracker'
+ end
+ end
+
+ def test_get_new_should_not_show_trackers_description_for_trackers_without_description
+ Tracker.update_all(:description => '')
+
+ @request.session[:user_id] = 2
+ get :new, :params => {
+ :project_id => 1,
+ :issue => {
+ :tracker_id => 1
+ }
+ }
+ assert_response :success
+
+ assert_select 'form#issue-form' do
+ assert_select 'a[title=?]', 'View all trackers description', 0
+ assert_select 'select[name=?][title=?]', 'issue[tracker_id]', ''
+ end
+
+ assert_select 'div#trackers_description', 0
+ end
+
def test_update_form_for_new_issue
@request.session[:user_id] = 2
post :new, :params => {
diff --git a/test/integration/api_test/trackers_test.rb b/test/integration/api_test/trackers_test.rb
index df2a6ed..8e01c6c 100644
--- a/test/integration/api_test/trackers_test.rb
+++ b/test/integration/api_test/trackers_test.rb
@@ -28,6 +28,7 @@ class Redmine::ApiTest::TrackersTest < Redmine::ApiTest::Base
assert_select 'trackers[type=array] tracker id', :text => '2' do
assert_select '~ name', :text => 'Feature request'
+ assert_select '~ description', :text => 'Description for Feature request tracker'
end
end
end
diff --git a/test/unit/tracker_test.rb b/test/unit/tracker_test.rb
index 1db476a..e026f1c 100644
--- a/test/unit/tracker_test.rb
+++ b/test/unit/tracker_test.rb
@@ -128,4 +128,10 @@ class TrackerTest < ActiveSupport::TestCase
end
end
end
+
+ def test_tracker_should_have_description
+ tracker = Tracker.find(1)
+ assert tracker.respond_to?(:description)
+ assert_equal tracker.description, "Description for Bug tracker"
+ end
end
|