]> source.dussan.org Git - redmine.git/commitdiff
New date filter operators: tomorrow, next week, next month (#4502).
authorGo MAEDA <maeda@farend.jp>
Sat, 19 Jan 2019 07:42:26 +0000 (07:42 +0000)
committerGo MAEDA <maeda@farend.jp>
Sat, 19 Jan 2019 07:42:26 +0000 (07:42 +0000)
Patch by Mizuki ISHIKAWA.

git-svn-id: http://svn.redmine.org/redmine/trunk@17811 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/query.rb
config/locales/en.yml
config/locales/ja.yml
public/javascripts/application.js
test/unit/query_test.rb

index 1aa09d2a2ed470dbc5977b65689a7e5581853a7e..73e280dd326a32bfcb60c7071d5541d31d6833c7 100644 (file)
@@ -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
index cdc79640bc9ac6b5758654af9ca0e0ceb1113959..fa2ff56f22cb687da4b0b33c3596b95d4ecfae07 100644 (file)
@@ -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
index 07e0397a5cef3edcf826b568065ce60c64c0fc1e..4ffcf9e8031dc6ae602f0373361c7d43c434a2d6 100644 (file)
@@ -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日前以降
index 75848dd2cccd3459d59bd1e23f0be35b67ae8ae2..cb4d42a9940998bfd2836bee9b3cf97ebf953cfc 100644 (file)
@@ -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'));
index e868ef4568617a817d155f7fc4d74bb6d6575c60..4950d9b1c53e293687bcf299419e51b27ed9cb34 100644 (file)
@@ -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)