diff options
author | Go MAEDA <maeda@farend.jp> | 2019-01-19 07:42:26 +0000 |
---|---|---|
committer | Go MAEDA <maeda@farend.jp> | 2019-01-19 07:42:26 +0000 |
commit | 04ac58b3c52479e0deb937a9a7063df3fbd84b95 (patch) | |
tree | 1ed11eb6d99adae31876592ef6f5941ca7ddc304 | |
parent | a8d24ab4b8bc7e5a5df812790581420bdbf7b37a (diff) | |
download | redmine-04ac58b3c52479e0deb937a9a7063df3fbd84b95.tar.gz redmine-04ac58b3c52479e0deb937a9a7063df3fbd84b95.zip |
New date filter operators: tomorrow, next week, next month (#4502).
Patch by Mizuki ISHIKAWA.
git-svn-id: http://svn.redmine.org/redmine/trunk@17811 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r-- | app/models/query.rb | 22 | ||||
-rw-r--r-- | config/locales/en.yml | 3 | ||||
-rw-r--r-- | config/locales/ja.yml | 3 | ||||
-rw-r--r-- | public/javascripts/application.js | 5 | ||||
-rw-r--r-- | test/unit/query_test.rb | 44 |
5 files changed, 72 insertions, 5 deletions
diff --git a/app/models/query.rb b/app/models/query.rb index 1aa09d2a2..73e280dd3 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -263,11 +263,14 @@ class Query < ActiveRecord::Base ">t+" => :label_in_more_than, "><t+"=> :label_in_the_next_days, "t+" => :label_in, + "nd" => :label_tomorrow, "t" => :label_today, "ld" => :label_yesterday, + "nw" => :label_next_week, "w" => :label_this_week, "lw" => :label_last_week, "l2w" => [:label_last_n_weeks, {:count => 2}], + "nm" => :label_next_month, "m" => :label_this_month, "lm" => :label_last_month, "y" => :label_this_year, @@ -281,7 +284,7 @@ class Query < ActiveRecord::Base "=!p" => :label_any_issues_not_in_project, "!p" => :label_no_issues_in_project, "*o" => :label_any_open_issues, - "!o" => :label_no_open_issues + "!o" => :label_no_open_issues, } class_attribute :operators_by_filter_type @@ -290,7 +293,7 @@ class Query < ActiveRecord::Base :list_status => [ "o", "=", "!", "c", "*" ], :list_optional => [ "=", "!", "!*", "*" ], :list_subprojects => [ "*", "!*", "=", "!" ], - :date => [ "=", ">=", "<=", "><", "<t+", ">t+", "><t+", "t+", "t", "ld", "w", "lw", "l2w", "m", "lm", "y", ">t-", "<t-", "><t-", "t-", "!*", "*" ], + :date => [ "=", ">=", "<=", "><", "<t+", ">t+", "><t+", "t+", "nd", "t", "ld", "nw", "w", "lw", "l2w", "nm", "m", "lm", "y", ">t-", "<t-", "><t-", "t-", "!*", "*" ], :date_past => [ "=", ">=", "<=", "><", ">t-", "<t-", "><t-", "t-", "t", "ld", "w", "lw", "l2w", "m", "lm", "y", "!*", "*" ], :string => [ "~", "=", "!~", "!", "!*", "*" ], :text => [ "~", "!~", "!*", "*" ], @@ -453,7 +456,7 @@ class Query < ActiveRecord::Base # filter requires one or more values (values_for(field) and !values_for(field).first.blank?) or # filter doesn't require any value - ["o", "c", "!*", "*", "t", "ld", "w", "lw", "l2w", "m", "lm", "y", "*o", "!o"].include? operator_for(field) + ["o", "c", "!*", "*", "nd", "t", "ld", "nw", "w", "lw", "l2w", "nm", "m", "lm", "y", "*o", "!o"].include? operator_for(field) end if filters end @@ -1207,6 +1210,9 @@ class Query < ActiveRecord::Base when "ld" # = yesterday sql = relative_date_clause(db_table, db_field, -1, -1, is_custom_filter) + when "nd" + # = tomorrow + sql = relative_date_clause(db_table, db_field, 1, 1, is_custom_filter) when "w" # = this week first_day_of_week = l(:general_first_day_of_week).to_i @@ -1225,6 +1231,12 @@ class Query < ActiveRecord::Base day_of_week = User.current.today.cwday days_ago = (day_of_week >= first_day_of_week ? day_of_week - first_day_of_week : day_of_week + 7 - first_day_of_week) sql = relative_date_clause(db_table, db_field, - days_ago - 14, - days_ago - 1, is_custom_filter) + when "nw" + # = next week + first_day_of_week = l(:general_first_day_of_week).to_i + day_of_week = User.current.today.cwday + from = -(day_of_week >= first_day_of_week ? day_of_week - first_day_of_week : day_of_week + 7 - first_day_of_week) + 7 + sql = relative_date_clause(db_table, db_field, from, from + 6, is_custom_filter) when "m" # = this month date = User.current.today @@ -1233,6 +1245,10 @@ class Query < ActiveRecord::Base # = last month date = User.current.today.prev_month sql = date_clause(db_table, db_field, date.beginning_of_month, date.end_of_month, is_custom_filter) + when "nm" + # = next month + date = User.current.today.next_month + sql = date_clause(db_table, db_field, date.beginning_of_month, date.end_of_month, is_custom_filter) when "y" # = this year date = User.current.today diff --git a/config/locales/en.yml b/config/locales/en.yml index cdc79640b..fa2ff56f2 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -743,12 +743,15 @@ en: label_today: today label_all_time: all time label_yesterday: yesterday + label_tomorrow: tomorrow label_this_week: this week label_last_week: last week + label_next_week: next week label_last_n_weeks: "last %{count} weeks" label_last_n_days: "last %{count} days" label_this_month: this month label_last_month: last month + label_next_month: next month label_this_year: this year label_date_range: Date range label_less_than_ago: less than days ago diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 07e0397a5..4ffcf9e80 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -635,11 +635,14 @@ ja: label_today: 今日 label_all_time: 全期間 label_yesterday: 昨日 + label_tomorrow: 明日 label_this_week: 今週 label_last_week: 先週 + label_next_week: 来週 label_last_n_days: "直近%{count}日間" label_this_month: 今月 label_last_month: 先月 + label_next_month: 来月 label_this_year: 今年 label_date_range: 期間 label_less_than_ago: N日前以降 diff --git a/public/javascripts/application.js b/public/javascripts/application.js index 75848dd2c..cb4d42a99 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -289,11 +289,14 @@ function toggleOperator(field) { switch (operator.val()) { case "!*": case "*": + case "nd": case "t": case "ld": + case "nw": case "w": case "lw": case "l2w": + case "nm": case "m": case "lm": case "y": @@ -907,7 +910,7 @@ $(function ($) { function setFilecontentContainerHeight() { var $filecontainer = $('.filecontent-container'); var fileTypeSelectors = ['.image', 'video']; - + if($filecontainer.length > 0 && $filecontainer.find(fileTypeSelectors.join(',')).length === 1) { var containerOffsetTop = $filecontainer.offset().top; var containerMarginBottom = parseInt($filecontainer.css('marginBottom')); diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb index e868ef456..4950d9b1c 100644 --- a/test/unit/query_test.rb +++ b/test/unit/query_test.rb @@ -638,8 +638,16 @@ class QueryTest < ActiveSupport::TestCase issues.each {|issue| assert_equal Date.today, issue.due_date} end + def test_operator_tomorrow + query = IssueQuery.new(:project => Project.find(1), :name => '_') + query.add_filter('due_date', 'nd', ['']) + issues = find_issues_with_query(query) + assert !issues.empty? + issues.each {|issue| assert_equal Date.today.tomorrow, issue.due_date} + end + def test_operator_date_periods - %w(t ld w lw l2w m lm y).each do |operator| + %w(t ld w lw l2w m lm y nd nw nm).each do |operator| query = IssueQuery.new(:name => '_') query.add_filter('due_date', operator, ['']) assert query.valid? @@ -710,6 +718,40 @@ class QueryTest < ActiveSupport::TestCase query.statement end + def test_range_for_next_week_with_week_starting_on_monday + I18n.locale = :fr + assert_equal '1', I18n.t(:general_first_day_of_week) + + Date.stubs(:today).returns(Date.parse('2011-04-29')) # Friday + + query = IssueQuery.new(:project => Project.find(1), :name => '_') + query.add_filter('due_date', 'nw', ['']) + assert_match /issues\.due_date > '#{quoted_date "2011-05-01"} 23:59:59(\.\d+)?' AND issues\.due_date <= '#{quoted_date "2011-05-08"} 23:59:59(\.\d+)?/, + query.statement + I18n.locale = :en + end + + def test_range_for_next_week_with_week_starting_on_sunday + I18n.locale = :en + assert_equal '7', I18n.t(:general_first_day_of_week) + + Date.stubs(:today).returns(Date.parse('2011-04-29')) # Friday + + query = IssueQuery.new(:project => Project.find(1), :name => '_') + query.add_filter('due_date', 'nw', ['']) + assert_match /issues\.due_date > '#{quoted_date "2011-04-30"} 23:59:59(\.\d+)?' AND issues\.due_date <= '#{quoted_date "2011-05-07"} 23:59:59(\.\d+)?/, + query.statement + end + + def test_range_for_next_month + Date.stubs(:today).returns(Date.parse('2011-04-29')) # Friday + + query = IssueQuery.new(:project => Project.find(1), :name => '_') + query.add_filter('due_date', 'nm', ['']) + assert_match /issues\.due_date > '#{quoted_date "2011-04-30"} 23:59:59(\.\d+)?' AND issues\.due_date <= '#{quoted_date "2011-05-31"} 23:59:59(\.\d+)?/, + query.statement + end + def test_filter_assigned_to_me user = User.find(2) group = Group.find(10) |