git-svn-id: http://svn.redmine.org/redmine/trunk@16814 e93f8b46-1217-0410-a6f0-8f06a7374b81tags/4.0.0
end | end | ||||
def retrieve_time_entry_query | def retrieve_time_entry_query | ||||
retrieve_query(TimeEntryQuery, false) | |||||
retrieve_query(TimeEntryQuery, false, :defaults => Setting.time_entry_list_defaults.symbolize_keys) | |||||
end | end | ||||
end | end |
tags | tags | ||||
end | end | ||||
def available_totalable_columns_tags(query) | |||||
def available_totalable_columns_tags(query, options={}) | |||||
tag_name = (options[:name] || 't') + '[]' | |||||
tags = ''.html_safe | tags = ''.html_safe | ||||
query.available_totalable_columns.each do |column| | query.available_totalable_columns.each do |column| | ||||
tags << content_tag('label', check_box_tag('t[]', column.name.to_s, query.totalable_columns.include?(column), :id => nil) + " #{column.caption}", :class => 'inline') | |||||
tags << content_tag('label', check_box_tag(tag_name, column.name.to_s, query.totalable_columns.include?(column), :id => nil) + " #{column.caption}", :class => 'inline') | |||||
end | end | ||||
tags << hidden_field_tag('t[]', '') | |||||
tags << hidden_field_tag(tag_name, '') | |||||
tags | tags | ||||
end | end | ||||
end | end | ||||
# Retrieve query from session or build a new query | # Retrieve query from session or build a new query | ||||
def retrieve_query(klass=IssueQuery, use_session=true) | |||||
def retrieve_query(klass=IssueQuery, use_session=true, options={}) | |||||
session_key = klass.name.underscore.to_sym | session_key = klass.name.underscore.to_sym | ||||
if params[:query_id].present? | if params[:query_id].present? | ||||
elsif api_request? || params[:set_filter] || !use_session || session[session_key].nil? || session[session_key][:project_id] != (@project ? @project.id : nil) | elsif api_request? || params[:set_filter] || !use_session || session[session_key].nil? || session[session_key][:project_id] != (@project ? @project.id : nil) | ||||
# Give it a name, required to be valid | # Give it a name, required to be valid | ||||
@query = klass.new(:name => "_", :project => @project) | @query = klass.new(:name => "_", :project => @project) | ||||
@query.build_from_params(params) | |||||
@query.build_from_params(params, options[:defaults]) | |||||
session[session_key] = {:project_id => @query.project_id, :filters => @query.filters, :group_by => @query.group_by, :column_names => @query.column_names, :totalable_names => @query.totalable_names, :sort => @query.sort_criteria.to_a} if use_session | session[session_key] = {:project_id => @query.project_id, :filters => @query.filters, :group_by => @query.group_by, :column_names => @query.column_names, :totalable_names => @query.totalable_names, :sort => @query.sort_criteria.to_a} if use_session | ||||
else | else | ||||
# retrieve from session | # retrieve from session |
options[:draw_progress_line] = (arg == '1' ? '1' : nil) | options[:draw_progress_line] = (arg == '1' ? '1' : nil) | ||||
end | end | ||||
def build_from_params(params) | |||||
def build_from_params(params, defaults={}) | |||||
super | super | ||||
self.draw_relations = params[:draw_relations] || (params[:query] && params[:query][:draw_relations]) | self.draw_relations = params[:draw_relations] || (params[:query] && params[:query][:draw_relations]) | ||||
self.draw_progress_line = params[:draw_progress_line] || (params[:query] && params[:query][:draw_progress_line]) | self.draw_progress_line = params[:draw_progress_line] || (params[:query] && params[:query][:draw_progress_line]) |
end | end | ||||
# Builds the query from the given params | # Builds the query from the given params | ||||
def build_from_params(params) | |||||
def build_from_params(params, defaults={}) | |||||
if params[:fields] || params[:f] | if params[:fields] || params[:f] | ||||
self.filters = {} | self.filters = {} | ||||
add_filters(params[:fields] || params[:f], params[:operators] || params[:op], params[:values] || params[:v]) | add_filters(params[:fields] || params[:f], params[:operators] || params[:op], params[:values] || params[:v]) | ||||
add_short_filter(field, params[field]) if params[field] | add_short_filter(field, params[field]) if params[field] | ||||
end | end | ||||
end | end | ||||
self.group_by = params[:group_by] || (params[:query] && params[:query][:group_by]) | |||||
self.column_names = params[:c] || (params[:query] && params[:query][:column_names]) | |||||
self.totalable_names = params[:t] || (params[:query] && params[:query][:totalable_names]) | |||||
self.sort_criteria = params[:sort] || (params[:query] && params[:query][:sort_criteria]) | |||||
query_params = params[:query] || defaults || {} | |||||
self.group_by = params[:group_by] || query_params[:group_by] | |||||
self.column_names = params[:c] || query_params[:column_names] | |||||
self.totalable_names = params[:t] || query_params[:totalable_names] | |||||
self.sort_criteria = params[:sort] || query_params[:sort_criteria] | |||||
self | self | ||||
end | end | ||||
end | end | ||||
# Accepts :from/:to params as shortcut filters | # Accepts :from/:to params as shortcut filters | ||||
def build_from_params(params) | |||||
def build_from_params(params, defaults={}) | |||||
super | super | ||||
if params[:from].present? && params[:to].present? | if params[:from].present? && params[:to].present? | ||||
add_filter('spent_on', '><', [params[:from], params[:to]]) | add_filter('spent_on', '><', [params[:from], params[:to]]) |
</div> | </div> | ||||
<fieldset class="box"> | |||||
<legend><%= l(:setting_time_entry_list_defaults) %></legend> | |||||
<% query = TimeEntryQuery.new(Setting.time_entry_list_defaults) %> | |||||
<%= render_query_columns_selection(query, | |||||
:name => 'settings[time_entry_list_defaults][column_names]') %> | |||||
<p> | |||||
<label><%= l(:label_total_plural) %></label> | |||||
<%= available_totalable_columns_tags(query, | |||||
:name => 'settings[time_entry_list_defaults][totalable_names]') %> | |||||
</p> | |||||
</fieldset> | |||||
<%= submit_tag l(:button_save) %> | <%= submit_tag l(:button_save) %> | ||||
<% end %> | <% end %> |
setting_commit_logs_formatting: Apply text formatting to commit messages | setting_commit_logs_formatting: Apply text formatting to commit messages | ||||
setting_timelog_required_fields: Required fields for time logs | setting_timelog_required_fields: Required fields for time logs | ||||
setting_close_duplicate_issues: Close duplicate issues automatically | setting_close_duplicate_issues: Close duplicate issues automatically | ||||
setting_time_entry_list_defaults: Timelog list defaults | |||||
permission_add_project: Create project | permission_add_project: Create project | ||||
permission_add_subprojects: Create subprojects | permission_add_subprojects: Create subprojects |
setting_commit_logs_formatting: Appliquer le formattage de texte aux messages de commit | setting_commit_logs_formatting: Appliquer le formattage de texte aux messages de commit | ||||
setting_timelog_required_fields: Champs obligatoire pour les temps passés | setting_timelog_required_fields: Champs obligatoire pour les temps passés | ||||
setting_close_duplicate_issues: Fermer les doublons automatiquement | setting_close_duplicate_issues: Fermer les doublons automatiquement | ||||
setting_time_entry_list_defaults: Affichage par défaut de la liste des temps passés | |||||
permission_add_project: Créer un projet | permission_add_project: Créer un projet | ||||
permission_add_subprojects: Créer des sous-projets | permission_add_subprojects: Créer des sous-projets |
default: [] | default: [] | ||||
display_subprojects_issues: | display_subprojects_issues: | ||||
default: 1 | default: 1 | ||||
time_entry_list_defaults: | |||||
serialized: true | |||||
default: | |||||
column_names: | |||||
- spent_on | |||||
- user | |||||
- activity | |||||
- issue | |||||
- comments | |||||
- hours | |||||
issue_done_ratio: | issue_done_ratio: | ||||
default: 'issue_field' | default: 'issue_field' | ||||
default_projects_public: | default_projects_public: |
include Redmine::I18n | include Redmine::I18n | ||||
def setup | |||||
super | |||||
Setting.default_language = 'en' | |||||
end | |||||
def test_new | def test_new | ||||
@request.session[:user_id] = 3 | @request.session[:user_id] = 3 | ||||
get :new | get :new | ||||
assert_select '.total-for-hours', :text => 'Hours: 162.90' | assert_select '.total-for-hours', :text => 'Hours: 162.90' | ||||
assert_select 'form#query_form[action=?]', '/time_entries' | assert_select 'form#query_form[action=?]', '/time_entries' | ||||
assert_equal ['Date', 'User', 'Activity', 'Issue', 'Comment', 'Hours'], columns_in_list | |||||
assert_select '.query-totals>span', 1 | |||||
end | |||||
def test_index_with_default_query_setting | |||||
with_settings :time_entry_list_defaults => {'column_names' => %w(spent_on issue user hours)} do | |||||
get :index | |||||
assert_response :success | |||||
end | |||||
assert_equal ['Date', 'Issue', 'User', 'Hours'], columns_in_list | |||||
end | |||||
def test_index_with_default_query_setting_using_custom_field | |||||
field = TimeEntryCustomField.create!(:name => 'Foo', :field_format => 'int') | |||||
with_settings :time_entry_list_defaults => { | |||||
'column_names' => ["spent_on", "user", "hours", "cf_#{field.id}"], | |||||
'totalable_names' => ["hours", "cf_#{field.id}"] | |||||
} do | |||||
get :index | |||||
assert_response :success | |||||
end | |||||
assert_equal ['Date', 'User', 'Hours', 'Foo'], columns_in_list | |||||
assert_select '.total-for-hours' | |||||
assert_select ".total-for-cf-#{field.id}" | |||||
assert_select '.query-totals>span', 2 | |||||
end | end | ||||
def test_index_all_projects_should_show_log_time_link | def test_index_all_projects_should_show_log_time_link |
Issue.where(:id => ids).sort_by {|issue| ids.index(issue.id)} | Issue.where(:id => ids).sort_by {|issue| ids.index(issue.id)} | ||||
end | end | ||||
# Return the columns that are displayed in the list | |||||
# Return the columns that are displayed in the issue list | |||||
def columns_in_issues_list | def columns_in_issues_list | ||||
css_select('table.issues thead th:not(.checkbox)').map(&:text) | css_select('table.issues thead th:not(.checkbox)').map(&:text) | ||||
end | end | ||||
# Return the columns that are displayed in the list | |||||
def columns_in_list | |||||
css_select('table.list thead th:not(.checkbox)').map(&:text).select(&:present?) | |||||
end | |||||
# Verifies that the query filters match the expected filters | # Verifies that the query filters match the expected filters | ||||
def assert_query_filters(expected_filters) | def assert_query_filters(expected_filters) | ||||
response.body =~ /initFilters\(\);\s*((addFilter\(.+\);\s*)*)/ | response.body =~ /initFilters\(\);\s*((addFilter\(.+\);\s*)*)/ |
setup do | setup do | ||||
clear_downloaded_files | clear_downloaded_files | ||||
Setting.delete_all | |||||
Setting.clear_cache | |||||
end | end | ||||
teardown do | teardown do | ||||
Capybara.reset_sessions! # Forget the (simulated) browser state | Capybara.reset_sessions! # Forget the (simulated) browser state | ||||
Capybara.use_default_driver # Revert Capybara.current_driver to Capybara.default_driver | Capybara.use_default_driver # Revert Capybara.current_driver to Capybara.default_driver | ||||
Setting.delete_all | |||||
Setting.clear_cache | |||||
end | end | ||||
end | end | ||||
end | end |
# encoding: utf-8 | |||||
# | |||||
# Redmine - project management software | # Redmine - project management software | ||||
# Copyright (C) 2006-2017 Jean-Philippe Lang | # Copyright (C) 2006-2017 Jean-Philippe Lang | ||||
# | # | ||||
entries = TimeEntry.where(:id => [1,2,3]).to_a | entries = TimeEntry.where(:id => [1,2,3]).to_a | ||||
assert entries.all? {|entry| entry.hours == 7.0} | assert entries.all? {|entry| entry.hours == 7.0} | ||||
end | end | ||||
def test_default_query_setting | |||||
# Display the list with the default settings | |||||
visit '/time_entries' | |||||
within 'table.time-entries thead' do | |||||
assert page.has_no_link?('Tracker') | |||||
assert page.has_text?('Comment') | |||||
end | |||||
# Change the default columns | |||||
log_user 'admin', 'admin' | |||||
visit '/settings?tab=timelog' | |||||
# Remove a column | |||||
select 'Comment', :from => 'Selected Columns' | |||||
click_on "â†" | |||||
# Add a column | |||||
select 'Tracker', :from => 'Available Columns' | |||||
click_on "→" | |||||
click_on 'Save' | |||||
# Display the list with updated settings | |||||
visit '/time_entries' | |||||
within 'table.time-entries thead' do | |||||
assert page.has_link?('Tracker') | |||||
assert page.has_no_text?('Comment') | |||||
end | |||||
end | |||||
end | end |