Browse Source

Set default configuration for the timelog list (#26356).

git-svn-id: http://svn.redmine.org/redmine/trunk@16814 e93f8b46-1217-0410-a6f0-8f06a7374b81
tags/4.0.0
Jean-Philippe Lang 6 years ago
parent
commit
2a721fff4c

+ 1
- 1
app/controllers/timelog_controller.rb View File

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

+ 6
- 5
app/helpers/queries_helper.rb View File

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

+ 1
- 1
app/models/issue_query.rb View File

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])

+ 7
- 5
app/models/query.rb View File

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



+ 1
- 1
app/models/time_entry_query.rb View File

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]])

+ 14
- 0
app/views/settings/_timelog.html.erb View File



</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 %>

+ 1
- 0
config/locales/en.yml View File

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

+ 2
- 0
config/locales/fr.yml View File

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

+ 10
- 0
config/settings.yml View File

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:

+ 35
- 0
test/functional/timelog_controller_test.rb View File



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

+ 6
- 1
test/test_helper.rb View File

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*)*)/

+ 4
- 0
test/ui/base.rb View File



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

+ 29
- 0
test/ui/timelog_test_ui.rb View File

# 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

Loading…
Cancel
Save