]> source.dussan.org Git - redmine.git/commitdiff
Adds description field to custom queries (#9309).
authorMarius Balteanu <marius.balteanu@zitec.com>
Tue, 4 Jun 2024 20:04:45 +0000 (20:04 +0000)
committerMarius Balteanu <marius.balteanu@zitec.com>
Tue, 4 Jun 2024 20:04:45 +0000 (20:04 +0000)
Patch by Go MAEDA (@maeda).

git-svn-id: https://svn.redmine.org/redmine/trunk@22855 e93f8b46-1217-0410-a6f0-8f06a7374b81

20 files changed:
app/controllers/queries_controller.rb
app/helpers/queries_helper.rb
app/models/query.rb
app/views/admin/projects.html.erb
app/views/calendars/show.html.erb
app/views/gantts/show.html.erb
app/views/issues/index.html.erb
app/views/projects/index.html.erb
app/views/queries/_form.html.erb
app/views/timelog/index.html.erb
app/views/users/index.html.erb
db/migrate/20240213101801_add_queries_description.rb [new file with mode: 0644]
test/fixtures/queries.yml
test/functional/calendars_controller_test.rb
test/functional/gantts_controller_test.rb
test/functional/issues_controller_test.rb
test/functional/projects_controller_test.rb
test/functional/queries_controller_test.rb
test/functional/timelog_controller_test.rb
test/functional/users_controller_test.rb

index db5d785f97b4fe3404fa180400f1d1b079b858fb..53ce029b9173f209ea7951ee9ad40b71029f6b4c 100644 (file)
@@ -133,6 +133,7 @@ class QueriesController < ApplicationController
     @query.column_names = nil if params[:default_columns]
     @query.sort_criteria = (params[:query] && params[:query][:sort_criteria]) || @query.sort_criteria
     @query.name = params[:query] && params[:query][:name]
+    @query.description = params[:query] && params[:query][:description]
     if User.current.allowed_to?(:manage_public_queries, @query.project) || User.current.admin?
       @query.visibility = (params[:query] && params[:query][:visibility]) || Query::VISIBILITY_PRIVATE
       @query.role_ids = params[:query] && params[:query][:role_ids]
index 160473ae8ae690ae0b90b5f9094c5a03d4a56e44..453149436a656b22c9ad4101978259db49c9d5d9 100644 (file)
@@ -506,7 +506,8 @@ module QueriesHelper
           content_tag('li',
                       link_to(query.name,
                               url_params.merge(:query_id => query),
-                              :class => css) +
+                              :class => css,
+                              :title => query.description) +
                         clear_link.html_safe)
         end.join("\n").html_safe,
         :class => 'queries'
index 90970c96e6d53a6c31ebf13c8b90013688523525..931abc95878a40566730467e3f26e77eff0d7507 100644 (file)
@@ -270,6 +270,7 @@ class Query < ApplicationRecord
 
   validates_presence_of :name
   validates_length_of :name, :maximum => 255
+  validates_length_of :description, :maximum => 255
   validates :visibility, :inclusion => {:in => [VISIBILITY_PUBLIC, VISIBILITY_ROLES, VISIBILITY_PRIVATE]}
   validate :validate_query_filters
   validate do |query|
index e6805453ae7773ca37682f415b288abaee8230b8..c0e2a713e8bfbda94e578d0d71232b6cfe8207e4 100644 (file)
@@ -3,6 +3,7 @@
 </div>
 
 <h2><%= @query.new_record? ? l(:label_project_plural) : @query.name %></h2>
+<%= @query.persisted? && @query.description.present? ? content_tag('p', @query.description, class: 'subtitle') : '' %>
 
 <%= form_tag(admin_projects_path(@project, nil), :method => :get, :id => 'query_form') do %>
 <%= hidden_field_tag 'admin_projects', '1' %>
index d3d00a427eb26e4aa4463454aa6d58a5787f07b4..dfef117dee3006eac931f6415b27bb8ce30c1ea6 100644 (file)
@@ -1,4 +1,5 @@
 <h2><%= @query.new_record? ? l(:label_calendar) : @query.name %></h2>
+<%= @query.persisted? && @query.description.present? ? content_tag('p', @query.description, class: 'subtitle') : '' %>
 
 <%= form_tag({:controller => 'calendars', :action => 'show', :project_id => @project},
              :method => :get, :id => 'query_form') do %>
index 43e430311ddaa7dd360f8df8f7c6fe0c059f7ef4..ceca3d1a714a7966970e84963f960b2466f90bc0 100644 (file)
@@ -3,6 +3,7 @@
 </div>
 
 <h2><%= @query.new_record? ? l(:label_gantt) : @query.name %></h2>
+<%= @query.persisted? && @query.description.present? ? content_tag('p', @query.description, class: 'subtitle') : '' %>
 
 <%= form_tag({:controller => 'gantts', :action => 'show',
              :project_id => @project, :month => params[:month],
index 997a64e55542bab4c56518a56afad99a4e450e27..1ab5198a1d232a39be411b31726984b74a688cda 100644 (file)
@@ -19,6 +19,7 @@
 
 <h2><%= @query.new_record? ? l(:label_issue_plural) : @query.name %></h2>
 <% html_title(@query.new_record? ? l(:label_issue_plural) : @query.name) %>
+<%= @query.persisted? && @query.description.present? ? content_tag('p', @query.description, class: 'subtitle') : '' %>
 
 <%= form_tag(_project_issues_path(@project), :method => :get, :id => 'query_form') do %>
   <%= render :partial => 'queries/query_form' %>
index 3bd665640dd656b6a55033206ad1eb028de2d9bf..d18cf6e4713cbdba4776facb006e3fe17b6ab4f3 100644 (file)
@@ -5,6 +5,7 @@
 </div>
 
 <h2><%= @query.new_record? ? l(:label_project_plural) : @query.name %></h2>
+<%= @query.persisted? && @query.description.present? ? content_tag('p', @query.description, class: 'subtitle') : '' %>
 
 <%= form_tag(projects_path(@project, nil), :method => :get, :id => 'query_form') do %>
 <%= render :partial => 'queries/query_form' %>
index 5f4fa34909e663cf1f6ff9cc5a8219610d758b1d..27391e8ef9dcc1ed6d7c0f1957ddd39df13c1770 100644 (file)
@@ -8,6 +8,8 @@
 
 <p><label for="query_name"><%=l(:field_name)%></label>
 <%= text_field 'query', 'name', :size => 80 %></p>
+<p><label for="query_description"><%=l(:field_description)%></label>
+<%= text_field 'query', 'description', :size => 80 %></p>
 
 <% if User.current.admin? ||
       User.current.allowed_to?(:manage_public_queries, @query.project) %>
index a045e47439f5b8968d5a5d67cbba939a09a22991..ec7580b9a2ddd102530c7cfb8d9d9ca1d788e474 100644 (file)
@@ -14,6 +14,7 @@
 </div>
 
 <h2><%= @query.new_record? ? l(:label_spent_time) : @query.name %></h2>
+<%= @query.persisted? && @query.description.present? ? content_tag('p', @query.description, class: 'subtitle') : '' %>
 
 <%= form_tag(_time_entries_path(@project, nil), :method => :get, :id => 'query_form') do %>
 <%= render :partial => 'date_range' %>
index d609bfd7832d5823b1972d4df25de04f324fabd7..9071dba1943958862a780baa0e4c6fa5c85c8f18 100644 (file)
@@ -8,6 +8,7 @@
 </div>
 
 <h2><%= @query.new_record? ? l(:label_user_plural) : @query.name %></h2>
+<%= @query.persisted? && @query.description.present? ? content_tag('p', @query.description, class: 'subtitle') : '' %>
 
 <%= form_tag(users_path, method: :get, id: 'query_form') do %>
   <%= render partial: 'queries/query_form' %>
diff --git a/db/migrate/20240213101801_add_queries_description.rb b/db/migrate/20240213101801_add_queries_description.rb
new file mode 100644 (file)
index 0000000..5755731
--- /dev/null
@@ -0,0 +1,9 @@
+class AddQueriesDescription < ActiveRecord::Migration[6.1]
+  def up
+    add_column :queries, :description, :string, :after => :name
+  end
+
+  def down
+    remove_column :queries, :description
+  end
+end
index 6b3bb0193dd4e33d28286291f050aff184ad3c2e..cc0ea220f97fdd3b2f35e54da3eb4c1ef7ace50c 100644 (file)
@@ -5,6 +5,7 @@ queries_001:
   project_id: 1
   visibility: 2
   name: Multiple custom fields query
+  description: Description for Multiple custom fields query
   filters: |
     --- 
     cf_1: 
@@ -28,6 +29,7 @@ queries_002:
   project_id: 1
   visibility: 0
   name: Private query for cookbook
+  description: Description for Private query for cookbook
   filters: |
     --- 
     tracker_id: 
@@ -47,6 +49,7 @@ queries_003:
   project_id: 
   visibility: 0
   name: Private query for all projects
+  description: Description for Private query for all projects
   filters: |
     --- 
     tracker_id: 
@@ -62,6 +65,7 @@ queries_004:
   project_id: 
   visibility: 2
   name: Public query for all projects
+  description: Description for Public query for all projects
   filters: |
     --- 
     tracker_id: 
@@ -77,6 +81,7 @@ queries_005:
   project_id: 
   visibility: 2
   name: Open issues by priority and tracker
+  description: Description for Oepn issues by priority and tracker
   filters: |
     --- 
     status_id: 
@@ -98,6 +103,7 @@ queries_006:
   project_id: 
   visibility: 2
   name: Open issues grouped by tracker
+  description: Description for Open issues grouped by tracker
   filters: |
     --- 
     status_id: 
@@ -118,6 +124,7 @@ queries_007:
   project_id: 2
   visibility: 2
   name: Public query for project 2
+  description: Description for Public query for project 2
   filters: |
     --- 
     tracker_id: 
@@ -133,6 +140,7 @@ queries_008:
   project_id: 2
   visibility: 0
   name: Private query for project 2
+  description: Description for Private query for project 2
   filters: |
     --- 
     tracker_id: 
@@ -148,6 +156,7 @@ queries_009:
   project_id: 
   visibility: 2
   name: Open issues grouped by list custom field
+  description: Description for Open issues grouped by list custom field
   filters: |
     --- 
     status_id: 
@@ -168,6 +177,7 @@ queries_010:
   project_id: 1
   visibility: 2
   name: My spent time
+  description: Description for My spent time
   filters: |
     --- 
     user_id: 
@@ -187,6 +197,7 @@ queries_011:
   type: ProjectQuery
   visibility: 2
   name: Projects as list
+  description: Description for Projects as list
   filters: |
     ---
     id:
@@ -205,6 +216,7 @@ queries_012:
   type: ProjectQuery
   visibility: 1
   name: My bookmarks
+  description: Description for My bookmarks
   filters: |
     ---
     id:
index f77872ea28d7931505e3a72db8d6bc8c7c9c9278..134d41cbe302fd587c0ac0fe5321f3bb66fd5b08 100644 (file)
@@ -155,15 +155,16 @@ class CalendarsControllerTest < Redmine::ControllerTest
   end
 
   def test_show_should_run_custom_queries
-    @query = IssueQuery.create!(:name => 'Calendar Query', :visibility => IssueQuery::VISIBILITY_PUBLIC)
+    query = IssueQuery.create!(:name => 'Calendar Query', :description => 'Description for Calendar Query', :visibility => IssueQuery::VISIBILITY_PUBLIC)
     get(
       :show,
       :params => {
-        :query_id => @query.id
+        :query_id => query.id
       }
     )
     assert_response :success
-    assert_select 'h2', :text => 'Calendar Query'
+    assert_select 'h2', :text => query.name
+    assert_select '#sidebar a.query.selected[title=?]', query.description, :text => query.name
   end
 
   def test_cross_project_calendar
index 821294bba69967a9c6d5df96b9006be5a4ef909c..48dfc8ae795e5446f01c0b90c7123f0bf5e2c5a1 100644 (file)
@@ -118,6 +118,19 @@ class GanttsControllerTest < Redmine::ControllerTest
     assert_response :success
   end
 
+  def test_show_should_run_custom_query
+    query = IssueQuery.create!(:name => 'Gantt Query', :description => 'Description for Gantt Query', :visibility => IssueQuery::VISIBILITY_PUBLIC)
+    get(
+      :show,
+      :params => {
+        :query_id => query.id
+      }
+    )
+    assert_response :success
+    assert_select 'h2', :text => query.name
+    assert_select '#sidebar a.query.selected[title=?]', query.description, :text => query.name
+  end
+
   def test_gantt_should_work_cross_project
     get :show
     assert_response :success
index 12ec7a6d5aef09b85d326afefb7bc9f7ffe440f7..ca09ee8f11ba05e24a987203c8e0ac8c8d2e230d 100644 (file)
@@ -359,7 +359,8 @@ class IssuesControllerTest < Redmine::ControllerTest
       assert_select 'a.query.selected', 1
       # assert link properties
       assert_select(
-        'a.query.selected[href=?]',
+        'a.query.selected[title=?][href=?]',
+        'Description for Oepn issues by priority and tracker',
         '/projects/ecookbook/issues?query_id=5',
         :text => "Open issues by priority and tracker"
       )
index a21b50b077beeede7a339392939eef5327cb5fac..80773e0d2674eb5e31442f4a0fab8df05c143201 100644 (file)
@@ -267,6 +267,14 @@ class ProjectsControllerTest < Redmine::ControllerTest
     assert_select 'tr#project-4 td.last_activity_date', :text => ''
   end
 
+  def test_index_with_query
+    query = ProjectQuery.find(11)
+    get :index, :params => { :query_id => query.id }
+    assert_response :success
+    assert_select 'h2', :text => query.name
+    assert_select '#sidebar a.query.selected[title=?]', query.description, :text => query.name
+  end
+
   def test_index_should_retrieve_default_query
     query = ProjectQuery.find(11)
     ProjectQuery.stubs(:default).returns query
@@ -275,6 +283,7 @@ class ProjectsControllerTest < Redmine::ControllerTest
       @request.session[:user_id] = user_id
       get :index
       assert_select 'h2', text: query.name
+      assert_select '#sidebar a.query.selected[title=?]', query.description, :text => query.name
     end
   end
 
index 77560e9137fc32513483d596da3280f4b5303df6..7c8b5cd9ae13b01e623c68ced54cc50a5a92285c 100644 (file)
@@ -328,6 +328,25 @@ class QueriesControllerTest < Redmine::ControllerTest
     assert_equal [['due_date', 'desc'], ['tracker', 'asc']], query.sort_criteria
   end
 
+  def test_create_with_description
+    @request.session[:user_id] = 2
+    assert_difference '::Query.count', 1 do
+      post(
+        :create,
+        :params => {
+          :project_id => 'ecookbook',
+          :query => {
+            :name => 'test_new_with_description', :description => 'Description for test_new_with_description'
+          }
+        }
+      )
+    end
+    q = Query.find_by_name("test_new_with_description")
+    assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :query_id => q
+
+    assert_equal 'Description for test_new_with_description', q.description
+  end
+
   def test_create_with_failure
     @request.session[:user_id] = 2
     assert_no_difference '::Query.count' do
@@ -659,6 +678,14 @@ class QueriesControllerTest < Redmine::ControllerTest
     end
   end
 
+  def test_edit_description
+    @request.session[:user_id] = 1
+    get(:edit, :params => {:id => 5})
+    assert_response :success
+
+    assert_select 'input[name="query[description]"][value=?]', 'Description for Oepn issues by priority and tracker'
+  end
+
   def test_edit_invalid_query
     @request.session[:user_id] = 2
     get(:edit, :params => {:id => 99})
@@ -744,6 +771,23 @@ class QueriesControllerTest < Redmine::ControllerTest
     assert Query.find_by_name('test_project_query_updated')
   end
 
+  def test_update_description
+    @request.session[:user_id] = 1
+    q = Query.find(5)
+    put(
+      :update,
+      :params => {
+        :id => q.id,
+        :query => {
+          :name => q.name,
+          :description => 'query description updated'
+        }
+      }
+    )
+    assert_redirected_to :controller => 'issues', :action => 'index', :query_id => q.id
+    assert_equal 'query description updated',  Query.find(5).description
+  end
+
   def test_update_with_failure
     @request.session[:user_id] = 1
     put(
index 464bf932772363b931b2973994930a3e8667c982..5a63a8c61cbddcae05a81dfcfe8bd5869a29b06b 100644 (file)
@@ -1682,14 +1682,14 @@ class TimelogControllerTest < Redmine::ControllerTest
   end
 
   def test_index_with_query
-    query = TimeEntryQuery.new(:project_id => 1, :name => 'Time Entry Query', :visibility => 2)
+    query = TimeEntryQuery.new(:project_id => 1, :name => 'Time Entry Query', :description => 'Description for Time Entry Query', :visibility => 2)
     query.save!
     @request.session[:user_id] = 2
 
     get :index, :params => {:project_id => 'ecookbook', :query_id => query.id}
     assert_response :success
     assert_select 'h2', :text => query.name
-    assert_select '#sidebar a.selected', :text => query.name
+    assert_select '#sidebar a.query.selected[title=?]', query.description, :text => query.name
   end
 
   def test_index_atom_feed
index 4302f913a9b56c20de105dac9329315a424efecf..5d6e6b754fb2f337ab0f16043d2ad57560757b0e 100644 (file)
@@ -189,6 +189,15 @@ class UsersControllerTest < Redmine::ControllerTest
     assert_select 'tr#user-1', 1
   end
 
+  def test_index_with_query
+    query = UserQuery.create!(:name => 'My User Query', :description => 'Description for My User Query', :visibility => UserQuery::VISIBILITY_PUBLIC)
+    get :index, :params => { :query_id => query.id }
+    assert_response :success
+
+    assert_select 'h2', :text => query.name
+    assert_select '#sidebar a.query.selected[title=?]', query.description, :text => query.name
+  end
+
   def test_index_csv
     with_settings :default_language => 'en' do
       user = User.logged.status(1).first