summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGo MAEDA <maeda@farend.jp>2019-01-19 07:42:26 +0000
committerGo MAEDA <maeda@farend.jp>2019-01-19 07:42:26 +0000
commit04ac58b3c52479e0deb937a9a7063df3fbd84b95 (patch)
tree1ed11eb6d99adae31876592ef6f5941ca7ddc304
parenta8d24ab4b8bc7e5a5df812790581420bdbf7b37a (diff)
downloadredmine-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.rb22
-rw-r--r--config/locales/en.yml3
-rw-r--r--config/locales/ja.yml3
-rw-r--r--public/javascripts/application.js5
-rw-r--r--test/unit/query_test.rb44
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)