diff --git a/app/controllers/my_controller.rb b/app/controllers/my_controller.rb old mode 100644 new mode 100755 index 7d87707..13960b3 --- a/app/controllers/my_controller.rb +++ b/app/controllers/my_controller.rb @@ -27,6 +27,8 @@ class MyController < ApplicationController helper :issues helper :users helper :custom_fields + helper :queries + helper :sort def index page diff --git a/app/helpers/my_helper.rb b/app/helpers/my_helper.rb old mode 100644 new mode 100755 index d8930c0..a8c6a61 --- a/app/helpers/my_helper.rb +++ b/app/helpers/my_helper.rb @@ -97,6 +97,20 @@ module MyHelper Issue.visible.open.on_active_project.watched_by(User.current.id).recently_updated.limit(10) end + def issuequery_items(query_id) + query = IssueQuery.visible.find_by_id(query_id) + + return query unless query + + sort_array = query.sort_criteria.empty? ? [['id', 'desc']] : query.sort_criteria + sort_init(sort_array) + sort_update(query.sortable_columns, 'issues_index_sort') + + issues = query.issues(:order => sort_clause, :limit => 10) + + return query, issues + end + def news_items News.visible. where(:project_id => User.current.projects.map(&:id)). diff --git a/app/views/my/blocks/_issuescustomquery.html.erb b/app/views/my/blocks/_issuescustomquery.html.erb new file mode 100755 index 0000000..3b70428 --- /dev/null +++ b/app/views/my/blocks/_issuescustomquery.html.erb @@ -0,0 +1,40 @@ +<% +query, issues = issuequery_items(settings[:query_id].to_i) +visible_queries = IssueQuery.visible.sorted +%> + +
+ <%= link_to_function l(:label_options), "$('#customquery-settings').toggle();", :class => 'icon-only icon-settings' %> +
+ +

+ <% if query %> + <%= link_to l(:label_issues_from_query, :query_name => query.name), {:controller => 'issues', :action => 'index', :project_id => query.project_id, :query_id => query} %> + (<%= query.issue_count %>) + <% else %> + <%= l(:label_issues_from_custom_query) %> + <% end %> +

+ + + +<% if query %> + <%= render :partial => 'issues/list', :locals => { :issues => issues, :query => query } %> +<% else %> +

<%= l(:label_no_data) %>

+<% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml old mode 100644 new mode 100755 index 531081f..fb48aa2 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1013,6 +1013,8 @@ en: label_font_monospace: Monospaced font label_font_proportional: Proportional font label_last_notes: Last notes + label_issues_from_custom_query: Issues from custom query + label_issues_from_query: "Issues from query: %{query_name}" button_login: Login button_submit: Submit diff --git a/lib/redmine/my_page.rb b/lib/redmine/my_page.rb old mode 100644 new mode 100755 index 0c11459..b141be5 --- a/lib/redmine/my_page.rb +++ b/lib/redmine/my_page.rb @@ -23,6 +23,7 @@ module Redmine 'issuesassignedtome' => :label_assigned_to_me_issues, 'issuesreportedbyme' => :label_reported_issues, 'issueswatched' => :label_watched_issues, + 'issuescustomquery' => :label_issues_from_custom_query, 'news' => :label_news_latest, 'calendar' => :label_calendar, 'documents' => :label_document_plural, diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css old mode 100644 new mode 100755 index b60f6a5..b57a191 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -1129,7 +1129,7 @@ div.wiki img {vertical-align:middle; max-width:100%;} color:#505050; line-height:1.5em; } - +.block-receiver .list .checkbox {display: none;} .handle {cursor: move;} /***** Gantt chart *****/ diff --git a/test/functional/my_controller_test.rb b/test/functional/my_controller_test.rb old mode 100644 new mode 100755 index e40dd91..fa5b508 --- a/test/functional/my_controller_test.rb +++ b/test/functional/my_controller_test.rb @@ -19,7 +19,7 @@ require File.expand_path('../../test_helper', __FILE__) class MyControllerTest < Redmine::ControllerTest fixtures :users, :email_addresses, :user_preferences, :roles, :projects, :members, :member_roles, - :issues, :issue_statuses, :trackers, :enumerations, :custom_fields, :auth_sources + :issues, :issue_statuses, :trackers, :enumerations, :custom_fields, :auth_sources, :queries def setup @request.session[:user_id] = 2 @@ -51,6 +51,55 @@ class MyControllerTest < Redmine::ControllerTest end end + def test_page_with_issues_from_custom_query_block + preferences = User.find(2).pref + preferences[:my_page_layout] = {'top' => ['issuescustomquery']} + preferences.save! + + get :page + assert_response :success + + assert_select 'h3', :text => 'Issues from custom query' + + assert_select 'select[name=?]', 'settings[issuescustomquery][query_id]' do + assert_select 'option', 8 + assert_select 'option', :text => '' + assert_select 'option[value="1"]', :text => 'Multiple custom fields query' + assert_select 'option[value="5"]', :text => 'Open issues by priority and tracker' + assert_select 'option[value="9"]', :text => 'Open issues grouped by list custom field' + assert_select 'option[value="6"]', :text => 'Open issues grouped by tracker' + assert_select 'option[value="8"]', :text => 'Private query for project 2' + assert_select 'option[value="4"]', :text => 'Public query for all projects' + assert_select 'option[value="7"]', :text => 'Public query for project 2' + end + end + + def test_page_with_issues_from_custom_query_block_with_selected_query + user = User.find(2) + + q = IssueQuery.new(:name => 'All issues', :user => user, :column_names => [:tracker, :subject, :status, :assigned_to]) + q.save! + + preferences = user.pref + preferences[:my_page_layout] = {'top' => ['issuescustomquery']} + preferences[:my_page_settings] = {'issuescustomquery' => {:query_id => q.id}} + preferences.save! + + get :page + assert_response :success + + assert_select 'select[name=?]', 'settings[issuescustomquery][query_id]' do + assert_select 'option', 9 + assert_select 'option[selected=selected][value=?]', q.id.to_s, :text => q.name + end + + # assert number of columns (columns from query + id column + checkbox column) + assert_select '#block-issuescustomquery table.issues th', 6 + # assert results limit + assert_select '#block-issuescustomquery table.issues tr.issue', 10 + assert_select '#block-issuescustomquery table.issues td.assigned_to' + end + def test_page_with_all_blocks blocks = Redmine::MyPage.blocks.keys preferences = User.find(2).pref diff --git a/test/unit/helpers/my_helper_test.rb b/test/unit/helpers/my_helper_test.rb old mode 100644 new mode 100755 index d79525d..fb8a644 --- a/test/unit/helpers/my_helper_test.rb +++ b/test/unit/helpers/my_helper_test.rb @@ -20,7 +20,7 @@ require File.expand_path('../../../test_helper', __FILE__) class MyHelperTest < Redmine::HelperTest include ERB::Util include MyHelper - + include SortHelper fixtures :projects, :trackers, :issue_statuses, :issues, :enumerations, :users, :issue_categories, @@ -46,4 +46,12 @@ class MyHelperTest < Redmine::HelperTest assert_include entry, timelog_items.first end + + def test_issuequery_items_should_return_query_and_ten_sorted_issues + User.current = User.find(2) + query, issues = issuequery_items(5) + + assert_equal query.name, "Open issues by priority and tracker" + assert_equal [7, 9, 10, 14, 2, 1, 3, 4, 5, 6], issues.map(&:id) + end end