]> source.dussan.org Git - redmine.git/commitdiff
Set default configuration for the timelog list (#26356).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 12 Jul 2017 18:13:20 +0000 (18:13 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 12 Jul 2017 18:13:20 +0000 (18:13 +0000)
git-svn-id: http://svn.redmine.org/redmine/trunk@16814 e93f8b46-1217-0410-a6f0-8f06a7374b81

13 files changed:
app/controllers/timelog_controller.rb
app/helpers/queries_helper.rb
app/models/issue_query.rb
app/models/query.rb
app/models/time_entry_query.rb
app/views/settings/_timelog.html.erb
config/locales/en.yml
config/locales/fr.yml
config/settings.yml
test/functional/timelog_controller_test.rb
test/test_helper.rb
test/ui/base.rb
test/ui/timelog_test_ui.rb

index b45d3078ff7169cb1aaa6cd718f1ed0376e4ecd4..6bd7ab38799ae57fcfa59eb5f61f95f94a90a378 100644 (file)
@@ -272,6 +272,6 @@ private
   end
 
   def retrieve_time_entry_query
-    retrieve_query(TimeEntryQuery, false)
+    retrieve_query(TimeEntryQuery, false, :defaults => Setting.time_entry_list_defaults.symbolize_keys)
   end
 end
index 2f6c92e1aa0f8603a7a087d33e6ad7216373b944..5f2f53fc7ad5d3eaf2207805558a9b56ad0559bf 100644 (file)
@@ -93,12 +93,13 @@ module QueriesHelper
     tags
   end
 
-  def available_totalable_columns_tags(query)
+  def available_totalable_columns_tags(query, options={})
+    tag_name = (options[:name] || 't') + '[]'
     tags = ''.html_safe
     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
-    tags << hidden_field_tag('t[]', '')
+    tags << hidden_field_tag(tag_name, '')
     tags
   end
 
@@ -282,7 +283,7 @@ module QueriesHelper
   end
 
   # 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
 
     if params[:query_id].present?
@@ -295,7 +296,7 @@ module QueriesHelper
     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
       @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
     else
       # retrieve from session
index dedbe8d0a6c68998acda4142a149e808304ac5c9..b002f909cc4a9fd13102d258e6227414b9a0e09a 100644 (file)
@@ -73,7 +73,7 @@ class IssueQuery < Query
     options[:draw_progress_line] = (arg == '1' ? '1' : nil)
   end
 
-  def build_from_params(params)
+  def build_from_params(params, defaults={})
     super
     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])
index c8c89860d109b86ee96d5d032f69bd5fd87637bf..02e808ecae79c2232f3911d88b9164a322db024d 100644 (file)
@@ -365,7 +365,7 @@ class Query < ActiveRecord::Base
   end
 
   # Builds the query from the given params
-  def build_from_params(params)
+  def build_from_params(params, defaults={})
     if params[:fields] || params[:f]
       self.filters = {}
       add_filters(params[:fields] || params[:f], params[:operators] || params[:op], params[:values] || params[:v])
@@ -374,10 +374,12 @@ class Query < ActiveRecord::Base
         add_short_filter(field, params[field]) if params[field]
       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
   end
 
index ee15699f44cc239985bfa504f27ef5f0932b048c..43fdc8625d1e0c0c986f513d8dd9e5ea714718a0 100644 (file)
@@ -191,7 +191,7 @@ class TimeEntryQuery < Query
   end
 
   # Accepts :from/:to params as shortcut filters
-  def build_from_params(params)
+  def build_from_params(params, defaults={})
     super
     if params[:from].present? && params[:to].present?
       add_filter('spent_on', '><', [params[:from], params[:to]])
index 4f922011bca7f975c794830f4e8840816873a0be..c4453a6169a66da9c47a47480df64e8587a3b782 100644 (file)
@@ -6,5 +6,19 @@
 
 </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) %>
 <% end %>
index 50a003f84023b429e647af3b22b803537f153902..28187271162689bf5937cd01dadcc63a93b7cba7 100644 (file)
@@ -463,6 +463,7 @@ en:
   setting_commit_logs_formatting: Apply text formatting to commit messages
   setting_timelog_required_fields: Required fields for time logs
   setting_close_duplicate_issues: Close duplicate issues automatically
+  setting_time_entry_list_defaults: Timelog list defaults
 
   permission_add_project: Create project
   permission_add_subprojects: Create subprojects
index 48226cfb0ed3ae63aa848a46e116f86b8cc851f5..02d4570f046a70b845c7c4ce956d8c15c641898e 100644 (file)
@@ -475,6 +475,8 @@ fr:
   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_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_subprojects: Créer des sous-projets
index 2a4ab1d75d4e42041c3bae629683144b4ddfcb5e..556014a6a63a41e37318c659b47fbf68730a61fe 100644 (file)
@@ -210,6 +210,16 @@ issue_list_default_totals:
   default: []
 display_subprojects_issues:
   default: 1
+time_entry_list_defaults:
+  serialized: true
+  default:
+    column_names:
+    - spent_on
+    - user
+    - activity
+    - issue
+    - comments
+    - hours
 issue_done_ratio:
   default: 'issue_field'
 default_projects_public:
index 89b1ccfcf2347270546a1d283ad9f3149e8bc04e..37c584472e8a2620b6afea10acd037410743b109 100644 (file)
@@ -28,6 +28,11 @@ class TimelogControllerTest < Redmine::ControllerTest
 
   include Redmine::I18n
 
+  def setup
+    super
+    Setting.default_language = 'en'
+  end
+
   def test_new
     @request.session[:user_id] = 3
     get :new
@@ -705,6 +710,36 @@ class TimelogControllerTest < Redmine::ControllerTest
 
     assert_select '.total-for-hours', :text => 'Hours: 162.90'
     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
 
   def test_index_all_projects_should_show_log_time_link
index 0066d3819ab5d500cd4dcb6d5de09484b9ab4721..ffb2d70556bfc902d32b70b72af70a64c3f1acbe 100644 (file)
@@ -303,11 +303,16 @@ module Redmine
       Issue.where(:id => ids).sort_by {|issue| ids.index(issue.id)}
     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
       css_select('table.issues thead th:not(.checkbox)').map(&:text)
     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
     def assert_query_filters(expected_filters)
       response.body =~ /initFilters\(\);\s*((addFilter\(.+\);\s*)*)/
index 53c2e775510d8dccb459ef55520137ce8a0aa513..556e35a46e65a51b04572af8ec21a7f767bcaa5c 100644 (file)
@@ -94,11 +94,15 @@ module Redmine
 
       setup do
         clear_downloaded_files
+        Setting.delete_all
+        Setting.clear_cache
       end
 
       teardown do
         Capybara.reset_sessions!    # Forget the (simulated) browser state
         Capybara.use_default_driver # Revert Capybara.current_driver to Capybara.default_driver
+        Setting.delete_all
+        Setting.clear_cache
       end
     end
   end
index 095d63eccdfbc62e6411134c8016302d7922daa5..3341a136b72304e4d876094f656e0eb3c673b344 100644 (file)
@@ -1,3 +1,5 @@
+# encoding: utf-8
+#
 # Redmine - project management software
 # Copyright (C) 2006-2017  Jean-Philippe Lang
 #
@@ -69,4 +71,31 @@ class Redmine::UiTest::TimelogTest < Redmine::UiTest::Base
     entries = TimeEntry.where(:id => [1,2,3]).to_a
     assert entries.all? {|entry| entry.hours == 7.0}
   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 "â†\90"
+    # 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