summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/finders/issuable_finder.rb26
-rw-r--r--app/helpers/issues_helper.rb12
-rw-r--r--app/helpers/sorting_helper.rb4
-rw-r--r--app/models/concerns/issuable.rb6
-rw-r--r--app/models/concerns/sortable.rb8
-rw-r--r--app/models/issue.rb8
-rw-r--r--app/views/shared/_sort_dropdown.html.haml4
-rw-r--r--app/views/shared/issuable/_filter.html.haml2
-rw-r--r--app/views/shared/issuable/_sidebar.html.haml1
-rw-r--r--spec/features/issues_spec.rb30
10 files changed, 69 insertions, 32 deletions
diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb
index 5e08193b5cf..7613283443a 100644
--- a/app/finders/issuable_finder.rb
+++ b/app/finders/issuable_finder.rb
@@ -118,7 +118,19 @@ class IssuableFinder
end
def filter_by_no_due_date?
- due_date? && params[:due_date] == Issue::NO_DUE_DATE[1]
+ due_date? && params[:due_date] == Issue::NoDueDate.name
+ end
+
+ def filter_by_overdue?
+ due_date? && params[:due_date] == Issue::OverDue.name
+ end
+
+ def filter_by_due_this_week?
+ due_date? && params[:due_date] == Issue::DueThisWeek.name
+ end
+
+ def filter_by_due_this_month?
+ due_date? && params[:due_date] == Issue::DueThisMonth.name
end
def labels?
@@ -295,11 +307,13 @@ class IssuableFinder
def by_due_date(items)
if due_date?
if filter_by_no_due_date?
- items = items.no_due_date
- else
- items = items.has_due_date
- # Must use issues prefix to avoid ambiguous match with Milestone#due_date
- items = items.where("issues.due_date > ? AND issues.due_date <= ?", Date.today, params[:due_date])
+ items = items.without_due_date
+ elsif filter_by_overdue?
+ items = items.overdue
+ elsif filter_by_due_this_week?
+ items = items.due_between(Date.today.beginning_of_week, Date.today.end_of_week + 1.day)
+ elsif filter_by_due_this_month?
+ items = items.due_between(Date.today.beginning_of_month, Date.today.end_of_month + 1.day)
end
end
items
diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb
index 2a193e12ec9..d3779eda91f 100644
--- a/app/helpers/issues_helper.rb
+++ b/app/helpers/issues_helper.rb
@@ -174,12 +174,14 @@ module IssuesHelper
def due_date_options
options = [
- ["Due to tomorrow", 1.day.from_now.to_date],
- ["Due in this week", 1.week.from_now.to_date]
+ Issue::AnyDueDate,
+ Issue::NoDueDate,
+ Issue::DueThisWeek,
+ Issue::DueThisMonth,
+ Issue::OverDue
]
- options.unshift(Issue::ANY_DUE_DATE)
- options.unshift(Issue::NO_DUE_DATE)
- options_for_select(options, params[:due_date])
+
+ options_from_collection_for_select(options, 'name', 'title', params[:due_date])
end
diff --git a/app/helpers/sorting_helper.rb b/app/helpers/sorting_helper.rb
index 624cb7bb847..630e10ea892 100644
--- a/app/helpers/sorting_helper.rb
+++ b/app/helpers/sorting_helper.rb
@@ -53,11 +53,11 @@ module SortingHelper
end
def sort_title_due_date_soon
- 'Due date soon'
+ 'Due soon'
end
def sort_title_due_date_later
- 'Due date due later'
+ 'Due later'
end
def sort_title_name
diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb
index 691b7e104e4..03d8a573a4d 100644
--- a/app/models/concerns/issuable.rb
+++ b/app/models/concerns/issuable.rb
@@ -39,8 +39,10 @@ module Issuable
scope :order_milestone_due_asc, -> { joins(:milestone).reorder('milestones.due_date ASC, milestones.id ASC') }
scope :with_label, ->(title) { joins(:labels).where(labels: { title: title }) }
scope :without_label, -> { joins("LEFT OUTER JOIN label_links ON label_links.target_type = '#{name}' AND label_links.target_id = #{table_name}.id").where(label_links: { id: nil }) }
- scope :has_due_date, ->{ where("issues.due_date IS NOT NULL") }
- scope :no_due_date, ->{ where("issues.due_date IS NULL")}
+ scope :without_due_date, ->{ where("issues.due_date IS NULL")}
+ scope :due_before, ->(date){ where("issues.due_date IS NOT NULL AND issues.due_date < ?", date)}
+ scope :due_between, ->(from_date, to_date){ where("issues.due_date >= ?", from_date).due_before(to_date) }
+ scope :overdue, ->{ where("issues.due_date < ?", Date.today)}
scope :join_project, -> { joins(:project) }
scope :references_project, -> { references(:project) }
diff --git a/app/models/concerns/sortable.rb b/app/models/concerns/sortable.rb
index 86c7e38adc8..f1f09011c1b 100644
--- a/app/models/concerns/sortable.rb
+++ b/app/models/concerns/sortable.rb
@@ -18,8 +18,8 @@ module Sortable
scope :order_updated_asc, -> { reorder(updated_at: :asc) }
scope :order_name_asc, -> { reorder(name: :asc) }
scope :order_name_desc, -> { reorder(name: :desc) }
- scope :due_date_asc, -> { reorder("due_date IS NULL, due_date ASC") }
- scope :due_date_desc, -> { reorder("due_date IS NULL, due_date DESC") }
+ scope :order_due_date_asc, -> { reorder("issues.due_date IS NULL, issues.due_date ASC") }
+ scope :order_due_date_desc, -> { reorder("issues.due_date IS NULL, issues.due_date DESC") }
end
module ClassMethods
@@ -33,8 +33,8 @@ module Sortable
when 'created_desc' then order_created_desc
when 'id_desc' then order_id_desc
when 'id_asc' then order_id_asc
- when 'due_date_asc' then due_date_asc
- when 'due_date_desc' then due_date_desc
+ when 'due_date_asc' then order_due_date_asc
+ when 'due_date_desc' then order_due_date_desc
else
all
end
diff --git a/app/models/issue.rb b/app/models/issue.rb
index ee5be904330..b9350e191b7 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -28,8 +28,12 @@ class Issue < ActiveRecord::Base
include Sortable
include Taskable
- NO_DUE_DATE = ['No Due Date', '0']
- ANY_DUE_DATE = ['Any Due Date', '']
+ DueDateStruct = Struct.new(:title, :name)
+ NoDueDate = DueDateStruct.new('No Due Date', '0')
+ AnyDueDate = DueDateStruct.new('Any Due Date', '')
+ OverDue = DueDateStruct.new('Overdue', 'overdue')
+ DueThisWeek = DueDateStruct.new('Due This Week', 'week')
+ DueThisMonth = DueDateStruct.new('Due This Month', 'month')
ActsAsTaggableOn.strict_case_match = true
diff --git a/app/views/shared/_sort_dropdown.html.haml b/app/views/shared/_sort_dropdown.html.haml
index 80971309da7..922b02f9f3e 100644
--- a/app/views/shared/_sort_dropdown.html.haml
+++ b/app/views/shared/_sort_dropdown.html.haml
@@ -21,9 +21,9 @@
= link_to page_filter_path(sort: sort_value_milestone_later) do
= sort_title_milestone_later
= link_to page_filter_path(sort: sort_value_due_date_soon) do
- = sort_title_due_date_soon if controller_name == "issues"
+ = sort_title_due_date_soon if @issues
= link_to page_filter_path(sort: sort_value_due_date_later) do
- = sort_title_due_date_later if controller_name == "issues"
+ = sort_title_due_date_later if @issues
= link_to page_filter_path(sort: sort_value_upvotes) do
= sort_title_upvotes
= link_to page_filter_path(sort: sort_value_downvotes) do
diff --git a/app/views/shared/issuable/_filter.html.haml b/app/views/shared/issuable/_filter.html.haml
index f832f430b2b..7b76e7e368b 100644
--- a/app/views/shared/issuable/_filter.html.haml
+++ b/app/views/shared/issuable/_filter.html.haml
@@ -24,7 +24,7 @@
.filter-item.inline.labels-filter
= render "shared/issuable/label_dropdown"
- - if controller.controller_name == 'issues'
+ - if @issues
.filter-item.inline.due_date-filter
= select_tag('due_date', due_date_options,
class: 'select2 trigger-submit', include_blank: true,
diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml
index fb2c727d57a..8923efd2fc2 100644
--- a/app/views/shared/issuable/_sidebar.html.haml
+++ b/app/views/shared/issuable/_sidebar.html.haml
@@ -80,7 +80,6 @@
= icon('calendar')
%span
- if issuable.due_date
- = icon('calendar')
= issuable.due_date.to_s(:medium)
- else
.light None
diff --git a/spec/features/issues_spec.rb b/spec/features/issues_spec.rb
index ac54a0c2719..32c27d6e97e 100644
--- a/spec/features/issues_spec.rb
+++ b/spec/features/issues_spec.rb
@@ -187,33 +187,49 @@ describe 'Issues', feature: true do
end
it 'filters by none' do
- visit namespace_project_issues_path(project.namespace, project, due_date: Issue::NO_DUE_DATE[1])
+ visit namespace_project_issues_path(project.namespace, project, due_date: Issue::NoDueDate.name)
expect(page).not_to have_content("foo")
expect(page).not_to have_content("bar")
expect(page).to have_content("baz")
end
it 'filters by any' do
- visit namespace_project_issues_path(project.namespace, project, due_date: Issue::ANY_DUE_DATE[1])
+ visit namespace_project_issues_path(project.namespace, project, due_date: Issue::AnyDueDate.name)
expect(page).to have_content("foo")
expect(page).to have_content("bar")
expect(page).to have_content("baz")
end
- it 'filters by due to tomorrow' do
- visit namespace_project_issues_path(project.namespace, project, due_date: Date.tomorrow.to_s)
+ it 'filters by due this week' do
+ foo.update(due_date: Date.today.beginning_of_week + 2.days)
+ bar.update(due_date: Date.today.end_of_week)
+ baz.update(due_date: Date.today - 8.days)
+ visit namespace_project_issues_path(project.namespace, project, due_date: Issue::DueThisWeek.name)
expect(page).to have_content("foo")
- expect(page).not_to have_content("bar")
+ expect(page).to have_content("bar")
expect(page).not_to have_content("baz")
end
- it 'filters by due in this week' do
- visit namespace_project_issues_path(project.namespace, project, due_date: 7.days.from_now.to_date.to_s)
+ it 'filters by due this month' do
+ foo.update(due_date: Date.today.beginning_of_month + 2.days)
+ bar.update(due_date: Date.today.end_of_month)
+ baz.update(due_date: Date.today - 50.days)
+ visit namespace_project_issues_path(project.namespace, project, due_date: Issue::DueThisMonth.name)
expect(page).to have_content("foo")
expect(page).to have_content("bar")
expect(page).not_to have_content("baz")
end
+ it 'filters by overdue' do
+ foo.update(due_date: Date.today + 2.days)
+ bar.update(due_date: Date.today + 20.days)
+ baz.update(due_date: Date.yesterday)
+ visit namespace_project_issues_path(project.namespace, project, due_date: Issue::OverDue.name)
+ expect(page).not_to have_content("foo")
+ expect(page).not_to have_content("bar")
+ expect(page).to have_content("baz")
+ end
+
end
describe 'sorting by milestone' do