summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMehmet Beydogan <mehmet.beydogan@gmail.com>2016-03-18 19:17:01 +0200
committerRobert Speicher <rspeicher@gmail.com>2016-04-20 15:42:09 -0400
commit61a306aa58f7fffd652a31b85719b19d08f0fd7f (patch)
treed937ae097121109cc05070bde406ae7dc18416aa
parent83bda94ffcfe1944ea255fdbb8dfd9dac5b97d9f (diff)
downloadgitlab-ce-61a306aa58f7fffd652a31b85719b19d08f0fd7f.tar.gz
Fix functionality of due this week. Add due this month and overdue, remove due tomorrow to issues.
Fix typos on sorting dropdown related to due date Remove constant array and add Structs on Issue to keep due date data to fill options
-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