Feature #1565 » rm_1565_issues_from_custom_query.patch
| app/controllers/my_controller.rb | ||
|---|---|---|
| 27 | 27 | helper :issues | 
| 28 | 28 | helper :users | 
| 29 | 29 | helper :custom_fields | 
| 30 | helper :queries | |
| 31 | helper :sort | |
| 30 | 32 | |
| 31 | 33 | def index | 
| 32 | 34 | page | 
| app/helpers/my_helper.rb | ||
|---|---|---|
| 97 | 97 | Issue.visible.open.on_active_project.watched_by(User.current.id).recently_updated.limit(10) | 
| 98 | 98 | end | 
| 99 | 99 | |
| 100 | def issuequery_items(query_id) | |
| 101 | query = IssueQuery.visible.find_by_id(query_id) | |
| 102 | ||
| 103 | return query unless query | |
| 104 | ||
| 105 | sort_array = query.sort_criteria.empty? ? [['id', 'desc']] : query.sort_criteria | |
| 106 | sort_init(sort_array) | |
| 107 | sort_update(query.sortable_columns, 'issues_index_sort') | |
| 108 | ||
| 109 | issues = query.issues(:order => sort_clause, :limit => 10) | |
| 110 | ||
| 111 | return query, issues | |
| 112 | end | |
| 113 | ||
| 100 | 114 | def news_items | 
| 101 | 115 | News.visible. | 
| 102 | 116 | where(:project_id => User.current.projects.map(&:id)). | 
| app/views/my/blocks/_issuescustomquery.html.erb | ||
|---|---|---|
| 1 | <% | |
| 2 | query, issues = issuequery_items(settings[:query_id].to_i) | |
| 3 | visible_queries = IssueQuery.visible.sorted | |
| 4 | %> | |
| 5 | ||
| 6 | <div class="contextual"> | |
| 7 |   <%= link_to_function l(:label_options), "$('#customquery-settings').toggle();", :class => 'icon-only icon-settings' %> | |
| 8 | </div> | |
| 9 | ||
| 10 | <h3> | |
| 11 | <% if query %> | |
| 12 |   <%= link_to l(:label_issues_from_query, :query_name => query.name), {:controller => 'issues', :action => 'index', :project_id => query.project_id, :query_id => query} %> | |
| 13 | (<%= query.issue_count %>) | |
| 14 | <% else %> | |
| 15 | <%= l(:label_issues_from_custom_query) %> | |
| 16 | <% end %> | |
| 17 | </h3> | |
| 18 | ||
| 19 | <div id="customquery-settings" style="display:none;"> | |
| 20 |   <%= form_tag({}, :remote => true) do %> | |
| 21 | <div class="box"> | |
| 22 | <p> | |
| 23 | <label> | |
| 24 | <%= l(:label_query) %> | |
| 25 |         <%= select_tag 'settings[issuescustomquery][query_id]', content_tag("option") + options_from_collection_for_select(visible_queries, :id, :name, settings[:query_id]) %> | |
| 26 | </label> | |
| 27 | </p> | |
| 28 | </div> | |
| 29 | <p> | |
| 30 | <%= submit_tag l(:button_save) %> | |
| 31 |       <%= link_to_function l(:button_cancel), "$('#customquery-settings').toggle();" %> | |
| 32 | </p> | |
| 33 | <% end %> | |
| 34 | </div> | |
| 35 | ||
| 36 | <% if query %> | |
| 37 |   <%= render :partial => 'issues/list', :locals => { :issues => issues, :query => query } %> | |
| 38 | <% else %> | |
| 39 | <p class="nodata"><%= l(:label_no_data) %></p> | |
| 40 | <% end %> | |
| config/locales/en.yml | ||
|---|---|---|
| 1013 | 1013 | label_font_monospace: Monospaced font | 
| 1014 | 1014 | label_font_proportional: Proportional font | 
| 1015 | 1015 | label_last_notes: Last notes | 
| 1016 | label_issues_from_custom_query: Issues from custom query | |
| 1017 |   label_issues_from_query: "Issues from query: %{query_name}" | |
| 1016 | 1018 | |
| 1017 | 1019 | button_login: Login | 
| 1018 | 1020 | button_submit: Submit | 
| lib/redmine/my_page.rb | ||
|---|---|---|
| 23 | 23 | 'issuesassignedtome' => :label_assigned_to_me_issues, | 
| 24 | 24 | 'issuesreportedbyme' => :label_reported_issues, | 
| 25 | 25 | 'issueswatched' => :label_watched_issues, | 
| 26 | 'issuescustomquery' => :label_issues_from_custom_query, | |
| 26 | 27 | 'news' => :label_news_latest, | 
| 27 | 28 | 'calendar' => :label_calendar, | 
| 28 | 29 | 'documents' => :label_document_plural, | 
| public/stylesheets/application.css | ||
|---|---|---|
| 1129 | 1129 | color:#505050; | 
| 1130 | 1130 | line-height:1.5em; | 
| 1131 | 1131 | } | 
| 1132 | ||
| 1132 | .block-receiver .list .checkbox {display: none;} | |
| 1133 | 1133 | .handle {cursor: move;} | 
| 1134 | 1134 | |
| 1135 | 1135 | /***** Gantt chart *****/ | 
| test/functional/my_controller_test.rb | ||
|---|---|---|
| 19 | 19 | |
| 20 | 20 | class MyControllerTest < Redmine::ControllerTest | 
| 21 | 21 | fixtures :users, :email_addresses, :user_preferences, :roles, :projects, :members, :member_roles, | 
| 22 | :issues, :issue_statuses, :trackers, :enumerations, :custom_fields, :auth_sources | |
| 22 |   :issues, :issue_statuses, :trackers, :enumerations, :custom_fields, :auth_sources, :queries | |
| 23 | 23 | |
| 24 | 24 | def setup | 
| 25 | 25 | @request.session[:user_id] = 2 | 
| ... | ... | |
| 51 | 51 | end | 
| 52 | 52 | end | 
| 53 | 53 | |
| 54 | def test_page_with_issues_from_custom_query_block | |
| 55 | preferences = User.find(2).pref | |
| 56 |     preferences[:my_page_layout] = {'top' => ['issuescustomquery']} | |
| 57 | preferences.save! | |
| 58 | ||
| 59 | get :page | |
| 60 | assert_response :success | |
| 61 | ||
| 62 | assert_select 'h3', :text => 'Issues from custom query' | |
| 63 | ||
| 64 | assert_select 'select[name=?]', 'settings[issuescustomquery][query_id]' do | |
| 65 | assert_select 'option', 8 | |
| 66 | assert_select 'option', :text => '' | |
| 67 | assert_select 'option[value="1"]', :text => 'Multiple custom fields query' | |
| 68 | assert_select 'option[value="5"]', :text => 'Open issues by priority and tracker' | |
| 69 | assert_select 'option[value="9"]', :text => 'Open issues grouped by list custom field' | |
| 70 | assert_select 'option[value="6"]', :text => 'Open issues grouped by tracker' | |
| 71 | assert_select 'option[value="8"]', :text => 'Private query for project 2' | |
| 72 | assert_select 'option[value="4"]', :text => 'Public query for all projects' | |
| 73 | assert_select 'option[value="7"]', :text => 'Public query for project 2' | |
| 74 | end | |
| 75 | end | |
| 76 | ||
| 77 | def test_page_with_issues_from_custom_query_block_with_selected_query | |
| 78 | user = User.find(2) | |
| 79 | ||
| 80 | q = IssueQuery.new(:name => 'All issues', :user => user, :column_names => [:tracker, :subject, :status, :assigned_to]) | |
| 81 | q.save! | |
| 82 | ||
| 83 | preferences = user.pref | |
| 84 |     preferences[:my_page_layout] = {'top' => ['issuescustomquery']} | |
| 85 |     preferences[:my_page_settings] = {'issuescustomquery' => {:query_id => q.id}} | |
| 86 | preferences.save! | |
| 87 | ||
| 88 | get :page | |
| 89 | assert_response :success | |
| 90 | ||
| 91 | assert_select 'select[name=?]', 'settings[issuescustomquery][query_id]' do | |
| 92 | assert_select 'option', 9 | |
| 93 | assert_select 'option[selected=selected][value=?]', q.id.to_s, :text => q.name | |
| 94 | end | |
| 95 | ||
| 96 | # assert number of columns (columns from query + id column + checkbox column) | |
| 97 | assert_select '#block-issuescustomquery table.issues th', 6 | |
| 98 | # assert results limit | |
| 99 | assert_select '#block-issuescustomquery table.issues tr.issue', 10 | |
| 100 | assert_select '#block-issuescustomquery table.issues td.assigned_to' | |
| 101 | end | |
| 102 | ||
| 54 | 103 | def test_page_with_all_blocks | 
| 55 | 104 | blocks = Redmine::MyPage.blocks.keys | 
| 56 | 105 | preferences = User.find(2).pref | 
| test/unit/helpers/my_helper_test.rb | ||
|---|---|---|
| 20 | 20 | class MyHelperTest < Redmine::HelperTest | 
| 21 | 21 | include ERB::Util | 
| 22 | 22 | include MyHelper | 
| 23 | ||
| 23 | include SortHelper | |
| 24 | 24 | |
| 25 | 25 | fixtures :projects, :trackers, :issue_statuses, :issues, | 
| 26 | 26 | :enumerations, :users, :issue_categories, | 
| ... | ... | |
| 46 | 46 | |
| 47 | 47 | assert_include entry, timelog_items.first | 
| 48 | 48 | end | 
| 49 | ||
| 50 | def test_issuequery_items_should_return_query_and_ten_sorted_issues | |
| 51 | User.current = User.find(2) | |
| 52 | query, issues = issuequery_items(5) | |
| 53 | ||
| 54 | assert_equal query.name, "Open issues by priority and tracker" | |
| 55 | assert_equal [7, 9, 10, 14, 2, 1, 3, 4, 5, 6], issues.map(&:id) | |
| 56 | end | |
| 49 | 57 | end | 
- « Previous
- 1
- …
- 4
- 5
- 6
- Next »