Skip to content

Commit 1465efb

Browse files
authored
Merge pull request #616 from code-corps/add-inbox-flag-to-task-lists
Add inbox flag to task lists
2 parents 7b38b92 + 3ccd28e commit 1465efb

8 files changed

Lines changed: 83 additions & 8 deletions

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
defmodule CodeCorps.Repo.Migrations.AddEditableToTaskLists do
2+
alias CodeCorps.{Repo, TaskList}
3+
4+
import Ecto.Query
5+
6+
use Ecto.Migration
7+
8+
def up do
9+
alter table(:task_lists) do
10+
add :inbox, :boolean, default: false
11+
end
12+
13+
flush
14+
15+
TaskList
16+
|> where([task_list], task_list.name == "Inbox")
17+
|> Repo.update_all(set: [inbox: true])
18+
end
19+
20+
def down do
21+
alter table(:task_lists) do
22+
remove :inbox
23+
end
24+
end
25+
end

test/lib/code_corps/services/markdown_renderer_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ defmodule CodeCorps.Services.MarkdownRendererServiceTest do
77

88
@valid_attrs %{
99
title: "Test task",
10+
task_list_id: 1,
1011
task_type: "issue",
1112
markdown: "A **strong** body",
1213
status: "open"

test/models/task_list_test.exs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,13 @@ defmodule CodeCorps.TaskListTest do
1515
changeset = TaskList.changeset(%TaskList{}, @invalid_attrs)
1616
refute changeset.valid?
1717
end
18+
19+
test "is not inbox by default" do
20+
{:ok, record} =
21+
%TaskList{}
22+
|> TaskList.changeset(@valid_attrs)
23+
|> CodeCorps.Repo.insert
24+
25+
refute record.inbox
26+
end
1827
end

test/models/task_test.exs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ defmodule CodeCorps.TaskTest do
66
@valid_attrs %{
77
title: "Test task",
88
task_type: "issue",
9-
markdown: "A test task",
9+
markdown: "A test task"
1010
}
1111
@invalid_attrs %{
1212
task_type: "nonexistent"
@@ -27,9 +27,11 @@ defmodule CodeCorps.TaskTest do
2727
test "renders body html from markdown" do
2828
user = insert(:user)
2929
project = insert(:project)
30+
task_list = insert(:task_list)
3031
changes = Map.merge(@valid_attrs, %{
3132
markdown: "A **strong** body",
3233
project_id: project.id,
34+
task_list_id: task_list.id,
3335
user_id: user.id
3436
})
3537
changeset = Task.changeset(%Task{}, changes)
@@ -120,6 +122,36 @@ defmodule CodeCorps.TaskTest do
120122
assert result_a.order == result_b.order
121123
end
122124

125+
test "repositions tasks correctly" do
126+
user = insert(:user)
127+
project = insert(:project)
128+
task_list = insert(:task_list, name: "Task List", project: project)
129+
130+
task_1 = insert(:task, project: project, user: user, task_list: task_list, order: 1000)
131+
task_2 = insert(:task, project: project, user: user, task_list: task_list, order: 2000)
132+
133+
task_list_2 = insert(:task_list, name: "Task List 2", project: project)
134+
task_3 = insert(:task, project: project, user: user, task_list: task_list_2)
135+
136+
{:ok, task_1_result} =
137+
task_1
138+
|> Task.update_changeset(%{position: 0})
139+
|> Repo.update
140+
141+
{:ok, task_2_result} =
142+
task_2
143+
|> Task.update_changeset(%{position: 1})
144+
|> Repo.update
145+
146+
{:ok, task_3_result} =
147+
task_3
148+
|> Task.update_changeset(%{position: 2, task_list_id: task_list.id})
149+
|> Repo.update
150+
151+
assert task_1_result.order < task_2_result.order
152+
assert task_2_result.order < task_3_result.order
153+
end
154+
123155
test "sets state to 'published'" do
124156
changeset = Task.create_changeset(%Task{}, %{})
125157
assert changeset |> get_change(:state) == "published"

test/views/task_list_view_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ defmodule CodeCorps.TaskListViewTest do
1313
expected_json = %{
1414
"data" => %{
1515
"attributes" => %{
16+
"inbox" => task_list.inbox,
1617
"name" => task_list.name,
1718
"order" => 1000,
1819
"inserted-at" => task_list.inserted_at,

web/models/task.ex

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,18 @@ defmodule CodeCorps.Task do
77
field :body, :string
88
field :markdown, :string
99
field :number, :integer, read_after_writes: true
10-
field :task_type, :string
10+
field :order, :integer
1111
field :state, :string
1212
field :status, :string, default: "open"
13+
field :task_type, :string
1314
field :title, :string
15+
1416
field :position, :integer, virtual: true
15-
field :order, :integer
1617

1718
belongs_to :project, CodeCorps.Project
18-
belongs_to :user, CodeCorps.User
1919
belongs_to :task_list, CodeCorps.TaskList
20+
belongs_to :user, CodeCorps.User
21+
2022
has_many :comments, CodeCorps.Comment
2123

2224
timestamps()
@@ -25,7 +27,7 @@ defmodule CodeCorps.Task do
2527
def changeset(struct, params \\ %{}) do
2628
struct
2729
|> cast(params, [:title, :markdown, :task_type, :task_list_id, :position])
28-
|> validate_required([:title, :markdown, :task_type])
30+
|> validate_required([:title, :markdown, :task_list_id, :task_type])
2931
|> validate_inclusion(:task_type, task_types)
3032
|> assoc_constraint(:task_list)
3133
|> apply_position()
@@ -37,7 +39,7 @@ defmodule CodeCorps.Task do
3739
struct
3840
|> changeset(params)
3941
|> cast(params, [:project_id, :user_id])
40-
|> validate_required([:project_id, :user_id, :task_list_id])
42+
|> validate_required([:project_id, :user_id])
4143
|> assoc_constraint(:project)
4244
|> assoc_constraint(:user)
4345
|> put_change(:state, "published")

web/models/task_list.ex

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ defmodule CodeCorps.TaskList do
33
import EctoOrdered
44

55
schema "task_lists" do
6+
field :inbox, :boolean, default: false
67
field :name, :string
7-
field :position, :integer, virtual: true
88
field :order, :integer
9+
field :position, :integer, virtual: true
910

1011
belongs_to :project, CodeCorps.Project
1112
has_many :tasks, CodeCorps.Task
@@ -16,15 +17,19 @@ defmodule CodeCorps.TaskList do
1617
def default_task_lists() do
1718
[
1819
%{
20+
inbox: true,
1921
name: "Inbox",
2022
position: 1
2123
}, %{
24+
inbox: false,
2225
name: "Backlog",
2326
position: 2
2427
}, %{
28+
inbox: false,
2529
name: "In Progress",
2630
position: 3
2731
}, %{
32+
inbox: false,
2833
name: "Done",
2934
position: 4
3035
}

web/views/task_list_view.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ defmodule CodeCorps.TaskListView do
33
use CodeCorps.Web, :view
44
use JaSerializer.PhoenixView
55

6-
attributes [:name, :order, :inserted_at, :updated_at]
6+
attributes [:inbox, :name, :order, :inserted_at, :updated_at]
77

88
has_one :project, serializer: CodeCorps.ProjectView
99

0 commit comments

Comments
 (0)