aboutsummaryrefslogtreecommitdiffstats
path: root/todolist
diff options
context:
space:
mode:
authorStuart Skelton <stuarts@broadbean.com>2017-08-01 13:51:31 +0100
committerStuart Skelton <stuarts@broadbean.com>2017-08-01 14:06:05 +0100
commit650d53a6000a483e11da91b3466e1f57a96c3da0 (patch)
tree13844aba7b8a1fff87a42c9380be3bee867bf22f /todolist
parentbd8acfdea25486e71e4f19ff0703ef59d5ba5dfa (diff)
Added a filter for completed date
Diffstat (limited to 'todolist')
-rw-r--r--todolist/date_filter.go34
-rw-r--r--todolist/date_filter_test.go56
-rw-r--r--todolist/todo_item.go7
3 files changed, 93 insertions, 4 deletions
diff --git a/todolist/date_filter.go b/todolist/date_filter.go
index a43e3c8..b91bee3 100644
--- a/todolist/date_filter.go
+++ b/todolist/date_filter.go
@@ -18,12 +18,17 @@ func filterOnDue(todo *Todo) string {
return todo.Due
}
+func filterOnCompletedDate(todo *Todo) string {
+ return todo.CompletedDateToDate()
+}
+
func (f *DateFilter) FilterDate(input string) []*Todo {
agendaRegex, _ := regexp.Compile(`agenda.*$`)
if agendaRegex.MatchString(input) {
return f.filterAgenda(bod(time.Now()))
}
+ // filter due items
r, _ := regexp.Compile(`due .*$`)
match := r.FindString(input)
switch {
@@ -54,6 +59,17 @@ func (f *DateFilter) FilterDate(input string) []*Todo {
case match == "overdue":
return f.filterOverdue(bod(time.Now()))
}
+
+ // filter completed items
+ r, _ = regexp.Compile(`completed .*$`)
+ match = r.FindString(input)
+ switch {
+ case match == "completed tod" || match == "completed today":
+ return f.filterCompletedToday(bod(time.Now()))
+ case match == "completed this week":
+ return f.filterCompletedThisWeek(bod(time.Now()))
+ }
+
return f.Todos
}
@@ -91,6 +107,10 @@ func (f *DateFilter) filterDueTomorrow(pivot time.Time) []*Todo {
return f.filterToExactDate(pivot, filterOnDue)
}
+func (f *DateFilter) filterCompletedToday(pivot time.Time) []*Todo {
+ return f.filterToExactDate(pivot, filterOnCompletedDate)
+}
+
func (f *DateFilter) filterDay(pivot time.Time, day time.Weekday) []*Todo {
var ret []*Todo
filtered := f.filterThisWeek(pivot)
@@ -104,11 +124,11 @@ func (f *DateFilter) filterDay(pivot time.Time, day time.Weekday) []*Todo {
return ret
}
-func (f *DateFilter) filterBetweenDatesInclusive(begin, end time.Time) []*Todo {
+func (f *DateFilter) filterBetweenDatesInclusive(begin, end time.Time, filterOn func(*Todo) string) []*Todo {
var ret []*Todo
for _, todo := range f.Todos {
- dueTime, _ := time.ParseInLocation("2006-01-02", todo.Due, f.Location)
+ dueTime, _ := time.ParseInLocation("2006-01-02", filterOn(todo), f.Location)
if (begin.Before(dueTime) || begin.Equal(dueTime)) && end.After(dueTime) {
ret = append(ret, todo)
}
@@ -121,7 +141,15 @@ func (f *DateFilter) filterThisWeek(pivot time.Time) []*Todo {
begin := bod(f.FindSunday(pivot))
end := begin.AddDate(0, 0, 7)
- return f.filterBetweenDatesInclusive(begin, end)
+ return f.filterBetweenDatesInclusive(begin, end, filterOnDue)
+}
+
+func (f *DateFilter) filterCompletedThisWeek(pivot time.Time) []*Todo {
+
+ begin := bod(f.FindSunday(pivot))
+ end := begin.AddDate(0, 0, 7)
+
+ return f.filterBetweenDatesInclusive(begin, end, filterOnCompletedDate)
}
func (f *DateFilter) filterBetweenDatesExclusive(begin, end time.Time) []*Todo {
diff --git a/todolist/date_filter_test.go b/todolist/date_filter_test.go
index a89e27f..e2ac570 100644
--- a/todolist/date_filter_test.go
+++ b/todolist/date_filter_test.go
@@ -39,6 +39,38 @@ func TestFilterTomorrow(t *testing.T) {
assert.Equal(2, filtered[0].Id)
}
+func TestFilterCompletedToday(t *testing.T) {
+ assert := assert.New(t)
+
+ var todos []*Todo
+ todoNo1 := &Todo{Id: 1, Subject: "one", Due: time.Now().Format("2006-01-02")}
+ todoNo2 := &Todo{Id: 2, Subject: "two", Due: time.Now().Format("2006-01-02")}
+
+ todos = append(todos, todoNo1)
+ todos = append(todos, todoNo2)
+
+ filter := NewDateFilter(todos)
+ filtered := filter.filterCompletedToday(time.Now())
+
+ assert.Equal(0, len(filtered))
+
+ // now to complted one and see see what happens
+ todoNo1.Complete()
+ filtered = filter.filterCompletedToday(time.Now())
+
+ assert.Equal(1, len(filtered))
+ assert.Equal(1, filtered[0].Id)
+
+ // now to complted one and see see what happens
+ todoNo1.Uncomplete()
+ todoNo2.Complete()
+ filtered = filter.filterCompletedToday(time.Now())
+
+ assert.Equal(1, len(filtered))
+ assert.Equal(2, filtered[0].Id)
+
+}
+
func TestFilterThisWeek(t *testing.T) {
assert := assert.New(t)
@@ -57,6 +89,30 @@ func TestFilterThisWeek(t *testing.T) {
assert.Equal(2, filtered[0].Id)
}
+func TestFilterCompletedThisWeek(t *testing.T) {
+ assert := assert.New(t)
+
+ var todos []*Todo
+ lastWeekTodo := &Todo{Id: 1, Subject: "two", Due: time.Now().AddDate(0, 0, -7).Format("2006-01-02")}
+ todayTodo := &Todo{Id: 2, Subject: "one", Due: time.Now().Format("2006-01-02")}
+ nextWeekTodo := &Todo{Id: 3, Subject: "two", Due: time.Now().AddDate(0, 0, 8).Format("2006-01-02")}
+ todos = append(todos, lastWeekTodo)
+ todos = append(todos, todayTodo)
+ todos = append(todos, nextWeekTodo)
+
+ filter := NewDateFilter(todos)
+ filtered := filter.filterCompletedThisWeek(time.Now())
+
+ assert.Equal(0, len(filtered))
+
+ todayTodo.Complete()
+ filtered = filter.filterCompletedThisWeek(time.Now())
+
+ assert.Equal(1, len(filtered))
+ assert.Equal(2, filtered[0].Id)
+
+}
+
func TestFilterOverdue(t *testing.T) {
assert := assert.New(t)
diff --git a/todolist/todo_item.go b/todolist/todo_item.go
index 859e946..eecb409 100644
--- a/todolist/todo_item.go
+++ b/todolist/todo_item.go
@@ -43,4 +43,9 @@ func (t *Todo) Complete() {
func (t *Todo) Uncomplete() {
t.Completed = false
t.CompletedDate = ""
-} \ No newline at end of file
+}
+
+func (t Todo) CompletedDateToDate() string {
+ parsedTime, _ := time.Parse(ISO8601_TIMESTAMP_FORMAT, t.CompletedDate)
+ return parsedTime.Format("2006-01-02")
+}