From 9d6c67f79156d60b74d52536deb2cd01ea57efad Mon Sep 17 00:00:00 2001 From: Jordan Knott Date: Thu, 18 Jun 2020 18:12:15 -0500 Subject: [PATCH] feature: add checklist --- api/graph/generated.go | 1935 ++++++++++++++++- api/graph/models_gen.go | 45 + api/graph/schema.graphqls | 70 + api/graph/schema.resolvers.go | 136 +- ...-delete-to-task-id-fk-on-task_label.up.sql | 6 + ...lete-to-task-id-fk-on-task_assigned.up.sql | 6 + ...-delete-to-task_group_id-fk-on-task.up.sql | 6 + ...8_add-complete-column-to-task-table.up.sql | 1 + api/migrations/0029_add-task_checklist.up.sql | 7 + .../0030_add-task_checklist_item.up.sql | 9 + api/pg/models.go | 19 + api/pg/pg.go | 12 + api/pg/querier.go | 9 + api/pg/task.sql.go | 49 +- api/pg/task_checklist.sql.go | 219 ++ api/query/task.sql | 3 + api/query/task_checklist.sql | 27 + api/trello.json | 1 + web/codegen.yml | 4 +- web/src/App/BaseStyles.ts | 2 +- web/src/App/Routes.tsx | 5 +- web/src/App/ThemeStyles.ts | 20 - web/src/App/index.tsx | 3 +- web/src/Projects/Project/Details/index.tsx | 82 +- web/src/Projects/Project/index.tsx | 75 +- web/src/citadel.d.ts | 1 + web/src/projects.d.ts | 19 + web/src/shared/components/AddList/Styles.ts | 10 +- web/src/shared/components/AddList/index.tsx | 2 +- web/src/shared/components/Card/Styles.ts | 26 +- web/src/shared/components/Card/index.tsx | 43 +- .../Checklist/Checklist.stories.tsx | 138 ++ web/src/shared/components/Checklist/index.tsx | 596 +++++ .../DueDateManager/DueDateManager.stories.tsx | 1 + .../components/DueDateManager/Styles.ts | 7 +- .../components/DueDateManager/index.tsx | 34 +- web/src/shared/components/Lists/Styles.ts | 34 +- web/src/shared/components/Lists/index.tsx | 203 +- .../shared/components/MemberManager/index.tsx | 2 +- .../shared/components/NewProject/index.tsx | 2 +- .../components/PopupMenu/LabelEditor.tsx | 2 +- .../components/PopupMenu/LabelManager.tsx | 2 +- .../PopupMenu/PopupMenu.stories.tsx | 1 + web/src/shared/components/PopupMenu/index.tsx | 28 +- .../QuickCardEditor.stories.tsx | 2 + .../components/QuickCardEditor/Styles.ts | 4 +- .../components/QuickCardEditor/index.tsx | 29 +- .../shared/components/TaskDetails/Styles.ts | 23 + .../TaskDetails/TaskDetails.stories.tsx | 4 + .../shared/components/TaskDetails/index.tsx | 72 +- web/src/shared/generated/graphql.tsx | 543 ++++- web/src/shared/graphql/createTask.graphqls | 1 + web/src/shared/graphql/findProject.graphqls | 72 - web/src/shared/graphql/findProject.ts | 45 + web/src/shared/graphql/findTask.graphqls | 12 + web/src/shared/graphql/fragments/task.ts | 41 + .../graphql/task/createTaskChecklistItem.ts | 13 + .../graphql/task/deleteTaskChecklistItem.ts | 13 + .../task/setTaskChecklistItemComplete.ts | 13 + .../shared/graphql/task/setTaskComplete.ts | 11 + .../task/updateTaskChecklistItemName.ts | 10 + .../graphql/taskGroup/updateTaskGroupName.ts | 12 + web/src/shared/icons/AccountPlus.tsx | 12 + web/src/shared/icons/CheckCircle.tsx | 12 + web/src/shared/icons/CheckSquare.tsx | 12 + web/src/shared/icons/CheckSquareOutline.tsx | 12 + web/src/shared/icons/Checkmark.tsx | 17 +- web/src/shared/icons/Clock.tsx | 12 + web/src/shared/icons/Cross.tsx | 17 +- web/src/shared/icons/Icon.tsx | 18 +- web/src/shared/icons/Square.tsx | 12 + web/src/shared/icons/Trash.tsx | 12 + web/src/shared/icons/index.ts | 14 + 73 files changed, 4582 insertions(+), 390 deletions(-) create mode 100644 api/migrations/0025_add-cascade-delete-to-task-id-fk-on-task_label.up.sql create mode 100644 api/migrations/0026_add-cascade-delete-to-task-id-fk-on-task_assigned.up.sql create mode 100644 api/migrations/0027_add-cascade-delete-to-task_group_id-fk-on-task.up.sql create mode 100644 api/migrations/0028_add-complete-column-to-task-table.up.sql create mode 100644 api/migrations/0029_add-task_checklist.up.sql create mode 100644 api/migrations/0030_add-task_checklist_item.up.sql create mode 100644 api/pg/task_checklist.sql.go create mode 100644 api/query/task_checklist.sql create mode 100644 api/trello.json create mode 100644 web/src/shared/components/Checklist/Checklist.stories.tsx create mode 100644 web/src/shared/components/Checklist/index.tsx delete mode 100644 web/src/shared/graphql/findProject.graphqls create mode 100644 web/src/shared/graphql/findProject.ts create mode 100644 web/src/shared/graphql/fragments/task.ts create mode 100644 web/src/shared/graphql/task/createTaskChecklistItem.ts create mode 100644 web/src/shared/graphql/task/deleteTaskChecklistItem.ts create mode 100644 web/src/shared/graphql/task/setTaskChecklistItemComplete.ts create mode 100644 web/src/shared/graphql/task/setTaskComplete.ts create mode 100644 web/src/shared/graphql/task/updateTaskChecklistItemName.ts create mode 100644 web/src/shared/graphql/taskGroup/updateTaskGroupName.ts create mode 100644 web/src/shared/icons/AccountPlus.tsx create mode 100644 web/src/shared/icons/CheckCircle.tsx create mode 100644 web/src/shared/icons/CheckSquare.tsx create mode 100644 web/src/shared/icons/CheckSquareOutline.tsx create mode 100644 web/src/shared/icons/Clock.tsx create mode 100644 web/src/shared/icons/Square.tsx create mode 100644 web/src/shared/icons/Trash.tsx diff --git a/api/graph/generated.go b/api/graph/generated.go index 678d8ff..95fe15f 100644 --- a/api/graph/generated.go +++ b/api/graph/generated.go @@ -44,6 +44,8 @@ type ResolverRoot interface { Query() QueryResolver RefreshToken() RefreshTokenResolver Task() TaskResolver + TaskChecklist() TaskChecklistResolver + TaskChecklistItem() TaskChecklistItemResolver TaskGroup() TaskGroupResolver TaskLabel() TaskLabelResolver Team() TeamResolver @@ -54,6 +56,16 @@ type DirectiveRoot struct { } type ComplexityRoot struct { + ChecklistBadge struct { + Complete func(childComplexity int) int + Total func(childComplexity int) int + } + + DeleteTaskChecklistItemPayload struct { + Ok func(childComplexity int) int + TaskChecklistItem func(childComplexity int) int + } + DeleteTaskGroupPayload struct { AffectedRows func(childComplexity int) int Ok func(childComplexity int) int @@ -72,33 +84,39 @@ type ComplexityRoot struct { } Mutation struct { - AddTaskLabel func(childComplexity int, input *AddTaskLabelInput) int - AssignTask func(childComplexity int, input *AssignTaskInput) int - ClearProfileAvatar func(childComplexity int) int - CreateProject func(childComplexity int, input NewProject) int - CreateProjectLabel func(childComplexity int, input NewProjectLabel) int - CreateRefreshToken func(childComplexity int, input NewRefreshToken) int - CreateTask func(childComplexity int, input NewTask) int - CreateTaskGroup func(childComplexity int, input NewTaskGroup) int - CreateTeam func(childComplexity int, input NewTeam) int - CreateUserAccount func(childComplexity int, input NewUserAccount) int - DeleteProjectLabel func(childComplexity int, input DeleteProjectLabel) int - DeleteTask func(childComplexity int, input DeleteTaskInput) int - DeleteTaskGroup func(childComplexity int, input DeleteTaskGroupInput) int - LogoutUser func(childComplexity int, input LogoutUser) int - RemoveTaskLabel func(childComplexity int, input *RemoveTaskLabelInput) int - ToggleTaskLabel func(childComplexity int, input ToggleTaskLabelInput) int - UnassignTask func(childComplexity int, input *UnassignTaskInput) int - UpdateProjectLabel func(childComplexity int, input UpdateProjectLabel) int - UpdateProjectLabelColor func(childComplexity int, input UpdateProjectLabelColor) int - UpdateProjectLabelName func(childComplexity int, input UpdateProjectLabelName) int - UpdateProjectName func(childComplexity int, input *UpdateProjectName) int - UpdateTaskDescription func(childComplexity int, input UpdateTaskDescriptionInput) int - UpdateTaskDueDate func(childComplexity int, input UpdateTaskDueDate) int - UpdateTaskGroupLocation func(childComplexity int, input NewTaskGroupLocation) int - UpdateTaskGroupName func(childComplexity int, input UpdateTaskGroupName) int - UpdateTaskLocation func(childComplexity int, input NewTaskLocation) int - UpdateTaskName func(childComplexity int, input UpdateTaskName) int + AddTaskLabel func(childComplexity int, input *AddTaskLabelInput) int + AssignTask func(childComplexity int, input *AssignTaskInput) int + ClearProfileAvatar func(childComplexity int) int + CreateProject func(childComplexity int, input NewProject) int + CreateProjectLabel func(childComplexity int, input NewProjectLabel) int + CreateRefreshToken func(childComplexity int, input NewRefreshToken) int + CreateTask func(childComplexity int, input NewTask) int + CreateTaskChecklist func(childComplexity int, input CreateTaskChecklist) int + CreateTaskChecklistItem func(childComplexity int, input CreateTaskChecklistItem) int + CreateTaskGroup func(childComplexity int, input NewTaskGroup) int + CreateTeam func(childComplexity int, input NewTeam) int + CreateUserAccount func(childComplexity int, input NewUserAccount) int + DeleteProjectLabel func(childComplexity int, input DeleteProjectLabel) int + DeleteTask func(childComplexity int, input DeleteTaskInput) int + DeleteTaskChecklistItem func(childComplexity int, input DeleteTaskChecklistItem) int + DeleteTaskGroup func(childComplexity int, input DeleteTaskGroupInput) int + LogoutUser func(childComplexity int, input LogoutUser) int + RemoveTaskLabel func(childComplexity int, input *RemoveTaskLabelInput) int + SetTaskChecklistItemComplete func(childComplexity int, input SetTaskChecklistItemComplete) int + SetTaskComplete func(childComplexity int, input SetTaskComplete) int + ToggleTaskLabel func(childComplexity int, input ToggleTaskLabelInput) int + UnassignTask func(childComplexity int, input *UnassignTaskInput) int + UpdateProjectLabel func(childComplexity int, input UpdateProjectLabel) int + UpdateProjectLabelColor func(childComplexity int, input UpdateProjectLabelColor) int + UpdateProjectLabelName func(childComplexity int, input UpdateProjectLabelName) int + UpdateProjectName func(childComplexity int, input *UpdateProjectName) int + UpdateTaskChecklistItemName func(childComplexity int, input UpdateTaskChecklistItemName) int + UpdateTaskDescription func(childComplexity int, input UpdateTaskDescriptionInput) int + UpdateTaskDueDate func(childComplexity int, input UpdateTaskDueDate) int + UpdateTaskGroupLocation func(childComplexity int, input NewTaskGroupLocation) int + UpdateTaskGroupName func(childComplexity int, input UpdateTaskGroupName) int + UpdateTaskLocation func(childComplexity int, input NewTaskLocation) int + UpdateTaskName func(childComplexity int, input UpdateTaskName) int } ProfileIcon struct { @@ -152,6 +170,9 @@ type ComplexityRoot struct { Task struct { Assigned func(childComplexity int) int + Badges func(childComplexity int) int + Checklists func(childComplexity int) int + Complete func(childComplexity int) int CreatedAt func(childComplexity int) int Description func(childComplexity int) int DueDate func(childComplexity int) int @@ -162,6 +183,26 @@ type ComplexityRoot struct { TaskGroup func(childComplexity int) int } + TaskBadges struct { + Checklist func(childComplexity int) int + } + + TaskChecklist struct { + ID func(childComplexity int) int + Items func(childComplexity int) int + Name func(childComplexity int) int + Position func(childComplexity int) int + } + + TaskChecklistItem struct { + Complete func(childComplexity int) int + DueDate func(childComplexity int) int + ID func(childComplexity int) int + Name func(childComplexity int) int + Position func(childComplexity int) int + TaskChecklistID func(childComplexity int) int + } + TaskGroup struct { CreatedAt func(childComplexity int) int ID func(childComplexity int) int @@ -226,10 +267,16 @@ type MutationResolver interface { AddTaskLabel(ctx context.Context, input *AddTaskLabelInput) (*pg.Task, error) RemoveTaskLabel(ctx context.Context, input *RemoveTaskLabelInput) (*pg.Task, error) ToggleTaskLabel(ctx context.Context, input ToggleTaskLabelInput) (*ToggleTaskLabelPayload, error) + CreateTaskChecklist(ctx context.Context, input CreateTaskChecklist) (*pg.TaskChecklist, error) + CreateTaskChecklistItem(ctx context.Context, input CreateTaskChecklistItem) (*pg.TaskChecklistItem, error) + UpdateTaskChecklistItemName(ctx context.Context, input UpdateTaskChecklistItemName) (*pg.TaskChecklistItem, error) + SetTaskChecklistItemComplete(ctx context.Context, input SetTaskChecklistItemComplete) (*pg.TaskChecklistItem, error) + DeleteTaskChecklistItem(ctx context.Context, input DeleteTaskChecklistItem) (*DeleteTaskChecklistItemPayload, error) CreateTask(ctx context.Context, input NewTask) (*pg.Task, error) UpdateTaskDescription(ctx context.Context, input UpdateTaskDescriptionInput) (*pg.Task, error) UpdateTaskLocation(ctx context.Context, input NewTaskLocation) (*UpdateTaskLocationPayload, error) UpdateTaskName(ctx context.Context, input UpdateTaskName) (*pg.Task, error) + SetTaskComplete(ctx context.Context, input SetTaskComplete) (*pg.Task, error) UpdateTaskDueDate(ctx context.Context, input UpdateTaskDueDate) (*pg.Task, error) DeleteTask(ctx context.Context, input DeleteTaskInput) (*DeleteTaskPayload, error) AssignTask(ctx context.Context, input *AssignTaskInput) (*pg.Task, error) @@ -271,8 +318,21 @@ type TaskResolver interface { Description(ctx context.Context, obj *pg.Task) (*string, error) DueDate(ctx context.Context, obj *pg.Task) (*time.Time, error) + Assigned(ctx context.Context, obj *pg.Task) ([]ProjectMember, error) Labels(ctx context.Context, obj *pg.Task) ([]pg.TaskLabel, error) + Checklists(ctx context.Context, obj *pg.Task) ([]pg.TaskChecklist, error) + Badges(ctx context.Context, obj *pg.Task) (*TaskBadges, error) +} +type TaskChecklistResolver interface { + ID(ctx context.Context, obj *pg.TaskChecklist) (uuid.UUID, error) + + Items(ctx context.Context, obj *pg.TaskChecklist) ([]pg.TaskChecklistItem, error) +} +type TaskChecklistItemResolver interface { + ID(ctx context.Context, obj *pg.TaskChecklistItem) (uuid.UUID, error) + + DueDate(ctx context.Context, obj *pg.TaskChecklistItem) (*time.Time, error) } type TaskGroupResolver interface { ID(ctx context.Context, obj *pg.TaskGroup) (uuid.UUID, error) @@ -308,6 +368,34 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in _ = ec switch typeName + "." + field { + case "ChecklistBadge.complete": + if e.complexity.ChecklistBadge.Complete == nil { + break + } + + return e.complexity.ChecklistBadge.Complete(childComplexity), true + + case "ChecklistBadge.total": + if e.complexity.ChecklistBadge.Total == nil { + break + } + + return e.complexity.ChecklistBadge.Total(childComplexity), true + + case "DeleteTaskChecklistItemPayload.ok": + if e.complexity.DeleteTaskChecklistItemPayload.Ok == nil { + break + } + + return e.complexity.DeleteTaskChecklistItemPayload.Ok(childComplexity), true + + case "DeleteTaskChecklistItemPayload.taskChecklistItem": + if e.complexity.DeleteTaskChecklistItemPayload.TaskChecklistItem == nil { + break + } + + return e.complexity.DeleteTaskChecklistItemPayload.TaskChecklistItem(childComplexity), true + case "DeleteTaskGroupPayload.affectedRows": if e.complexity.DeleteTaskGroupPayload.AffectedRows == nil { break @@ -443,6 +531,30 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Mutation.CreateTask(childComplexity, args["input"].(NewTask)), true + case "Mutation.createTaskChecklist": + if e.complexity.Mutation.CreateTaskChecklist == nil { + break + } + + args, err := ec.field_Mutation_createTaskChecklist_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Mutation.CreateTaskChecklist(childComplexity, args["input"].(CreateTaskChecklist)), true + + case "Mutation.createTaskChecklistItem": + if e.complexity.Mutation.CreateTaskChecklistItem == nil { + break + } + + args, err := ec.field_Mutation_createTaskChecklistItem_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Mutation.CreateTaskChecklistItem(childComplexity, args["input"].(CreateTaskChecklistItem)), true + case "Mutation.createTaskGroup": if e.complexity.Mutation.CreateTaskGroup == nil { break @@ -503,6 +615,18 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Mutation.DeleteTask(childComplexity, args["input"].(DeleteTaskInput)), true + case "Mutation.deleteTaskChecklistItem": + if e.complexity.Mutation.DeleteTaskChecklistItem == nil { + break + } + + args, err := ec.field_Mutation_deleteTaskChecklistItem_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Mutation.DeleteTaskChecklistItem(childComplexity, args["input"].(DeleteTaskChecklistItem)), true + case "Mutation.deleteTaskGroup": if e.complexity.Mutation.DeleteTaskGroup == nil { break @@ -539,6 +663,30 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Mutation.RemoveTaskLabel(childComplexity, args["input"].(*RemoveTaskLabelInput)), true + case "Mutation.setTaskChecklistItemComplete": + if e.complexity.Mutation.SetTaskChecklistItemComplete == nil { + break + } + + args, err := ec.field_Mutation_setTaskChecklistItemComplete_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Mutation.SetTaskChecklistItemComplete(childComplexity, args["input"].(SetTaskChecklistItemComplete)), true + + case "Mutation.setTaskComplete": + if e.complexity.Mutation.SetTaskComplete == nil { + break + } + + args, err := ec.field_Mutation_setTaskComplete_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Mutation.SetTaskComplete(childComplexity, args["input"].(SetTaskComplete)), true + case "Mutation.toggleTaskLabel": if e.complexity.Mutation.ToggleTaskLabel == nil { break @@ -611,6 +759,18 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Mutation.UpdateProjectName(childComplexity, args["input"].(*UpdateProjectName)), true + case "Mutation.updateTaskChecklistItemName": + if e.complexity.Mutation.UpdateTaskChecklistItemName == nil { + break + } + + args, err := ec.field_Mutation_updateTaskChecklistItemName_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Mutation.UpdateTaskChecklistItemName(childComplexity, args["input"].(UpdateTaskChecklistItemName)), true + case "Mutation.updateTaskDescription": if e.complexity.Mutation.UpdateTaskDescription == nil { break @@ -927,6 +1087,27 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Task.Assigned(childComplexity), true + case "Task.badges": + if e.complexity.Task.Badges == nil { + break + } + + return e.complexity.Task.Badges(childComplexity), true + + case "Task.checklists": + if e.complexity.Task.Checklists == nil { + break + } + + return e.complexity.Task.Checklists(childComplexity), true + + case "Task.complete": + if e.complexity.Task.Complete == nil { + break + } + + return e.complexity.Task.Complete(childComplexity), true + case "Task.createdAt": if e.complexity.Task.CreatedAt == nil { break @@ -983,6 +1164,83 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Task.TaskGroup(childComplexity), true + case "TaskBadges.checklist": + if e.complexity.TaskBadges.Checklist == nil { + break + } + + return e.complexity.TaskBadges.Checklist(childComplexity), true + + case "TaskChecklist.id": + if e.complexity.TaskChecklist.ID == nil { + break + } + + return e.complexity.TaskChecklist.ID(childComplexity), true + + case "TaskChecklist.items": + if e.complexity.TaskChecklist.Items == nil { + break + } + + return e.complexity.TaskChecklist.Items(childComplexity), true + + case "TaskChecklist.name": + if e.complexity.TaskChecklist.Name == nil { + break + } + + return e.complexity.TaskChecklist.Name(childComplexity), true + + case "TaskChecklist.position": + if e.complexity.TaskChecklist.Position == nil { + break + } + + return e.complexity.TaskChecklist.Position(childComplexity), true + + case "TaskChecklistItem.complete": + if e.complexity.TaskChecklistItem.Complete == nil { + break + } + + return e.complexity.TaskChecklistItem.Complete(childComplexity), true + + case "TaskChecklistItem.dueDate": + if e.complexity.TaskChecklistItem.DueDate == nil { + break + } + + return e.complexity.TaskChecklistItem.DueDate(childComplexity), true + + case "TaskChecklistItem.id": + if e.complexity.TaskChecklistItem.ID == nil { + break + } + + return e.complexity.TaskChecklistItem.ID(childComplexity), true + + case "TaskChecklistItem.name": + if e.complexity.TaskChecklistItem.Name == nil { + break + } + + return e.complexity.TaskChecklistItem.Name(childComplexity), true + + case "TaskChecklistItem.position": + if e.complexity.TaskChecklistItem.Position == nil { + break + } + + return e.complexity.TaskChecklistItem.Position(childComplexity), true + + case "TaskChecklistItem.taskChecklistID": + if e.complexity.TaskChecklistItem.TaskChecklistID == nil { + break + } + + return e.complexity.TaskChecklistItem.TaskChecklistID(childComplexity), true + case "TaskGroup.createdAt": if e.complexity.TaskGroup.CreatedAt == nil { break @@ -1287,6 +1545,15 @@ type TaskGroup { tasks: [Task!]! } +type ChecklistBadge { + complete: Int! + total: Int! +} + +type TaskBadges { + checklist: ChecklistBadge +} + type Task { id: ID! taskGroup: TaskGroup! @@ -1295,8 +1562,11 @@ type Task { position: Float! description: String dueDate: Time + complete: Boolean! assigned: [ProjectMember!]! labels: [TaskLabel!]! + checklists: [TaskChecklist!]! + badges: TaskBadges! } input ProjectsFilter { @@ -1398,6 +1668,27 @@ type DeleteTaskGroupPayload { taskGroup: TaskGroup! } +type DeleteTaskChecklistItemPayload { + ok: Boolean! + taskChecklistItem: TaskChecklistItem! +} + +type TaskChecklistItem { + id: ID! + name: String! + taskChecklistID: UUID! + complete: Boolean! + position: Float! + dueDate: Time! +} + +type TaskChecklist { + id: ID! + name: String! + position: Float! + items: [TaskChecklistItem!]! +} + input AssignTaskInput { taskID: UUID! userID: UUID! @@ -1477,6 +1768,36 @@ input UpdateTaskDueDate { dueDate: Time } +input SetTaskComplete { + taskID: UUID! + complete: Boolean! +} + +input CreateTaskChecklist { + taskID: UUID! + name: String! + position: Float! +} + +input CreateTaskChecklistItem { + taskChecklistID: UUID! + name: String! + position: Float! +} + +input SetTaskChecklistItemComplete { + taskChecklistItemID: UUID! + complete: Boolean! +} +input DeleteTaskChecklistItem { + taskChecklistItemID: UUID! +} + +input UpdateTaskChecklistItemName { + taskChecklistItemID: UUID! + name: String! +} + type Mutation { createRefreshToken(input: NewRefreshToken!): RefreshToken! @@ -1503,10 +1824,17 @@ type Mutation { removeTaskLabel(input: RemoveTaskLabelInput): Task! toggleTaskLabel(input: ToggleTaskLabelInput!): ToggleTaskLabelPayload! + createTaskChecklist(input: CreateTaskChecklist!): TaskChecklist! + createTaskChecklistItem(input: CreateTaskChecklistItem!): TaskChecklistItem! + updateTaskChecklistItemName(input: UpdateTaskChecklistItemName!): TaskChecklistItem! + setTaskChecklistItemComplete(input: SetTaskChecklistItemComplete!): TaskChecklistItem! + deleteTaskChecklistItem(input: DeleteTaskChecklistItem!): DeleteTaskChecklistItemPayload! + createTask(input: NewTask!): Task! updateTaskDescription(input: UpdateTaskDescriptionInput!): Task! updateTaskLocation(input: NewTaskLocation!): UpdateTaskLocationPayload! updateTaskName(input: UpdateTaskName!): Task! + setTaskComplete(input: SetTaskComplete!): Task! updateTaskDueDate(input: UpdateTaskDueDate!): Task! deleteTask(input: DeleteTaskInput!): DeleteTaskPayload! assignTask(input: AssignTaskInput): Task! @@ -1592,6 +1920,34 @@ func (ec *executionContext) field_Mutation_createRefreshToken_args(ctx context.C return args, nil } +func (ec *executionContext) field_Mutation_createTaskChecklistItem_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 CreateTaskChecklistItem + if tmp, ok := rawArgs["input"]; ok { + arg0, err = ec.unmarshalNCreateTaskChecklistItem2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐCreateTaskChecklistItem(ctx, tmp) + if err != nil { + return nil, err + } + } + args["input"] = arg0 + return args, nil +} + +func (ec *executionContext) field_Mutation_createTaskChecklist_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 CreateTaskChecklist + if tmp, ok := rawArgs["input"]; ok { + arg0, err = ec.unmarshalNCreateTaskChecklist2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐCreateTaskChecklist(ctx, tmp) + if err != nil { + return nil, err + } + } + args["input"] = arg0 + return args, nil +} + func (ec *executionContext) field_Mutation_createTaskGroup_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { var err error args := map[string]interface{}{} @@ -1662,6 +2018,20 @@ func (ec *executionContext) field_Mutation_deleteProjectLabel_args(ctx context.C return args, nil } +func (ec *executionContext) field_Mutation_deleteTaskChecklistItem_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 DeleteTaskChecklistItem + if tmp, ok := rawArgs["input"]; ok { + arg0, err = ec.unmarshalNDeleteTaskChecklistItem2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐDeleteTaskChecklistItem(ctx, tmp) + if err != nil { + return nil, err + } + } + args["input"] = arg0 + return args, nil +} + func (ec *executionContext) field_Mutation_deleteTaskGroup_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { var err error args := map[string]interface{}{} @@ -1718,6 +2088,34 @@ func (ec *executionContext) field_Mutation_removeTaskLabel_args(ctx context.Cont return args, nil } +func (ec *executionContext) field_Mutation_setTaskChecklistItemComplete_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 SetTaskChecklistItemComplete + if tmp, ok := rawArgs["input"]; ok { + arg0, err = ec.unmarshalNSetTaskChecklistItemComplete2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐSetTaskChecklistItemComplete(ctx, tmp) + if err != nil { + return nil, err + } + } + args["input"] = arg0 + return args, nil +} + +func (ec *executionContext) field_Mutation_setTaskComplete_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 SetTaskComplete + if tmp, ok := rawArgs["input"]; ok { + arg0, err = ec.unmarshalNSetTaskComplete2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐSetTaskComplete(ctx, tmp) + if err != nil { + return nil, err + } + } + args["input"] = arg0 + return args, nil +} + func (ec *executionContext) field_Mutation_toggleTaskLabel_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { var err error args := map[string]interface{}{} @@ -1802,6 +2200,20 @@ func (ec *executionContext) field_Mutation_updateProjectName_args(ctx context.Co return args, nil } +func (ec *executionContext) field_Mutation_updateTaskChecklistItemName_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 UpdateTaskChecklistItemName + if tmp, ok := rawArgs["input"]; ok { + arg0, err = ec.unmarshalNUpdateTaskChecklistItemName2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐUpdateTaskChecklistItemName(ctx, tmp) + if err != nil { + return nil, err + } + } + args["input"] = arg0 + return args, nil +} + func (ec *executionContext) field_Mutation_updateTaskDescription_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { var err error args := map[string]interface{}{} @@ -1992,6 +2404,142 @@ func (ec *executionContext) field___Type_fields_args(ctx context.Context, rawArg // region **************************** field.gotpl ***************************** +func (ec *executionContext) _ChecklistBadge_complete(ctx context.Context, field graphql.CollectedField, obj *ChecklistBadge) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "ChecklistBadge", + Field: field, + Args: nil, + IsMethod: false, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Complete, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(int) + fc.Result = res + return ec.marshalNInt2int(ctx, field.Selections, res) +} + +func (ec *executionContext) _ChecklistBadge_total(ctx context.Context, field graphql.CollectedField, obj *ChecklistBadge) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "ChecklistBadge", + Field: field, + Args: nil, + IsMethod: false, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Total, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(int) + fc.Result = res + return ec.marshalNInt2int(ctx, field.Selections, res) +} + +func (ec *executionContext) _DeleteTaskChecklistItemPayload_ok(ctx context.Context, field graphql.CollectedField, obj *DeleteTaskChecklistItemPayload) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "DeleteTaskChecklistItemPayload", + Field: field, + Args: nil, + IsMethod: false, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Ok, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) _DeleteTaskChecklistItemPayload_taskChecklistItem(ctx context.Context, field graphql.CollectedField, obj *DeleteTaskChecklistItemPayload) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "DeleteTaskChecklistItemPayload", + Field: field, + Args: nil, + IsMethod: false, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.TaskChecklistItem, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*pg.TaskChecklistItem) + fc.Result = res + return ec.marshalNTaskChecklistItem2ᚖgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTaskChecklistItem(ctx, field.Selections, res) +} + func (ec *executionContext) _DeleteTaskGroupPayload_ok(ctx context.Context, field graphql.CollectedField, obj *DeleteTaskGroupPayload) (ret graphql.Marshaler) { defer func() { if r := recover(); r != nil { @@ -2995,6 +3543,211 @@ func (ec *executionContext) _Mutation_toggleTaskLabel(ctx context.Context, field return ec.marshalNToggleTaskLabelPayload2ᚖgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐToggleTaskLabelPayload(ctx, field.Selections, res) } +func (ec *executionContext) _Mutation_createTaskChecklist(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "Mutation", + Field: field, + Args: nil, + IsMethod: true, + } + + ctx = graphql.WithFieldContext(ctx, fc) + rawArgs := field.ArgumentMap(ec.Variables) + args, err := ec.field_Mutation_createTaskChecklist_args(ctx, rawArgs) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + fc.Args = args + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Mutation().CreateTaskChecklist(rctx, args["input"].(CreateTaskChecklist)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*pg.TaskChecklist) + fc.Result = res + return ec.marshalNTaskChecklist2ᚖgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTaskChecklist(ctx, field.Selections, res) +} + +func (ec *executionContext) _Mutation_createTaskChecklistItem(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "Mutation", + Field: field, + Args: nil, + IsMethod: true, + } + + ctx = graphql.WithFieldContext(ctx, fc) + rawArgs := field.ArgumentMap(ec.Variables) + args, err := ec.field_Mutation_createTaskChecklistItem_args(ctx, rawArgs) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + fc.Args = args + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Mutation().CreateTaskChecklistItem(rctx, args["input"].(CreateTaskChecklistItem)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*pg.TaskChecklistItem) + fc.Result = res + return ec.marshalNTaskChecklistItem2ᚖgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTaskChecklistItem(ctx, field.Selections, res) +} + +func (ec *executionContext) _Mutation_updateTaskChecklistItemName(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "Mutation", + Field: field, + Args: nil, + IsMethod: true, + } + + ctx = graphql.WithFieldContext(ctx, fc) + rawArgs := field.ArgumentMap(ec.Variables) + args, err := ec.field_Mutation_updateTaskChecklistItemName_args(ctx, rawArgs) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + fc.Args = args + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Mutation().UpdateTaskChecklistItemName(rctx, args["input"].(UpdateTaskChecklistItemName)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*pg.TaskChecklistItem) + fc.Result = res + return ec.marshalNTaskChecklistItem2ᚖgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTaskChecklistItem(ctx, field.Selections, res) +} + +func (ec *executionContext) _Mutation_setTaskChecklistItemComplete(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "Mutation", + Field: field, + Args: nil, + IsMethod: true, + } + + ctx = graphql.WithFieldContext(ctx, fc) + rawArgs := field.ArgumentMap(ec.Variables) + args, err := ec.field_Mutation_setTaskChecklistItemComplete_args(ctx, rawArgs) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + fc.Args = args + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Mutation().SetTaskChecklistItemComplete(rctx, args["input"].(SetTaskChecklistItemComplete)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*pg.TaskChecklistItem) + fc.Result = res + return ec.marshalNTaskChecklistItem2ᚖgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTaskChecklistItem(ctx, field.Selections, res) +} + +func (ec *executionContext) _Mutation_deleteTaskChecklistItem(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "Mutation", + Field: field, + Args: nil, + IsMethod: true, + } + + ctx = graphql.WithFieldContext(ctx, fc) + rawArgs := field.ArgumentMap(ec.Variables) + args, err := ec.field_Mutation_deleteTaskChecklistItem_args(ctx, rawArgs) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + fc.Args = args + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Mutation().DeleteTaskChecklistItem(rctx, args["input"].(DeleteTaskChecklistItem)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*DeleteTaskChecklistItemPayload) + fc.Result = res + return ec.marshalNDeleteTaskChecklistItemPayload2ᚖgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐDeleteTaskChecklistItemPayload(ctx, field.Selections, res) +} + func (ec *executionContext) _Mutation_createTask(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { defer func() { if r := recover(); r != nil { @@ -3159,6 +3912,47 @@ func (ec *executionContext) _Mutation_updateTaskName(ctx context.Context, field return ec.marshalNTask2ᚖgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTask(ctx, field.Selections, res) } +func (ec *executionContext) _Mutation_setTaskComplete(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "Mutation", + Field: field, + Args: nil, + IsMethod: true, + } + + ctx = graphql.WithFieldContext(ctx, fc) + rawArgs := field.ArgumentMap(ec.Variables) + args, err := ec.field_Mutation_setTaskComplete_args(ctx, rawArgs) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + fc.Args = args + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Mutation().SetTaskComplete(rctx, args["input"].(SetTaskComplete)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*pg.Task) + fc.Result = res + return ec.marshalNTask2ᚖgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTask(ctx, field.Selections, res) +} + func (ec *executionContext) _Mutation_updateTaskDueDate(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { defer func() { if r := recover(); r != nil { @@ -4735,6 +5529,40 @@ func (ec *executionContext) _Task_dueDate(ctx context.Context, field graphql.Col return ec.marshalOTime2ᚖtimeᚐTime(ctx, field.Selections, res) } +func (ec *executionContext) _Task_complete(ctx context.Context, field graphql.CollectedField, obj *pg.Task) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "Task", + Field: field, + Args: nil, + IsMethod: false, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Complete, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + func (ec *executionContext) _Task_assigned(ctx context.Context, field graphql.CollectedField, obj *pg.Task) (ret graphql.Marshaler) { defer func() { if r := recover(); r != nil { @@ -4803,6 +5631,445 @@ func (ec *executionContext) _Task_labels(ctx context.Context, field graphql.Coll return ec.marshalNTaskLabel2ᚕgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTaskLabelᚄ(ctx, field.Selections, res) } +func (ec *executionContext) _Task_checklists(ctx context.Context, field graphql.CollectedField, obj *pg.Task) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "Task", + Field: field, + Args: nil, + IsMethod: true, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Task().Checklists(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]pg.TaskChecklist) + fc.Result = res + return ec.marshalNTaskChecklist2ᚕgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTaskChecklistᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) _Task_badges(ctx context.Context, field graphql.CollectedField, obj *pg.Task) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "Task", + Field: field, + Args: nil, + IsMethod: true, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Task().Badges(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*TaskBadges) + fc.Result = res + return ec.marshalNTaskBadges2ᚖgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐTaskBadges(ctx, field.Selections, res) +} + +func (ec *executionContext) _TaskBadges_checklist(ctx context.Context, field graphql.CollectedField, obj *TaskBadges) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "TaskBadges", + Field: field, + Args: nil, + IsMethod: false, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Checklist, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*ChecklistBadge) + fc.Result = res + return ec.marshalOChecklistBadge2ᚖgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐChecklistBadge(ctx, field.Selections, res) +} + +func (ec *executionContext) _TaskChecklist_id(ctx context.Context, field graphql.CollectedField, obj *pg.TaskChecklist) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "TaskChecklist", + Field: field, + Args: nil, + IsMethod: true, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.TaskChecklist().ID(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(uuid.UUID) + fc.Result = res + return ec.marshalNID2githubᚗcomᚋgoogleᚋuuidᚐUUID(ctx, field.Selections, res) +} + +func (ec *executionContext) _TaskChecklist_name(ctx context.Context, field graphql.CollectedField, obj *pg.TaskChecklist) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "TaskChecklist", + Field: field, + Args: nil, + IsMethod: false, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) _TaskChecklist_position(ctx context.Context, field graphql.CollectedField, obj *pg.TaskChecklist) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "TaskChecklist", + Field: field, + Args: nil, + IsMethod: false, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Position, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(float64) + fc.Result = res + return ec.marshalNFloat2float64(ctx, field.Selections, res) +} + +func (ec *executionContext) _TaskChecklist_items(ctx context.Context, field graphql.CollectedField, obj *pg.TaskChecklist) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "TaskChecklist", + Field: field, + Args: nil, + IsMethod: true, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.TaskChecklist().Items(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]pg.TaskChecklistItem) + fc.Result = res + return ec.marshalNTaskChecklistItem2ᚕgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTaskChecklistItemᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) _TaskChecklistItem_id(ctx context.Context, field graphql.CollectedField, obj *pg.TaskChecklistItem) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "TaskChecklistItem", + Field: field, + Args: nil, + IsMethod: true, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.TaskChecklistItem().ID(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(uuid.UUID) + fc.Result = res + return ec.marshalNID2githubᚗcomᚋgoogleᚋuuidᚐUUID(ctx, field.Selections, res) +} + +func (ec *executionContext) _TaskChecklistItem_name(ctx context.Context, field graphql.CollectedField, obj *pg.TaskChecklistItem) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "TaskChecklistItem", + Field: field, + Args: nil, + IsMethod: false, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) _TaskChecklistItem_taskChecklistID(ctx context.Context, field graphql.CollectedField, obj *pg.TaskChecklistItem) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "TaskChecklistItem", + Field: field, + Args: nil, + IsMethod: false, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.TaskChecklistID, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(uuid.UUID) + fc.Result = res + return ec.marshalNUUID2githubᚗcomᚋgoogleᚋuuidᚐUUID(ctx, field.Selections, res) +} + +func (ec *executionContext) _TaskChecklistItem_complete(ctx context.Context, field graphql.CollectedField, obj *pg.TaskChecklistItem) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "TaskChecklistItem", + Field: field, + Args: nil, + IsMethod: false, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Complete, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) _TaskChecklistItem_position(ctx context.Context, field graphql.CollectedField, obj *pg.TaskChecklistItem) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "TaskChecklistItem", + Field: field, + Args: nil, + IsMethod: false, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Position, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(float64) + fc.Result = res + return ec.marshalNFloat2float64(ctx, field.Selections, res) +} + +func (ec *executionContext) _TaskChecklistItem_dueDate(ctx context.Context, field graphql.CollectedField, obj *pg.TaskChecklistItem) (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + fc := &graphql.FieldContext{ + Object: "TaskChecklistItem", + Field: field, + Args: nil, + IsMethod: true, + } + + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.TaskChecklistItem().DueDate(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*time.Time) + fc.Result = res + return ec.marshalNTime2ᚖtimeᚐTime(ctx, field.Selections, res) +} + func (ec *executionContext) _TaskGroup_id(ctx context.Context, field graphql.CollectedField, obj *pg.TaskGroup) (ret graphql.Marshaler) { defer func() { if r := recover(); r != nil { @@ -6688,6 +7955,66 @@ func (ec *executionContext) unmarshalInputAssignTaskInput(ctx context.Context, o return it, nil } +func (ec *executionContext) unmarshalInputCreateTaskChecklist(ctx context.Context, obj interface{}) (CreateTaskChecklist, error) { + var it CreateTaskChecklist + var asMap = obj.(map[string]interface{}) + + for k, v := range asMap { + switch k { + case "taskID": + var err error + it.TaskID, err = ec.unmarshalNUUID2githubᚗcomᚋgoogleᚋuuidᚐUUID(ctx, v) + if err != nil { + return it, err + } + case "name": + var err error + it.Name, err = ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + case "position": + var err error + it.Position, err = ec.unmarshalNFloat2float64(ctx, v) + if err != nil { + return it, err + } + } + } + + return it, nil +} + +func (ec *executionContext) unmarshalInputCreateTaskChecklistItem(ctx context.Context, obj interface{}) (CreateTaskChecklistItem, error) { + var it CreateTaskChecklistItem + var asMap = obj.(map[string]interface{}) + + for k, v := range asMap { + switch k { + case "taskChecklistID": + var err error + it.TaskChecklistID, err = ec.unmarshalNUUID2githubᚗcomᚋgoogleᚋuuidᚐUUID(ctx, v) + if err != nil { + return it, err + } + case "name": + var err error + it.Name, err = ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + case "position": + var err error + it.Position, err = ec.unmarshalNFloat2float64(ctx, v) + if err != nil { + return it, err + } + } + } + + return it, nil +} + func (ec *executionContext) unmarshalInputDeleteProjectLabel(ctx context.Context, obj interface{}) (DeleteProjectLabel, error) { var it DeleteProjectLabel var asMap = obj.(map[string]interface{}) @@ -6706,6 +8033,24 @@ func (ec *executionContext) unmarshalInputDeleteProjectLabel(ctx context.Context return it, nil } +func (ec *executionContext) unmarshalInputDeleteTaskChecklistItem(ctx context.Context, obj interface{}) (DeleteTaskChecklistItem, error) { + var it DeleteTaskChecklistItem + var asMap = obj.(map[string]interface{}) + + for k, v := range asMap { + switch k { + case "taskChecklistItemID": + var err error + it.TaskChecklistItemID, err = ec.unmarshalNUUID2githubᚗcomᚋgoogleᚋuuidᚐUUID(ctx, v) + if err != nil { + return it, err + } + } + } + + return it, nil +} + func (ec *executionContext) unmarshalInputDeleteTaskGroupInput(ctx context.Context, obj interface{}) (DeleteTaskGroupInput, error) { var it DeleteTaskGroupInput var asMap = obj.(map[string]interface{}) @@ -7108,6 +8453,54 @@ func (ec *executionContext) unmarshalInputRemoveTaskLabelInput(ctx context.Conte return it, nil } +func (ec *executionContext) unmarshalInputSetTaskChecklistItemComplete(ctx context.Context, obj interface{}) (SetTaskChecklistItemComplete, error) { + var it SetTaskChecklistItemComplete + var asMap = obj.(map[string]interface{}) + + for k, v := range asMap { + switch k { + case "taskChecklistItemID": + var err error + it.TaskChecklistItemID, err = ec.unmarshalNUUID2githubᚗcomᚋgoogleᚋuuidᚐUUID(ctx, v) + if err != nil { + return it, err + } + case "complete": + var err error + it.Complete, err = ec.unmarshalNBoolean2bool(ctx, v) + if err != nil { + return it, err + } + } + } + + return it, nil +} + +func (ec *executionContext) unmarshalInputSetTaskComplete(ctx context.Context, obj interface{}) (SetTaskComplete, error) { + var it SetTaskComplete + var asMap = obj.(map[string]interface{}) + + for k, v := range asMap { + switch k { + case "taskID": + var err error + it.TaskID, err = ec.unmarshalNUUID2githubᚗcomᚋgoogleᚋuuidᚐUUID(ctx, v) + if err != nil { + return it, err + } + case "complete": + var err error + it.Complete, err = ec.unmarshalNBoolean2bool(ctx, v) + if err != nil { + return it, err + } + } + } + + return it, nil +} + func (ec *executionContext) unmarshalInputToggleTaskLabelInput(ctx context.Context, obj interface{}) (ToggleTaskLabelInput, error) { var it ToggleTaskLabelInput var asMap = obj.(map[string]interface{}) @@ -7258,6 +8651,30 @@ func (ec *executionContext) unmarshalInputUpdateProjectName(ctx context.Context, return it, nil } +func (ec *executionContext) unmarshalInputUpdateTaskChecklistItemName(ctx context.Context, obj interface{}) (UpdateTaskChecklistItemName, error) { + var it UpdateTaskChecklistItemName + var asMap = obj.(map[string]interface{}) + + for k, v := range asMap { + switch k { + case "taskChecklistItemID": + var err error + it.TaskChecklistItemID, err = ec.unmarshalNUUID2githubᚗcomᚋgoogleᚋuuidᚐUUID(ctx, v) + if err != nil { + return it, err + } + case "name": + var err error + it.Name, err = ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + } + } + + return it, nil +} + func (ec *executionContext) unmarshalInputUpdateTaskDescriptionInput(ctx context.Context, obj interface{}) (UpdateTaskDescriptionInput, error) { var it UpdateTaskDescriptionInput var asMap = obj.(map[string]interface{}) @@ -7362,6 +8779,70 @@ func (ec *executionContext) unmarshalInputUpdateTaskName(ctx context.Context, ob // region **************************** object.gotpl **************************** +var checklistBadgeImplementors = []string{"ChecklistBadge"} + +func (ec *executionContext) _ChecklistBadge(ctx context.Context, sel ast.SelectionSet, obj *ChecklistBadge) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, checklistBadgeImplementors) + + out := graphql.NewFieldSet(fields) + var invalids uint32 + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("ChecklistBadge") + case "complete": + out.Values[i] = ec._ChecklistBadge_complete(ctx, field, obj) + if out.Values[i] == graphql.Null { + invalids++ + } + case "total": + out.Values[i] = ec._ChecklistBadge_total(ctx, field, obj) + if out.Values[i] == graphql.Null { + invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch() + if invalids > 0 { + return graphql.Null + } + return out +} + +var deleteTaskChecklistItemPayloadImplementors = []string{"DeleteTaskChecklistItemPayload"} + +func (ec *executionContext) _DeleteTaskChecklistItemPayload(ctx context.Context, sel ast.SelectionSet, obj *DeleteTaskChecklistItemPayload) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, deleteTaskChecklistItemPayloadImplementors) + + out := graphql.NewFieldSet(fields) + var invalids uint32 + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("DeleteTaskChecklistItemPayload") + case "ok": + out.Values[i] = ec._DeleteTaskChecklistItemPayload_ok(ctx, field, obj) + if out.Values[i] == graphql.Null { + invalids++ + } + case "taskChecklistItem": + out.Values[i] = ec._DeleteTaskChecklistItemPayload_taskChecklistItem(ctx, field, obj) + if out.Values[i] == graphql.Null { + invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch() + if invalids > 0 { + return graphql.Null + } + return out +} + var deleteTaskGroupPayloadImplementors = []string{"DeleteTaskGroupPayload"} func (ec *executionContext) _DeleteTaskGroupPayload(ctx context.Context, sel ast.SelectionSet, obj *DeleteTaskGroupPayload) graphql.Marshaler { @@ -7582,6 +9063,31 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) if out.Values[i] == graphql.Null { invalids++ } + case "createTaskChecklist": + out.Values[i] = ec._Mutation_createTaskChecklist(ctx, field) + if out.Values[i] == graphql.Null { + invalids++ + } + case "createTaskChecklistItem": + out.Values[i] = ec._Mutation_createTaskChecklistItem(ctx, field) + if out.Values[i] == graphql.Null { + invalids++ + } + case "updateTaskChecklistItemName": + out.Values[i] = ec._Mutation_updateTaskChecklistItemName(ctx, field) + if out.Values[i] == graphql.Null { + invalids++ + } + case "setTaskChecklistItemComplete": + out.Values[i] = ec._Mutation_setTaskChecklistItemComplete(ctx, field) + if out.Values[i] == graphql.Null { + invalids++ + } + case "deleteTaskChecklistItem": + out.Values[i] = ec._Mutation_deleteTaskChecklistItem(ctx, field) + if out.Values[i] == graphql.Null { + invalids++ + } case "createTask": out.Values[i] = ec._Mutation_createTask(ctx, field) if out.Values[i] == graphql.Null { @@ -7602,6 +9108,11 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) if out.Values[i] == graphql.Null { invalids++ } + case "setTaskComplete": + out.Values[i] = ec._Mutation_setTaskComplete(ctx, field) + if out.Values[i] == graphql.Null { + invalids++ + } case "updateTaskDueDate": out.Values[i] = ec._Mutation_updateTaskDueDate(ctx, field) if out.Values[i] == graphql.Null { @@ -8168,6 +9679,11 @@ func (ec *executionContext) _Task(ctx context.Context, sel ast.SelectionSet, obj res = ec._Task_dueDate(ctx, field, obj) return res }) + case "complete": + out.Values[i] = ec._Task_complete(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&invalids, 1) + } case "assigned": field := field out.Concurrently(i, func() (res graphql.Marshaler) { @@ -8196,6 +9712,188 @@ func (ec *executionContext) _Task(ctx context.Context, sel ast.SelectionSet, obj } return res }) + case "checklists": + field := field + out.Concurrently(i, func() (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Task_checklists(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + return res + }) + case "badges": + field := field + out.Concurrently(i, func() (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Task_badges(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + return res + }) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch() + if invalids > 0 { + return graphql.Null + } + return out +} + +var taskBadgesImplementors = []string{"TaskBadges"} + +func (ec *executionContext) _TaskBadges(ctx context.Context, sel ast.SelectionSet, obj *TaskBadges) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, taskBadgesImplementors) + + out := graphql.NewFieldSet(fields) + var invalids uint32 + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("TaskBadges") + case "checklist": + out.Values[i] = ec._TaskBadges_checklist(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch() + if invalids > 0 { + return graphql.Null + } + return out +} + +var taskChecklistImplementors = []string{"TaskChecklist"} + +func (ec *executionContext) _TaskChecklist(ctx context.Context, sel ast.SelectionSet, obj *pg.TaskChecklist) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, taskChecklistImplementors) + + out := graphql.NewFieldSet(fields) + var invalids uint32 + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("TaskChecklist") + case "id": + field := field + out.Concurrently(i, func() (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._TaskChecklist_id(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + return res + }) + case "name": + out.Values[i] = ec._TaskChecklist_name(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + case "position": + out.Values[i] = ec._TaskChecklist_position(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + case "items": + field := field + out.Concurrently(i, func() (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._TaskChecklist_items(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + return res + }) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch() + if invalids > 0 { + return graphql.Null + } + return out +} + +var taskChecklistItemImplementors = []string{"TaskChecklistItem"} + +func (ec *executionContext) _TaskChecklistItem(ctx context.Context, sel ast.SelectionSet, obj *pg.TaskChecklistItem) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, taskChecklistItemImplementors) + + out := graphql.NewFieldSet(fields) + var invalids uint32 + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("TaskChecklistItem") + case "id": + field := field + out.Concurrently(i, func() (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._TaskChecklistItem_id(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + return res + }) + case "name": + out.Values[i] = ec._TaskChecklistItem_name(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + case "taskChecklistID": + out.Values[i] = ec._TaskChecklistItem_taskChecklistID(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + case "complete": + out.Values[i] = ec._TaskChecklistItem_complete(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + case "position": + out.Values[i] = ec._TaskChecklistItem_position(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + case "dueDate": + field := field + out.Concurrently(i, func() (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._TaskChecklistItem_dueDate(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + return res + }) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -8785,10 +10483,36 @@ func (ec *executionContext) marshalNBoolean2bool(ctx context.Context, sel ast.Se return res } +func (ec *executionContext) unmarshalNCreateTaskChecklist2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐCreateTaskChecklist(ctx context.Context, v interface{}) (CreateTaskChecklist, error) { + return ec.unmarshalInputCreateTaskChecklist(ctx, v) +} + +func (ec *executionContext) unmarshalNCreateTaskChecklistItem2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐCreateTaskChecklistItem(ctx context.Context, v interface{}) (CreateTaskChecklistItem, error) { + return ec.unmarshalInputCreateTaskChecklistItem(ctx, v) +} + func (ec *executionContext) unmarshalNDeleteProjectLabel2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐDeleteProjectLabel(ctx context.Context, v interface{}) (DeleteProjectLabel, error) { return ec.unmarshalInputDeleteProjectLabel(ctx, v) } +func (ec *executionContext) unmarshalNDeleteTaskChecklistItem2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐDeleteTaskChecklistItem(ctx context.Context, v interface{}) (DeleteTaskChecklistItem, error) { + return ec.unmarshalInputDeleteTaskChecklistItem(ctx, v) +} + +func (ec *executionContext) marshalNDeleteTaskChecklistItemPayload2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐDeleteTaskChecklistItemPayload(ctx context.Context, sel ast.SelectionSet, v DeleteTaskChecklistItemPayload) graphql.Marshaler { + return ec._DeleteTaskChecklistItemPayload(ctx, sel, &v) +} + +func (ec *executionContext) marshalNDeleteTaskChecklistItemPayload2ᚖgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐDeleteTaskChecklistItemPayload(ctx context.Context, sel ast.SelectionSet, v *DeleteTaskChecklistItemPayload) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + return ec._DeleteTaskChecklistItemPayload(ctx, sel, v) +} + func (ec *executionContext) unmarshalNDeleteTaskGroupInput2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐDeleteTaskGroupInput(ctx context.Context, v interface{}) (DeleteTaskGroupInput, error) { return ec.unmarshalInputDeleteTaskGroupInput(ctx, v) } @@ -9151,6 +10875,14 @@ func (ec *executionContext) marshalNRefreshToken2ᚖgithubᚗcomᚋjordanknott return ec._RefreshToken(ctx, sel, v) } +func (ec *executionContext) unmarshalNSetTaskChecklistItemComplete2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐSetTaskChecklistItemComplete(ctx context.Context, v interface{}) (SetTaskChecklistItemComplete, error) { + return ec.unmarshalInputSetTaskChecklistItemComplete(ctx, v) +} + +func (ec *executionContext) unmarshalNSetTaskComplete2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐSetTaskComplete(ctx context.Context, v interface{}) (SetTaskComplete, error) { + return ec.unmarshalInputSetTaskComplete(ctx, v) +} + func (ec *executionContext) unmarshalNString2string(ctx context.Context, v interface{}) (string, error) { return graphql.UnmarshalString(v) } @@ -9216,6 +10948,122 @@ func (ec *executionContext) marshalNTask2ᚖgithubᚗcomᚋjordanknottᚋproject return ec._Task(ctx, sel, v) } +func (ec *executionContext) marshalNTaskBadges2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐTaskBadges(ctx context.Context, sel ast.SelectionSet, v TaskBadges) graphql.Marshaler { + return ec._TaskBadges(ctx, sel, &v) +} + +func (ec *executionContext) marshalNTaskBadges2ᚖgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐTaskBadges(ctx context.Context, sel ast.SelectionSet, v *TaskBadges) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + return ec._TaskBadges(ctx, sel, v) +} + +func (ec *executionContext) marshalNTaskChecklist2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTaskChecklist(ctx context.Context, sel ast.SelectionSet, v pg.TaskChecklist) graphql.Marshaler { + return ec._TaskChecklist(ctx, sel, &v) +} + +func (ec *executionContext) marshalNTaskChecklist2ᚕgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTaskChecklistᚄ(ctx context.Context, sel ast.SelectionSet, v []pg.TaskChecklist) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalNTaskChecklist2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTaskChecklist(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + return ret +} + +func (ec *executionContext) marshalNTaskChecklist2ᚖgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTaskChecklist(ctx context.Context, sel ast.SelectionSet, v *pg.TaskChecklist) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + return ec._TaskChecklist(ctx, sel, v) +} + +func (ec *executionContext) marshalNTaskChecklistItem2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTaskChecklistItem(ctx context.Context, sel ast.SelectionSet, v pg.TaskChecklistItem) graphql.Marshaler { + return ec._TaskChecklistItem(ctx, sel, &v) +} + +func (ec *executionContext) marshalNTaskChecklistItem2ᚕgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTaskChecklistItemᚄ(ctx context.Context, sel ast.SelectionSet, v []pg.TaskChecklistItem) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalNTaskChecklistItem2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTaskChecklistItem(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + return ret +} + +func (ec *executionContext) marshalNTaskChecklistItem2ᚖgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTaskChecklistItem(ctx context.Context, sel ast.SelectionSet, v *pg.TaskChecklistItem) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + return ec._TaskChecklistItem(ctx, sel, v) +} + func (ec *executionContext) marshalNTaskGroup2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋpgᚐTaskGroup(ctx context.Context, sel ast.SelectionSet, v pg.TaskGroup) graphql.Marshaler { return ec._TaskGroup(ctx, sel, &v) } @@ -9373,6 +11221,24 @@ func (ec *executionContext) marshalNTime2timeᚐTime(ctx context.Context, sel as return res } +func (ec *executionContext) unmarshalNTime2ᚖtimeᚐTime(ctx context.Context, v interface{}) (*time.Time, error) { + if v == nil { + return nil, nil + } + res, err := ec.unmarshalNTime2timeᚐTime(ctx, v) + return &res, err +} + +func (ec *executionContext) marshalNTime2ᚖtimeᚐTime(ctx context.Context, sel ast.SelectionSet, v *time.Time) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + return ec.marshalNTime2timeᚐTime(ctx, sel, *v) +} + func (ec *executionContext) unmarshalNToggleTaskLabelInput2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐToggleTaskLabelInput(ctx context.Context, v interface{}) (ToggleTaskLabelInput, error) { return ec.unmarshalInputToggleTaskLabelInput(ctx, v) } @@ -9417,6 +11283,10 @@ func (ec *executionContext) unmarshalNUpdateProjectLabelName2githubᚗcomᚋjord return ec.unmarshalInputUpdateProjectLabelName(ctx, v) } +func (ec *executionContext) unmarshalNUpdateTaskChecklistItemName2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐUpdateTaskChecklistItemName(ctx context.Context, v interface{}) (UpdateTaskChecklistItemName, error) { + return ec.unmarshalInputUpdateTaskChecklistItemName(ctx, v) +} + func (ec *executionContext) unmarshalNUpdateTaskDescriptionInput2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐUpdateTaskDescriptionInput(ctx context.Context, v interface{}) (UpdateTaskDescriptionInput, error) { return ec.unmarshalInputUpdateTaskDescriptionInput(ctx, v) } @@ -9771,6 +11641,17 @@ func (ec *executionContext) marshalOBoolean2ᚖbool(ctx context.Context, sel ast return ec.marshalOBoolean2bool(ctx, sel, *v) } +func (ec *executionContext) marshalOChecklistBadge2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐChecklistBadge(ctx context.Context, sel ast.SelectionSet, v ChecklistBadge) graphql.Marshaler { + return ec._ChecklistBadge(ctx, sel, &v) +} + +func (ec *executionContext) marshalOChecklistBadge2ᚖgithubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐChecklistBadge(ctx context.Context, sel ast.SelectionSet, v *ChecklistBadge) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._ChecklistBadge(ctx, sel, v) +} + func (ec *executionContext) unmarshalOProjectsFilter2githubᚗcomᚋjordanknottᚋprojectᚑcitadelᚋapiᚋgraphᚐProjectsFilter(ctx context.Context, v interface{}) (ProjectsFilter, error) { return ec.unmarshalInputProjectsFilter(ctx, v) } diff --git a/api/graph/models_gen.go b/api/graph/models_gen.go index 3bd86f9..37e3e29 100644 --- a/api/graph/models_gen.go +++ b/api/graph/models_gen.go @@ -19,10 +19,36 @@ type AssignTaskInput struct { UserID uuid.UUID `json:"userID"` } +type ChecklistBadge struct { + Complete int `json:"complete"` + Total int `json:"total"` +} + +type CreateTaskChecklist struct { + TaskID uuid.UUID `json:"taskID"` + Name string `json:"name"` + Position float64 `json:"position"` +} + +type CreateTaskChecklistItem struct { + TaskChecklistID uuid.UUID `json:"taskChecklistID"` + Name string `json:"name"` + Position float64 `json:"position"` +} + type DeleteProjectLabel struct { ProjectLabelID uuid.UUID `json:"projectLabelID"` } +type DeleteTaskChecklistItem struct { + TaskChecklistItemID uuid.UUID `json:"taskChecklistItemID"` +} + +type DeleteTaskChecklistItemPayload struct { + Ok bool `json:"ok"` + TaskChecklistItem *pg.TaskChecklistItem `json:"taskChecklistItem"` +} + type DeleteTaskGroupInput struct { TaskGroupID uuid.UUID `json:"taskGroupID"` } @@ -129,6 +155,20 @@ type RemoveTaskLabelInput struct { TaskLabelID uuid.UUID `json:"taskLabelID"` } +type SetTaskChecklistItemComplete struct { + TaskChecklistItemID uuid.UUID `json:"taskChecklistItemID"` + Complete bool `json:"complete"` +} + +type SetTaskComplete struct { + TaskID uuid.UUID `json:"taskID"` + Complete bool `json:"complete"` +} + +type TaskBadges struct { + Checklist *ChecklistBadge `json:"checklist"` +} + type ToggleTaskLabelInput struct { TaskID uuid.UUID `json:"taskID"` ProjectLabelID uuid.UUID `json:"projectLabelID"` @@ -165,6 +205,11 @@ type UpdateProjectName struct { Name string `json:"name"` } +type UpdateTaskChecklistItemName struct { + TaskChecklistItemID uuid.UUID `json:"taskChecklistItemID"` + Name string `json:"name"` +} + type UpdateTaskDescriptionInput struct { TaskID uuid.UUID `json:"taskID"` Description string `json:"description"` diff --git a/api/graph/schema.graphqls b/api/graph/schema.graphqls index 602eba3..5e33d69 100644 --- a/api/graph/schema.graphqls +++ b/api/graph/schema.graphqls @@ -77,6 +77,15 @@ type TaskGroup { tasks: [Task!]! } +type ChecklistBadge { + complete: Int! + total: Int! +} + +type TaskBadges { + checklist: ChecklistBadge +} + type Task { id: ID! taskGroup: TaskGroup! @@ -85,8 +94,11 @@ type Task { position: Float! description: String dueDate: Time + complete: Boolean! assigned: [ProjectMember!]! labels: [TaskLabel!]! + checklists: [TaskChecklist!]! + badges: TaskBadges! } input ProjectsFilter { @@ -188,6 +200,27 @@ type DeleteTaskGroupPayload { taskGroup: TaskGroup! } +type DeleteTaskChecklistItemPayload { + ok: Boolean! + taskChecklistItem: TaskChecklistItem! +} + +type TaskChecklistItem { + id: ID! + name: String! + taskChecklistID: UUID! + complete: Boolean! + position: Float! + dueDate: Time! +} + +type TaskChecklist { + id: ID! + name: String! + position: Float! + items: [TaskChecklistItem!]! +} + input AssignTaskInput { taskID: UUID! userID: UUID! @@ -267,6 +300,36 @@ input UpdateTaskDueDate { dueDate: Time } +input SetTaskComplete { + taskID: UUID! + complete: Boolean! +} + +input CreateTaskChecklist { + taskID: UUID! + name: String! + position: Float! +} + +input CreateTaskChecklistItem { + taskChecklistID: UUID! + name: String! + position: Float! +} + +input SetTaskChecklistItemComplete { + taskChecklistItemID: UUID! + complete: Boolean! +} +input DeleteTaskChecklistItem { + taskChecklistItemID: UUID! +} + +input UpdateTaskChecklistItemName { + taskChecklistItemID: UUID! + name: String! +} + type Mutation { createRefreshToken(input: NewRefreshToken!): RefreshToken! @@ -293,10 +356,17 @@ type Mutation { removeTaskLabel(input: RemoveTaskLabelInput): Task! toggleTaskLabel(input: ToggleTaskLabelInput!): ToggleTaskLabelPayload! + createTaskChecklist(input: CreateTaskChecklist!): TaskChecklist! + createTaskChecklistItem(input: CreateTaskChecklistItem!): TaskChecklistItem! + updateTaskChecklistItemName(input: UpdateTaskChecklistItemName!): TaskChecklistItem! + setTaskChecklistItemComplete(input: SetTaskChecklistItemComplete!): TaskChecklistItem! + deleteTaskChecklistItem(input: DeleteTaskChecklistItem!): DeleteTaskChecklistItemPayload! + createTask(input: NewTask!): Task! updateTaskDescription(input: UpdateTaskDescriptionInput!): Task! updateTaskLocation(input: NewTaskLocation!): UpdateTaskLocationPayload! updateTaskName(input: UpdateTaskName!): Task! + setTaskComplete(input: SetTaskComplete!): Task! updateTaskDueDate(input: UpdateTaskDueDate!): Task! deleteTask(input: DeleteTaskInput!): DeleteTaskPayload! assignTask(input: AssignTaskInput): Task! diff --git a/api/graph/schema.resolvers.go b/api/graph/schema.resolvers.go index cec7d27..a2fbcd7 100644 --- a/api/graph/schema.resolvers.go +++ b/api/graph/schema.resolvers.go @@ -143,7 +143,11 @@ func (r *mutationResolver) UpdateTaskGroupLocation(ctx context.Context, input Ne } func (r *mutationResolver) UpdateTaskGroupName(ctx context.Context, input UpdateTaskGroupName) (*pg.TaskGroup, error) { - panic(fmt.Errorf("not implemented")) + taskGroup, err := r.Repository.SetTaskGroupName(ctx, pg.SetTaskGroupNameParams{TaskGroupID: input.TaskGroupID, Name: input.Name}) + if err != nil { + return &pg.TaskGroup{}, err + } + return &taskGroup, nil } func (r *mutationResolver) DeleteTaskGroup(ctx context.Context, input DeleteTaskGroupInput) (*DeleteTaskGroupPayload, error) { @@ -225,6 +229,75 @@ func (r *mutationResolver) ToggleTaskLabel(ctx context.Context, input ToggleTask return &payload, nil } +func (r *mutationResolver) CreateTaskChecklist(ctx context.Context, input CreateTaskChecklist) (*pg.TaskChecklist, error) { + createdAt := time.Now().UTC() + taskChecklist, err := r.Repository.CreateTaskChecklist(ctx, pg.CreateTaskChecklistParams{ + TaskID: input.TaskID, + CreatedAt: createdAt, + Name: input.Name, + Position: input.Position, + }) + if err != nil { + return &pg.TaskChecklist{}, err + } + + return &taskChecklist, nil +} + +func (r *mutationResolver) CreateTaskChecklistItem(ctx context.Context, input CreateTaskChecklistItem) (*pg.TaskChecklistItem, error) { + createdAt := time.Now().UTC() + taskChecklistItem, err := r.Repository.CreateTaskChecklistItem(ctx, pg.CreateTaskChecklistItemParams{ + TaskChecklistID: input.TaskChecklistID, + CreatedAt: createdAt, + Name: input.Name, + Position: input.Position, + }) + if err != nil { + return &pg.TaskChecklistItem{}, err + } + + return &taskChecklistItem, nil +} + +func (r *mutationResolver) UpdateTaskChecklistItemName(ctx context.Context, input UpdateTaskChecklistItemName) (*pg.TaskChecklistItem, error) { + task, err := r.Repository.UpdateTaskChecklistItemName(ctx, pg.UpdateTaskChecklistItemNameParams{TaskChecklistItemID: input.TaskChecklistItemID, + Name: input.Name, + }) + if err != nil { + return &pg.TaskChecklistItem{}, err + } + return &task, nil +} + +func (r *mutationResolver) SetTaskChecklistItemComplete(ctx context.Context, input SetTaskChecklistItemComplete) (*pg.TaskChecklistItem, error) { + item, err := r.Repository.SetTaskChecklistItemComplete(ctx, pg.SetTaskChecklistItemCompleteParams{TaskChecklistItemID: input.TaskChecklistItemID, Complete: input.Complete}) + if err != nil { + return &pg.TaskChecklistItem{}, err + } + return &item, nil +} + +func (r *mutationResolver) DeleteTaskChecklistItem(ctx context.Context, input DeleteTaskChecklistItem) (*DeleteTaskChecklistItemPayload, error) { + item, err := r.Repository.GetTaskChecklistItemByID(ctx, input.TaskChecklistItemID) + if err != nil { + return &DeleteTaskChecklistItemPayload{ + Ok: false, + TaskChecklistItem: &pg.TaskChecklistItem{}, + }, err + } + err = r.Repository.DeleteTaskChecklistItem(ctx, input.TaskChecklistItemID) + if err != nil { + return &DeleteTaskChecklistItemPayload{ + Ok: false, + TaskChecklistItem: &pg.TaskChecklistItem{}, + }, err + } + return &DeleteTaskChecklistItemPayload{ + Ok: true, + TaskChecklistItem: &item, + }, err +} + func (r *mutationResolver) CreateTask(ctx context.Context, input NewTask) (*pg.Task, error) { taskGroupID, err := uuid.Parse(input.TaskGroupID) createdAt := time.Now().UTC() @@ -260,6 +333,14 @@ func (r *mutationResolver) UpdateTaskName(ctx context.Context, input UpdateTaskN return &task, err } +func (r *mutationResolver) SetTaskComplete(ctx context.Context, input SetTaskComplete) (*pg.Task, error) { + task, err := r.Repository.SetTaskComplete(ctx, pg.SetTaskCompleteParams{TaskID: input.TaskID, Complete: input.Complete}) + if err != nil { + return &pg.Task{}, err + } + return &task, nil +} + func (r *mutationResolver) UpdateTaskDueDate(ctx context.Context, input UpdateTaskDueDate) (*pg.Task, error) { var dueDate sql.NullTime if input.DueDate == nil { @@ -531,6 +612,51 @@ func (r *taskResolver) Labels(ctx context.Context, obj *pg.Task) ([]pg.TaskLabel return r.Repository.GetTaskLabelsForTaskID(ctx, obj.TaskID) } +func (r *taskResolver) Checklists(ctx context.Context, obj *pg.Task) ([]pg.TaskChecklist, error) { + return r.Repository.GetTaskChecklistsForTask(ctx, obj.TaskID) +} + +func (r *taskResolver) Badges(ctx context.Context, obj *pg.Task) (*TaskBadges, error) { + checklists, err := r.Repository.GetTaskChecklistsForTask(ctx, obj.TaskID) + if err != nil { + return &TaskBadges{}, err + } + if len(checklists) == 0 { + return &TaskBadges{Checklist: nil}, err + } + complete := 0 + total := 0 + for _, checklist := range checklists { + items, err := r.Repository.GetTaskChecklistItemsForTaskChecklist(ctx, checklist.TaskChecklistID) + if err != nil { + return &TaskBadges{}, err + } + for _, item := range items { + total += 1 + if item.Complete { + complete += 1 + } + } + } + return &TaskBadges{Checklist: &ChecklistBadge{Total: total, Complete: complete}}, nil +} + +func (r *taskChecklistResolver) ID(ctx context.Context, obj *pg.TaskChecklist) (uuid.UUID, error) { + return obj.TaskChecklistID, nil +} + +func (r *taskChecklistResolver) Items(ctx context.Context, obj *pg.TaskChecklist) ([]pg.TaskChecklistItem, error) { + return r.Repository.GetTaskChecklistItemsForTaskChecklist(ctx, obj.TaskChecklistID) +} + +func (r *taskChecklistItemResolver) ID(ctx context.Context, obj *pg.TaskChecklistItem) (uuid.UUID, error) { + return obj.TaskChecklistItemID, nil +} + +func (r *taskChecklistItemResolver) DueDate(ctx context.Context, obj *pg.TaskChecklistItem) (*time.Time, error) { + panic(fmt.Errorf("not implemented")) +} + func (r *taskGroupResolver) ID(ctx context.Context, obj *pg.TaskGroup) (uuid.UUID, error) { return obj.TaskGroupID, nil } @@ -591,6 +717,12 @@ func (r *Resolver) RefreshToken() RefreshTokenResolver { return &refreshTokenRes // Task returns TaskResolver implementation. func (r *Resolver) Task() TaskResolver { return &taskResolver{r} } +// TaskChecklist returns TaskChecklistResolver implementation. +func (r *Resolver) TaskChecklist() TaskChecklistResolver { return &taskChecklistResolver{r} } + +// TaskChecklistItem returns TaskChecklistItemResolver implementation. +func (r *Resolver) TaskChecklistItem() TaskChecklistItemResolver { return &taskChecklistItemResolver{r} } + // TaskGroup returns TaskGroupResolver implementation. func (r *Resolver) TaskGroup() TaskGroupResolver { return &taskGroupResolver{r} } @@ -610,6 +742,8 @@ type projectLabelResolver struct{ *Resolver } type queryResolver struct{ *Resolver } type refreshTokenResolver struct{ *Resolver } type taskResolver struct{ *Resolver } +type taskChecklistResolver struct{ *Resolver } +type taskChecklistItemResolver struct{ *Resolver } type taskGroupResolver struct{ *Resolver } type taskLabelResolver struct{ *Resolver } type teamResolver struct{ *Resolver } diff --git a/api/migrations/0025_add-cascade-delete-to-task-id-fk-on-task_label.up.sql b/api/migrations/0025_add-cascade-delete-to-task-id-fk-on-task_label.up.sql new file mode 100644 index 0000000..82f5e59 --- /dev/null +++ b/api/migrations/0025_add-cascade-delete-to-task-id-fk-on-task_label.up.sql @@ -0,0 +1,6 @@ +ALTER TABLE task_label DROP CONSTRAINT task_label_task_id_fkey; +ALTER TABLE task_label + ADD CONSTRAINT task_label_task_id_fkey + FOREIGN KEY (task_id) + REFERENCES task(task_id) + ON DELETE CASCADE; diff --git a/api/migrations/0026_add-cascade-delete-to-task-id-fk-on-task_assigned.up.sql b/api/migrations/0026_add-cascade-delete-to-task-id-fk-on-task_assigned.up.sql new file mode 100644 index 0000000..92b934b --- /dev/null +++ b/api/migrations/0026_add-cascade-delete-to-task-id-fk-on-task_assigned.up.sql @@ -0,0 +1,6 @@ +ALTER TABLE task_assigned DROP CONSTRAINT task_assigned_task_id_fkey; +ALTER TABLE task_assigned + ADD CONSTRAINT task_assigned_task_id_fkey + FOREIGN KEY (task_id) + REFERENCES task(task_id) + ON DELETE CASCADE; diff --git a/api/migrations/0027_add-cascade-delete-to-task_group_id-fk-on-task.up.sql b/api/migrations/0027_add-cascade-delete-to-task_group_id-fk-on-task.up.sql new file mode 100644 index 0000000..d0a59a5 --- /dev/null +++ b/api/migrations/0027_add-cascade-delete-to-task_group_id-fk-on-task.up.sql @@ -0,0 +1,6 @@ +ALTER TABLE task DROP CONSTRAINT task_task_group_id_fkey; +ALTER TABLE task + ADD CONSTRAINT task_task_group_id_fkey + FOREIGN KEY (task_group_id) + REFERENCES task_group(task_group_id) + ON DELETE CASCADE; diff --git a/api/migrations/0028_add-complete-column-to-task-table.up.sql b/api/migrations/0028_add-complete-column-to-task-table.up.sql new file mode 100644 index 0000000..a5a8e3b --- /dev/null +++ b/api/migrations/0028_add-complete-column-to-task-table.up.sql @@ -0,0 +1 @@ +ALTER TABLE task ADD COLUMN complete boolean NOT NULL DEFAULT FALSE; diff --git a/api/migrations/0029_add-task_checklist.up.sql b/api/migrations/0029_add-task_checklist.up.sql new file mode 100644 index 0000000..6576314 --- /dev/null +++ b/api/migrations/0029_add-task_checklist.up.sql @@ -0,0 +1,7 @@ +CREATE TABLE task_checklist ( + task_checklist_id uuid PRIMARY KEY DEFAULT uuid_generate_v4(), + task_id uuid NOT NULL REFERENCES task(task_id) ON DELETE CASCADE, + created_at timestamptz NOT NULL, + name text NOT NULL, + position float NOT NULL +); diff --git a/api/migrations/0030_add-task_checklist_item.up.sql b/api/migrations/0030_add-task_checklist_item.up.sql new file mode 100644 index 0000000..cff5710 --- /dev/null +++ b/api/migrations/0030_add-task_checklist_item.up.sql @@ -0,0 +1,9 @@ +CREATE TABLE task_checklist_item ( + task_checklist_item_id uuid PRIMARY KEY DEFAULT uuid_generate_v4(), + task_checklist_id uuid NOT NULL REFERENCES task_checklist(task_checklist_id) ON DELETE CASCADE, + created_at timestamptz NOT NULL, + complete boolean NOT NULL DEFAULT false, + name text NOT NULL, + position float NOT NULL, + due_date timestamptz +); diff --git a/api/pg/models.go b/api/pg/models.go index 9402a2d..789a0ee 100644 --- a/api/pg/models.go +++ b/api/pg/models.go @@ -53,6 +53,7 @@ type Task struct { Position float64 `json:"position"` Description sql.NullString `json:"description"` DueDate sql.NullTime `json:"due_date"` + Complete bool `json:"complete"` } type TaskAssigned struct { @@ -62,6 +63,24 @@ type TaskAssigned struct { AssignedDate time.Time `json:"assigned_date"` } +type TaskChecklist struct { + TaskChecklistID uuid.UUID `json:"task_checklist_id"` + TaskID uuid.UUID `json:"task_id"` + CreatedAt time.Time `json:"created_at"` + Name string `json:"name"` + Position float64 `json:"position"` +} + +type TaskChecklistItem struct { + TaskChecklistItemID uuid.UUID `json:"task_checklist_item_id"` + TaskChecklistID uuid.UUID `json:"task_checklist_id"` + CreatedAt time.Time `json:"created_at"` + Complete bool `json:"complete"` + Name string `json:"name"` + Position float64 `json:"position"` + DueDate sql.NullTime `json:"due_date"` +} + type TaskGroup struct { TaskGroupID uuid.UUID `json:"task_group_id"` ProjectID uuid.UUID `json:"project_id"` diff --git a/api/pg/pg.go b/api/pg/pg.go index 62a3bfe..c1ed94b 100644 --- a/api/pg/pg.go +++ b/api/pg/pg.go @@ -17,7 +17,17 @@ type Repository interface { GetAllProjectsForTeam(ctx context.Context, teamID uuid.UUID) ([]Project, error) GetProjectByID(ctx context.Context, projectID uuid.UUID) (Project, error) + UpdateTaskChecklistItemName(ctx context.Context, arg UpdateTaskChecklistItemNameParams) (TaskChecklistItem, error) + GetTaskChecklistItemByID(ctx context.Context, taskChecklistItemID uuid.UUID) (TaskChecklistItem, error) + CreateTaskChecklist(ctx context.Context, arg CreateTaskChecklistParams) (TaskChecklist, error) + CreateTaskChecklistItem(ctx context.Context, arg CreateTaskChecklistItemParams) (TaskChecklistItem, error) + GetTaskChecklistItemsForTaskChecklist(ctx context.Context, taskChecklistID uuid.UUID) ([]TaskChecklistItem, error) + GetTaskChecklistsForTask(ctx context.Context, taskID uuid.UUID) ([]TaskChecklist, error) + SetTaskChecklistItemComplete(ctx context.Context, arg SetTaskChecklistItemCompleteParams) (TaskChecklistItem, error) + DeleteTaskChecklistItem(ctx context.Context, taskChecklistItemID uuid.UUID) error + UpdateUserAccountProfileAvatarURL(ctx context.Context, arg UpdateUserAccountProfileAvatarURLParams) (UserAccount, error) + CreateUserAccount(ctx context.Context, arg CreateUserAccountParams) (UserAccount, error) GetUserAccountByID(ctx context.Context, userID uuid.UUID) (UserAccount, error) GetUserAccountByUsername(ctx context.Context, username string) (UserAccount, error) @@ -25,6 +35,7 @@ type Repository interface { GetTaskLabelByID(ctx context.Context, taskLabelID uuid.UUID) (TaskLabel, error) + SetTaskComplete(ctx context.Context, arg SetTaskCompleteParams) (Task, error) DeleteTaskLabelForTaskByProjectLabelID(ctx context.Context, arg DeleteTaskLabelForTaskByProjectLabelIDParams) error GetTaskLabelForTaskByProjectLabelID(ctx context.Context, arg GetTaskLabelForTaskByProjectLabelIDParams) (TaskLabel, error) UpdateProjectNameByID(ctx context.Context, arg UpdateProjectNameByIDParams) (Project, error) @@ -47,6 +58,7 @@ type Repository interface { DeleteRefreshTokenByID(ctx context.Context, tokenID uuid.UUID) error DeleteRefreshTokenByUserID(ctx context.Context, userID uuid.UUID) error + SetTaskGroupName(ctx context.Context, arg SetTaskGroupNameParams) (TaskGroup, error) DeleteTaskGroupByID(ctx context.Context, taskGroupID uuid.UUID) (int64, error) DeleteTasksByTaskGroupID(ctx context.Context, taskGroupID uuid.UUID) (int64, error) UpdateTaskGroupLocation(ctx context.Context, arg UpdateTaskGroupLocationParams) (TaskGroup, error) diff --git a/api/pg/querier.go b/api/pg/querier.go index ca1adf4..c55e6d5 100644 --- a/api/pg/querier.go +++ b/api/pg/querier.go @@ -16,6 +16,8 @@ type Querier interface { CreateRefreshToken(ctx context.Context, arg CreateRefreshTokenParams) (RefreshToken, error) CreateTask(ctx context.Context, arg CreateTaskParams) (Task, error) CreateTaskAssigned(ctx context.Context, arg CreateTaskAssignedParams) (TaskAssigned, error) + CreateTaskChecklist(ctx context.Context, arg CreateTaskChecklistParams) (TaskChecklist, error) + CreateTaskChecklistItem(ctx context.Context, arg CreateTaskChecklistItemParams) (TaskChecklistItem, error) CreateTaskGroup(ctx context.Context, arg CreateTaskGroupParams) (TaskGroup, error) CreateTaskLabelForTask(ctx context.Context, arg CreateTaskLabelForTaskParams) (TaskLabel, error) CreateTeam(ctx context.Context, arg CreateTeamParams) (Team, error) @@ -26,6 +28,7 @@ type Querier interface { DeleteRefreshTokenByUserID(ctx context.Context, userID uuid.UUID) error DeleteTaskAssignedByID(ctx context.Context, arg DeleteTaskAssignedByIDParams) (TaskAssigned, error) DeleteTaskByID(ctx context.Context, taskID uuid.UUID) error + DeleteTaskChecklistItem(ctx context.Context, taskChecklistItemID uuid.UUID) error DeleteTaskGroupByID(ctx context.Context, taskGroupID uuid.UUID) (int64, error) DeleteTaskLabelByID(ctx context.Context, taskLabelID uuid.UUID) error DeleteTaskLabelForTaskByProjectLabelID(ctx context.Context, arg DeleteTaskLabelForTaskByProjectLabelIDParams) error @@ -46,6 +49,9 @@ type Querier interface { GetProjectLabelsForProject(ctx context.Context, projectID uuid.UUID) ([]ProjectLabel, error) GetRefreshTokenByID(ctx context.Context, tokenID uuid.UUID) (RefreshToken, error) GetTaskByID(ctx context.Context, taskID uuid.UUID) (Task, error) + GetTaskChecklistItemByID(ctx context.Context, taskChecklistItemID uuid.UUID) (TaskChecklistItem, error) + GetTaskChecklistItemsForTaskChecklist(ctx context.Context, taskChecklistID uuid.UUID) ([]TaskChecklistItem, error) + GetTaskChecklistsForTask(ctx context.Context, taskID uuid.UUID) ([]TaskChecklist, error) GetTaskGroupByID(ctx context.Context, taskGroupID uuid.UUID) (TaskGroup, error) GetTaskGroupsForProject(ctx context.Context, projectID uuid.UUID) ([]TaskGroup, error) GetTaskLabelByID(ctx context.Context, taskLabelID uuid.UUID) (TaskLabel, error) @@ -56,11 +62,14 @@ type Querier interface { GetTeamsForOrganization(ctx context.Context, organizationID uuid.UUID) ([]Team, error) GetUserAccountByID(ctx context.Context, userID uuid.UUID) (UserAccount, error) GetUserAccountByUsername(ctx context.Context, username string) (UserAccount, error) + SetTaskChecklistItemComplete(ctx context.Context, arg SetTaskChecklistItemCompleteParams) (TaskChecklistItem, error) + SetTaskComplete(ctx context.Context, arg SetTaskCompleteParams) (Task, error) SetTaskGroupName(ctx context.Context, arg SetTaskGroupNameParams) (TaskGroup, error) UpdateProjectLabel(ctx context.Context, arg UpdateProjectLabelParams) (ProjectLabel, error) UpdateProjectLabelColor(ctx context.Context, arg UpdateProjectLabelColorParams) (ProjectLabel, error) UpdateProjectLabelName(ctx context.Context, arg UpdateProjectLabelNameParams) (ProjectLabel, error) UpdateProjectNameByID(ctx context.Context, arg UpdateProjectNameByIDParams) (Project, error) + UpdateTaskChecklistItemName(ctx context.Context, arg UpdateTaskChecklistItemNameParams) (TaskChecklistItem, error) UpdateTaskDescription(ctx context.Context, arg UpdateTaskDescriptionParams) (Task, error) UpdateTaskDueDate(ctx context.Context, arg UpdateTaskDueDateParams) (Task, error) UpdateTaskGroupLocation(ctx context.Context, arg UpdateTaskGroupLocationParams) (TaskGroup, error) diff --git a/api/pg/task.sql.go b/api/pg/task.sql.go index ac6e36e..33c6d73 100644 --- a/api/pg/task.sql.go +++ b/api/pg/task.sql.go @@ -13,7 +13,7 @@ import ( const createTask = `-- name: CreateTask :one INSERT INTO task (task_group_id, created_at, name, position) - VALUES($1, $2, $3, $4) RETURNING task_id, task_group_id, created_at, name, position, description, due_date + VALUES($1, $2, $3, $4) RETURNING task_id, task_group_id, created_at, name, position, description, due_date, complete ` type CreateTaskParams struct { @@ -39,6 +39,7 @@ func (q *Queries) CreateTask(ctx context.Context, arg CreateTaskParams) (Task, e &i.Position, &i.Description, &i.DueDate, + &i.Complete, ) return i, err } @@ -65,7 +66,7 @@ func (q *Queries) DeleteTasksByTaskGroupID(ctx context.Context, taskGroupID uuid } const getAllTasks = `-- name: GetAllTasks :many -SELECT task_id, task_group_id, created_at, name, position, description, due_date FROM task +SELECT task_id, task_group_id, created_at, name, position, description, due_date, complete FROM task ` func (q *Queries) GetAllTasks(ctx context.Context) ([]Task, error) { @@ -85,6 +86,7 @@ func (q *Queries) GetAllTasks(ctx context.Context) ([]Task, error) { &i.Position, &i.Description, &i.DueDate, + &i.Complete, ); err != nil { return nil, err } @@ -100,7 +102,7 @@ func (q *Queries) GetAllTasks(ctx context.Context) ([]Task, error) { } const getTaskByID = `-- name: GetTaskByID :one -SELECT task_id, task_group_id, created_at, name, position, description, due_date FROM task WHERE task_id = $1 +SELECT task_id, task_group_id, created_at, name, position, description, due_date, complete FROM task WHERE task_id = $1 ` func (q *Queries) GetTaskByID(ctx context.Context, taskID uuid.UUID) (Task, error) { @@ -114,12 +116,13 @@ func (q *Queries) GetTaskByID(ctx context.Context, taskID uuid.UUID) (Task, erro &i.Position, &i.Description, &i.DueDate, + &i.Complete, ) return i, err } const getTasksForTaskGroupID = `-- name: GetTasksForTaskGroupID :many -SELECT task_id, task_group_id, created_at, name, position, description, due_date FROM task WHERE task_group_id = $1 +SELECT task_id, task_group_id, created_at, name, position, description, due_date, complete FROM task WHERE task_group_id = $1 ` func (q *Queries) GetTasksForTaskGroupID(ctx context.Context, taskGroupID uuid.UUID) ([]Task, error) { @@ -139,6 +142,7 @@ func (q *Queries) GetTasksForTaskGroupID(ctx context.Context, taskGroupID uuid.U &i.Position, &i.Description, &i.DueDate, + &i.Complete, ); err != nil { return nil, err } @@ -153,8 +157,33 @@ func (q *Queries) GetTasksForTaskGroupID(ctx context.Context, taskGroupID uuid.U return items, nil } +const setTaskComplete = `-- name: SetTaskComplete :one +UPDATE task SET complete = $2 WHERE task_id = $1 RETURNING task_id, task_group_id, created_at, name, position, description, due_date, complete +` + +type SetTaskCompleteParams struct { + TaskID uuid.UUID `json:"task_id"` + Complete bool `json:"complete"` +} + +func (q *Queries) SetTaskComplete(ctx context.Context, arg SetTaskCompleteParams) (Task, error) { + row := q.db.QueryRowContext(ctx, setTaskComplete, arg.TaskID, arg.Complete) + var i Task + err := row.Scan( + &i.TaskID, + &i.TaskGroupID, + &i.CreatedAt, + &i.Name, + &i.Position, + &i.Description, + &i.DueDate, + &i.Complete, + ) + return i, err +} + const updateTaskDescription = `-- name: UpdateTaskDescription :one -UPDATE task SET description = $2 WHERE task_id = $1 RETURNING task_id, task_group_id, created_at, name, position, description, due_date +UPDATE task SET description = $2 WHERE task_id = $1 RETURNING task_id, task_group_id, created_at, name, position, description, due_date, complete ` type UpdateTaskDescriptionParams struct { @@ -173,12 +202,13 @@ func (q *Queries) UpdateTaskDescription(ctx context.Context, arg UpdateTaskDescr &i.Position, &i.Description, &i.DueDate, + &i.Complete, ) return i, err } const updateTaskDueDate = `-- name: UpdateTaskDueDate :one -UPDATE task SET due_date = $2 WHERE task_id = $1 RETURNING task_id, task_group_id, created_at, name, position, description, due_date +UPDATE task SET due_date = $2 WHERE task_id = $1 RETURNING task_id, task_group_id, created_at, name, position, description, due_date, complete ` type UpdateTaskDueDateParams struct { @@ -197,12 +227,13 @@ func (q *Queries) UpdateTaskDueDate(ctx context.Context, arg UpdateTaskDueDatePa &i.Position, &i.Description, &i.DueDate, + &i.Complete, ) return i, err } const updateTaskLocation = `-- name: UpdateTaskLocation :one -UPDATE task SET task_group_id = $2, position = $3 WHERE task_id = $1 RETURNING task_id, task_group_id, created_at, name, position, description, due_date +UPDATE task SET task_group_id = $2, position = $3 WHERE task_id = $1 RETURNING task_id, task_group_id, created_at, name, position, description, due_date, complete ` type UpdateTaskLocationParams struct { @@ -222,12 +253,13 @@ func (q *Queries) UpdateTaskLocation(ctx context.Context, arg UpdateTaskLocation &i.Position, &i.Description, &i.DueDate, + &i.Complete, ) return i, err } const updateTaskName = `-- name: UpdateTaskName :one -UPDATE task SET name = $2 WHERE task_id = $1 RETURNING task_id, task_group_id, created_at, name, position, description, due_date +UPDATE task SET name = $2 WHERE task_id = $1 RETURNING task_id, task_group_id, created_at, name, position, description, due_date, complete ` type UpdateTaskNameParams struct { @@ -246,6 +278,7 @@ func (q *Queries) UpdateTaskName(ctx context.Context, arg UpdateTaskNameParams) &i.Position, &i.Description, &i.DueDate, + &i.Complete, ) return i, err } diff --git a/api/pg/task_checklist.sql.go b/api/pg/task_checklist.sql.go new file mode 100644 index 0000000..146ada0 --- /dev/null +++ b/api/pg/task_checklist.sql.go @@ -0,0 +1,219 @@ +// Code generated by sqlc. DO NOT EDIT. +// source: task_checklist.sql + +package pg + +import ( + "context" + "time" + + "github.com/google/uuid" +) + +const createTaskChecklist = `-- name: CreateTaskChecklist :one +INSERT INTO task_checklist (task_id, created_at, name, position) VALUES ($1, $2, $3, $4) + RETURNING task_checklist_id, task_id, created_at, name, position +` + +type CreateTaskChecklistParams struct { + TaskID uuid.UUID `json:"task_id"` + CreatedAt time.Time `json:"created_at"` + Name string `json:"name"` + Position float64 `json:"position"` +} + +func (q *Queries) CreateTaskChecklist(ctx context.Context, arg CreateTaskChecklistParams) (TaskChecklist, error) { + row := q.db.QueryRowContext(ctx, createTaskChecklist, + arg.TaskID, + arg.CreatedAt, + arg.Name, + arg.Position, + ) + var i TaskChecklist + err := row.Scan( + &i.TaskChecklistID, + &i.TaskID, + &i.CreatedAt, + &i.Name, + &i.Position, + ) + return i, err +} + +const createTaskChecklistItem = `-- name: CreateTaskChecklistItem :one +INSERT INTO task_checklist_item (task_checklist_id, created_at, name, position, complete, due_date) VALUES ($1, $2, $3, $4, false, null) + RETURNING task_checklist_item_id, task_checklist_id, created_at, complete, name, position, due_date +` + +type CreateTaskChecklistItemParams struct { + TaskChecklistID uuid.UUID `json:"task_checklist_id"` + CreatedAt time.Time `json:"created_at"` + Name string `json:"name"` + Position float64 `json:"position"` +} + +func (q *Queries) CreateTaskChecklistItem(ctx context.Context, arg CreateTaskChecklistItemParams) (TaskChecklistItem, error) { + row := q.db.QueryRowContext(ctx, createTaskChecklistItem, + arg.TaskChecklistID, + arg.CreatedAt, + arg.Name, + arg.Position, + ) + var i TaskChecklistItem + err := row.Scan( + &i.TaskChecklistItemID, + &i.TaskChecklistID, + &i.CreatedAt, + &i.Complete, + &i.Name, + &i.Position, + &i.DueDate, + ) + return i, err +} + +const deleteTaskChecklistItem = `-- name: DeleteTaskChecklistItem :exec +DELETE FROM task_checklist_item WHERE task_checklist_item_id = $1 +` + +func (q *Queries) DeleteTaskChecklistItem(ctx context.Context, taskChecklistItemID uuid.UUID) error { + _, err := q.db.ExecContext(ctx, deleteTaskChecklistItem, taskChecklistItemID) + return err +} + +const getTaskChecklistItemByID = `-- name: GetTaskChecklistItemByID :one +SELECT task_checklist_item_id, task_checklist_id, created_at, complete, name, position, due_date FROM task_checklist_item WHERE task_checklist_item_id = $1 +` + +func (q *Queries) GetTaskChecklistItemByID(ctx context.Context, taskChecklistItemID uuid.UUID) (TaskChecklistItem, error) { + row := q.db.QueryRowContext(ctx, getTaskChecklistItemByID, taskChecklistItemID) + var i TaskChecklistItem + err := row.Scan( + &i.TaskChecklistItemID, + &i.TaskChecklistID, + &i.CreatedAt, + &i.Complete, + &i.Name, + &i.Position, + &i.DueDate, + ) + return i, err +} + +const getTaskChecklistItemsForTaskChecklist = `-- name: GetTaskChecklistItemsForTaskChecklist :many +SELECT task_checklist_item_id, task_checklist_id, created_at, complete, name, position, due_date FROM task_checklist_item WHERE task_checklist_id = $1 +` + +func (q *Queries) GetTaskChecklistItemsForTaskChecklist(ctx context.Context, taskChecklistID uuid.UUID) ([]TaskChecklistItem, error) { + rows, err := q.db.QueryContext(ctx, getTaskChecklistItemsForTaskChecklist, taskChecklistID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []TaskChecklistItem + for rows.Next() { + var i TaskChecklistItem + if err := rows.Scan( + &i.TaskChecklistItemID, + &i.TaskChecklistID, + &i.CreatedAt, + &i.Complete, + &i.Name, + &i.Position, + &i.DueDate, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const getTaskChecklistsForTask = `-- name: GetTaskChecklistsForTask :many +SELECT task_checklist_id, task_id, created_at, name, position FROM task_checklist WHERE task_id = $1 +` + +func (q *Queries) GetTaskChecklistsForTask(ctx context.Context, taskID uuid.UUID) ([]TaskChecklist, error) { + rows, err := q.db.QueryContext(ctx, getTaskChecklistsForTask, taskID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []TaskChecklist + for rows.Next() { + var i TaskChecklist + if err := rows.Scan( + &i.TaskChecklistID, + &i.TaskID, + &i.CreatedAt, + &i.Name, + &i.Position, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const setTaskChecklistItemComplete = `-- name: SetTaskChecklistItemComplete :one +UPDATE task_checklist_item SET complete = $2 WHERE task_checklist_item_id = $1 + RETURNING task_checklist_item_id, task_checklist_id, created_at, complete, name, position, due_date +` + +type SetTaskChecklistItemCompleteParams struct { + TaskChecklistItemID uuid.UUID `json:"task_checklist_item_id"` + Complete bool `json:"complete"` +} + +func (q *Queries) SetTaskChecklistItemComplete(ctx context.Context, arg SetTaskChecklistItemCompleteParams) (TaskChecklistItem, error) { + row := q.db.QueryRowContext(ctx, setTaskChecklistItemComplete, arg.TaskChecklistItemID, arg.Complete) + var i TaskChecklistItem + err := row.Scan( + &i.TaskChecklistItemID, + &i.TaskChecklistID, + &i.CreatedAt, + &i.Complete, + &i.Name, + &i.Position, + &i.DueDate, + ) + return i, err +} + +const updateTaskChecklistItemName = `-- name: UpdateTaskChecklistItemName :one +UPDATE task_checklist_item SET name = $2 WHERE task_checklist_item_id = $1 + RETURNING task_checklist_item_id, task_checklist_id, created_at, complete, name, position, due_date +` + +type UpdateTaskChecklistItemNameParams struct { + TaskChecklistItemID uuid.UUID `json:"task_checklist_item_id"` + Name string `json:"name"` +} + +func (q *Queries) UpdateTaskChecklistItemName(ctx context.Context, arg UpdateTaskChecklistItemNameParams) (TaskChecklistItem, error) { + row := q.db.QueryRowContext(ctx, updateTaskChecklistItemName, arg.TaskChecklistItemID, arg.Name) + var i TaskChecklistItem + err := row.Scan( + &i.TaskChecklistItemID, + &i.TaskChecklistID, + &i.CreatedAt, + &i.Complete, + &i.Name, + &i.Position, + &i.DueDate, + ) + return i, err +} diff --git a/api/query/task.sql b/api/query/task.sql index 347a2ac..d32b743 100644 --- a/api/query/task.sql +++ b/api/query/task.sql @@ -28,3 +28,6 @@ DELETE FROM task where task_group_id = $1; -- name: UpdateTaskDueDate :one UPDATE task SET due_date = $2 WHERE task_id = $1 RETURNING *; + +-- name: SetTaskComplete :one +UPDATE task SET complete = $2 WHERE task_id = $1 RETURNING *; diff --git a/api/query/task_checklist.sql b/api/query/task_checklist.sql new file mode 100644 index 0000000..608f61a --- /dev/null +++ b/api/query/task_checklist.sql @@ -0,0 +1,27 @@ +-- name: CreateTaskChecklist :one +INSERT INTO task_checklist (task_id, created_at, name, position) VALUES ($1, $2, $3, $4) + RETURNING *; + +-- name: GetTaskChecklistsForTask :many +SELECT * FROM task_checklist WHERE task_id = $1; + +-- name: CreateTaskChecklistItem :one +INSERT INTO task_checklist_item (task_checklist_id, created_at, name, position, complete, due_date) VALUES ($1, $2, $3, $4, false, null) + RETURNING *; + +-- name: GetTaskChecklistItemsForTaskChecklist :many +SELECT * FROM task_checklist_item WHERE task_checklist_id = $1; + +-- name: SetTaskChecklistItemComplete :one +UPDATE task_checklist_item SET complete = $2 WHERE task_checklist_item_id = $1 + RETURNING *; + +-- name: DeleteTaskChecklistItem :exec +DELETE FROM task_checklist_item WHERE task_checklist_item_id = $1; + +-- name: GetTaskChecklistItemByID :one +SELECT * FROM task_checklist_item WHERE task_checklist_item_id = $1; + +-- name: UpdateTaskChecklistItemName :one +UPDATE task_checklist_item SET name = $2 WHERE task_checklist_item_id = $1 + RETURNING *; diff --git a/api/trello.json b/api/trello.json new file mode 100644 index 0000000..05c869a --- /dev/null +++ b/api/trello.json @@ -0,0 +1 @@ +{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","desc":"","descData":null,"closed":false,"idOrganization":null,"shortLink":"fZa0Bxoz","powerUps":[],"dateLastActivity":"2020-06-15T23:06:05.163Z","idTags":[],"datePluginDisable":null,"creationMethod":null,"idBoardSource":null,"idEnterprise":null,"pinned":false,"starred":true,"url":"https://trello.com/b/fZa0Bxoz/project-citadel","prefs":{"permissionLevel":"private","hideVotes":false,"voting":"disabled","comments":"members","invitations":"members","selfJoin":true,"cardCovers":true,"isTemplate":false,"cardAging":"regular","calendarFeedEnabled":false,"background":"grey","backgroundImage":null,"backgroundImageScaled":null,"backgroundTile":false,"backgroundBrightness":"dark","backgroundColor":"#838C91","backgroundBottomColor":"#838C91","backgroundTopColor":"#838C91","canBePublic":true,"canBeEnterprise":true,"canBeOrg":true,"canBePrivate":true,"canInvite":true},"shortUrl":"https://trello.com/b/fZa0Bxoz","premiumFeatures":[],"ixUpdate":"829","limits":{"attachments":{"perBoard":{"status":"ok","disableAt":36000,"warnAt":32400},"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"boards":{"totalMembersPerBoard":{"status":"ok","disableAt":1600,"warnAt":1440}},"cards":{"openPerBoard":{"status":"ok","disableAt":5000,"warnAt":4500},"openPerList":{"status":"ok","disableAt":5000,"warnAt":4500},"totalPerBoard":{"status":"ok","disableAt":2000000,"warnAt":1800000},"totalPerList":{"status":"ok","disableAt":1000000,"warnAt":900000}},"checklists":{"perBoard":{"status":"ok","disableAt":2000000,"warnAt":1800000},"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"checkItems":{"perChecklist":{"status":"ok","disableAt":200,"warnAt":180}},"customFields":{"perBoard":{"status":"ok","disableAt":50,"warnAt":45}},"customFieldOptions":{"perField":{"status":"ok","disableAt":50,"warnAt":45}},"labels":{"perBoard":{"status":"ok","disableAt":1000,"warnAt":900}},"lists":{"openPerBoard":{"status":"ok","disableAt":500,"warnAt":450},"totalPerBoard":{"status":"ok","disableAt":3000,"warnAt":2700}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}},"reactions":{"perAction":{"status":"ok","disableAt":1000,"warnAt":900},"uniquePerAction":{"status":"ok","disableAt":17,"warnAt":16}}},"enterpriseOwned":false,"templateGallery":null,"subscribed":false,"dateLastView":"2020-06-15T23:07:14.505Z","labelNames":{"green":"API","yellow":"Web","orange":"","red":"","purple":"","blue":"","sky":"","lime":"","pink":"High Priority","black":""},"actions":[{"id":"5ee7fe73aa8ff7788e6e0126","idMemberCreator":"55642875ac2f713188495fc7","data":{"idMember":"55642875ac2f713188495fc7","deactivated":false,"card":{"id":"5ed7fd98371d32159dddc14a","name":"Add list tab","idShort":37,"shortLink":"v3SCvCjx"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"member":{"id":"55642875ac2f713188495fc7","name":"Jordan Knott"}},"type":"removeMemberFromCard","date":"2020-06-15T23:04:19.432Z","limits":{},"member":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ee7fe72f2f7f376d85fc7ab","idMemberCreator":"55642875ac2f713188495fc7","data":{"idMember":"55642875ac2f713188495fc7","card":{"id":"5ed7fd98371d32159dddc14a","name":"Add list tab","idShort":37,"shortLink":"v3SCvCjx"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"member":{"id":"55642875ac2f713188495fc7","name":"Jordan Knott"}},"type":"addMemberToCard","date":"2020-06-15T23:04:18.957Z","limits":{},"member":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ee7ecb226f5a668c400c692","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"due":"2020-06-17T21:47:00.000Z"},"card":{"due":"2023-06-20T21:47:00.000Z","id":"5ed80945ebef49792ffc8071","name":"Notification system","idShort":38,"shortLink":"ICj6IQeI"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"}},"type":"updateCard","date":"2020-06-15T21:48:34.683Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ee7eca9024db56e73a5678c","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"due":null},"card":{"due":"2020-06-17T21:47:00.000Z","id":"5ed80945ebef49792ffc8071","name":"Notification system","idShort":38,"shortLink":"ICj6IQeI"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"}},"type":"updateCard","date":"2020-06-15T21:48:25.463Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ee7eca9f7748a1588cf2ae9","idMemberCreator":"55642875ac2f713188495fc7","data":{"plugin":{"id":"55a5d917446f517774210011","idOrganizationOwner":"5a999cd36066c584c097f193","author":"Trello Inc","capabilities":[],"categories":["board-utilities","communication-collaboration"],"iframeConnectorUrl":"https://calendar.trello.services/","name":"Calendar","privacyUrl":"https://trello.com/privacy","public":true,"moderatedState":null,"supportEmail":"","url":"https://calendar.trello.services/manifest.json","tags":["essential","staff-pick"],"heroImageUrl":{"_id":"5b5629bd96d94a97675090c7","@2x":"https://trello-attachments.s3.amazonaws.com/5b56280b7694ac008082fe38/5b5628c7fcbdca04e2d6334c/4025fdb1f203e43f2cd5997b29e53e65/calendar%402x.jpg","@1x":"https://trello-attachments.s3.amazonaws.com/5b56280b7694ac008082fe38/5b5628c7fcbdca04e2d6334c/f52b4188bdca53cf13a9036efb95eced/calendar.jpg"},"isCompliantWithPrivacyStandards":null,"usageBrackets":{"boards":5000000},"claimedDomains":[],"icon":{"url":"https://calendar.trello.services/images/calendar-icon.svg"},"listing":{"name":"Calendar","locale":"en-US","description":"Bring perspective to due dates with the Calendar Power-Up for Trello. Whether you are planning a conference, managing an editorial calendar, or organizing a family vacation, the Calendar Power-Up let’s you display cards with due dates in a weekly or monthly calendar view. Easily prioritize cards by dragging and dropping them on the calendar to automatically update their due dates, and export your Trello calendar to third party apps with an iCalendar link.\n\n- Display and filter cards with due dates in a weekly or monthly calendar view.\n\n- Manage due dates by dragging and dropping cards on the calendar.\n\n- Easily see completed tasks by marking due dates complete.\n\n- Export a board’s calendar to third party calendars with each board’s unique iCalendar link.\n\n- The Calendar Power-Up is supported on the web and iOS and Android mobile devices.\n\n![screenshot](https://calendar.trello.services/images/Calendar_1.jpg)\n![screenshot](https://calendar.trello.services/images/Calendar_2.jpg)\n![screenshot](https://calendar.trello.services/images/Calendar_3.jpg)\n![screenshot](https://calendar.trello.services/images/Calendar_4.jpg)","overview":"Visualize Trello cards in a calendar view."}},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"enablePlugin","date":"2020-06-15T21:48:25.346Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ee6becea57b278affad892e","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":221184},"card":{"pos":154752,"id":"5edb3279e70c2556f441cea7","name":"Add checklists","idShort":50,"shortLink":"ycZhpt00"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-15T00:20:30.330Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ee6bec9efc82b20d485f837","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":212992},"card":{"pos":149760,"id":"5e9e38a2e24185886fc950c7","name":"Add task due date","idShort":28,"shortLink":"wCma0VqF"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-15T00:20:25.812Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ee6bebc6206ca64c8f73932","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":79872},"card":{"pos":2048,"id":"5ed522eb474caf8b0c88c201","name":"Refactor cards into single component","idShort":33,"shortLink":"sxpapv6h"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-06-15T00:20:12.563Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ee6bebc6206ca64c8f73930","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5edea5f897414365394f9bd0"},"card":{"idList":"5e8fee0a6929af2165f46268","id":"5ed522eb474caf8b0c88c201","name":"Refactor cards into single component","idShort":33,"shortLink":"sxpapv6h"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"},"listAfter":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-06-15T00:20:12.538Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ee027f49108010da01ab7ea","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":491520},"card":{"pos":139776,"id":"5ee027eaa2a8ba5ab9c7305d","name":"Migrate often used components into separate files","idShort":54,"shortLink":"vhPJ6X6Z"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-10T00:23:16.359Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ee027f13be0035ca45067f8","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"name":"Migrate often used components into seperate classes"},"card":{"name":"Migrate often used components into separate files","id":"5ee027eaa2a8ba5ab9c7305d","idShort":54,"shortLink":"vhPJ6X6Z"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-10T00:23:13.950Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ee027eaa2a8ba5ab9c7305e","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ee027eaa2a8ba5ab9c7305d","name":"Migrate often used components into seperate classes","idShort":54,"shortLink":"vhPJ6X6Z"},"list":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-10T00:23:06.376Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ee027dec4325e17fb2c72d8","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":299008},"card":{"pos":119808,"id":"5ed522f9abb78475d335be78","name":"Refactor colors to use theme object","idShort":34,"shortLink":"MokJZ3op"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-10T00:22:54.542Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ee027dec4325e17fb2c72d6","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5edea5feb47e14523e480efd"},"card":{"idList":"5edea5f897414365394f9bd0","id":"5ed522f9abb78475d335be78","name":"Refactor colors to use theme object","idShort":34,"shortLink":"MokJZ3op"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"},"listAfter":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-10T00:22:54.514Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ee027dc3a3f2b80c4656701","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":297728},"card":{"pos":79872,"id":"5ed522eb474caf8b0c88c201","name":"Refactor cards into single component","idShort":33,"shortLink":"sxpapv6h"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-10T00:22:52.905Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ee027dc3a3f2b80c46566ff","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5edea5feb47e14523e480efd"},"card":{"idList":"5edea5f897414365394f9bd0","id":"5ed522eb474caf8b0c88c201","name":"Refactor cards into single component","idShort":33,"shortLink":"sxpapv6h"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"},"listAfter":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-10T00:22:52.879Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edecca939a7b284542a76ac","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5edecca939a7b284542a76ab","name":"Refactor dashboard design","idShort":53,"shortLink":"wtsna3XY"},"list":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-08T23:41:29.233Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edecc9b42f48c2e92e2c0e6","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"card":{"closed":true,"id":"5ed5231de2583f18473d0984","name":"Allow projects to be personal","idShort":35,"shortLink":"73OWLQv2"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-08T23:41:15.963Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edeb5ad09b2868508e76146","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"name":"Merge refresh async call stack"},"card":{"name":"Merge refresh async call stack [axios & apollo]","id":"5edeb5a560db636e34e85c0d","idShort":52,"shortLink":"V0dWaoZv"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5edea6112546eb4be8a1a55e","name":"Phase 4 - Optimizations/ Bugfixes"}},"type":"updateCard","date":"2020-06-08T22:03:25.877Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edeb5a560db636e34e85c0e","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5edeb5a560db636e34e85c0d","name":"Merge refresh async call stack","idShort":52,"shortLink":"V0dWaoZv"},"list":{"id":"5edea6112546eb4be8a1a55e","name":"Phase 4 - Optimizations/ Bugfixes"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-08T22:03:17.299Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edeb5020e320401e30118b1","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":106496},"card":{"pos":4096,"id":"5ed80cd925dc470f9e01c5b8","name":"User profile image","idShort":48,"shortLink":"C8tmNe8w"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-06-08T22:00:34.947Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edeb5020e320401e30118af","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5edea5f897414365394f9bd0"},"card":{"idList":"5e8fee0a6929af2165f46268","id":"5ed80cd925dc470f9e01c5b8","name":"User profile image","idShort":48,"shortLink":"C8tmNe8w"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"},"listAfter":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-06-08T22:00:34.924Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea6711d8e9c82a32c3eeb","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5edea6711d8e9c82a32c3ee7","name":"Import from Trello","idShort":51,"shortLink":"nHyqBjTw"},"list":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-08T20:58:25.830Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea65b7611d96d516a4ea8","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"list":{"closed":true,"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateList","date":"2020-06-08T20:58:03.606Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea64cdaa463703fec4010","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":296448},"card":{"pos":288768,"id":"5ed7fd98371d32159dddc14a","name":"Add list tab","idShort":37,"shortLink":"v3SCvCjx"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"}},"type":"updateCard","date":"2020-06-08T20:57:48.325Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea64a6098a17f0386d2a8","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":288768},"card":{"pos":297728,"id":"5ed522eb474caf8b0c88c201","name":"Refactor cards into single component","idShort":33,"shortLink":"sxpapv6h"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"}},"type":"updateCard","date":"2020-06-08T20:57:46.272Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea647eee1852caecd5065","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5feb47e14523e480efd","id":"5ed8094a3ecb5e248bec0848","name":"Real time updates","idShort":39,"shortLink":"UA9RPc3u"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"}},"type":"updateCard","date":"2020-06-08T20:57:43.774Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea646ba8480430ff0ea18","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":311296},"card":{"pos":296448,"id":"5ed7fd98371d32159dddc14a","name":"Add list tab","idShort":37,"shortLink":"v3SCvCjx"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"}},"type":"updateCard","date":"2020-06-08T20:57:42.479Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea646ba8480430ff0ea16","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5feb47e14523e480efd","id":"5ed7fd98371d32159dddc14a","name":"Add list tab","idShort":37,"shortLink":"v3SCvCjx"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"}},"type":"updateCard","date":"2020-06-08T20:57:42.454Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea6443bd13e0204f35bfd","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":327680},"card":{"pos":293888,"id":"5ed80945ebef49792ffc8071","name":"Notification system","idShort":38,"shortLink":"ICj6IQeI"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"}},"type":"updateCard","date":"2020-06-08T20:57:40.926Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea6443bd13e0204f35bfb","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5feb47e14523e480efd","id":"5ed80945ebef49792ffc8071","name":"Notification system","idShort":38,"shortLink":"ICj6IQeI"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"}},"type":"updateCard","date":"2020-06-08T20:57:40.897Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea6436a446a4c469e42fa","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":303104},"card":{"pos":283648,"id":"5ed80bd9693ee510885fc15c","name":"Project favorites","idShort":43,"shortLink":"fSF4Ds9h"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"}},"type":"updateCard","date":"2020-06-08T20:57:39.734Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea6436a446a4c469e42f8","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5feb47e14523e480efd","id":"5ed80bd9693ee510885fc15c","name":"Project favorites","idShort":43,"shortLink":"fSF4Ds9h"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"}},"type":"updateCard","date":"2020-06-08T20:57:39.704Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea6422d248375738c32ae","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":301056},"card":{"pos":288768,"id":"5ed522eb474caf8b0c88c201","name":"Refactor cards into single component","idShort":33,"shortLink":"sxpapv6h"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"}},"type":"updateCard","date":"2020-06-08T20:57:38.417Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea6422d248375738c32ac","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5feb47e14523e480efd","id":"5ed522eb474caf8b0c88c201","name":"Refactor cards into single component","idShort":33,"shortLink":"sxpapv6h"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"}},"type":"updateCard","date":"2020-06-08T20:57:38.393Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea640a617754011bd74f8","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5feb47e14523e480efd","id":"5ed522f9abb78475d335be78","name":"Refactor colors to use theme object","idShort":34,"shortLink":"MokJZ3op"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"}},"type":"updateCard","date":"2020-06-08T20:57:36.627Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea63a61abf713f88127eb","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5f897414365394f9bd0","id":"5ed7fd96e8f3ab69b8e7332e","name":"Add calendar tab","idShort":36,"shortLink":"QBZmXmHz"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-08T20:57:30.159Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea6351c19cf7f95b9923b","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5feb47e14523e480efd","id":"5ed80bee5c47473f2adb230e","name":"Delete project","idShort":45,"shortLink":"MpVDMIJm"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"}},"type":"updateCard","date":"2020-06-08T20:57:25.519Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea633f0b1707c0efbf9ee","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5feb47e14523e480efd","id":"5ed80be82f0619028ac97ecc","name":"Change project team","idShort":44,"shortLink":"kD4HotdC"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"}},"type":"updateCard","date":"2020-06-08T20:57:23.976Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea632c87937401de48366","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5feb47e14523e480efd","id":"5ed80bcbcf1eae6cf3b6cc9e","name":"Project switcher","idShort":42,"shortLink":"ZrEWrr8n"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"}},"type":"updateCard","date":"2020-06-08T20:57:22.680Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea62f7901bb5351f71648","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5f897414365394f9bd0","id":"5edb3279e70c2556f441cea7","name":"Add checklists","idShort":50,"shortLink":"ycZhpt00"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-08T20:57:19.536Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea62e2a62f31ff09b5a02","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5f897414365394f9bd0","id":"5e9e38a2e24185886fc950c7","name":"Add task due date","idShort":28,"shortLink":"wCma0VqF"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-08T20:57:18.149Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea62c4601a03f63e23a0e","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5f897414365394f9bd0","id":"5ed8098066f27d6c0e3c36fa","name":"Project user management","idShort":41,"shortLink":"rqQvInlv"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-08T20:57:16.756Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea62bdb02783f27a4293a","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5f897414365394f9bd0","id":"5e9e38d28f035d40b2711917","name":"Add team creation","idShort":31,"shortLink":"N4xFvhYD"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-08T20:57:15.401Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea62a321b9c2e4f4a2058","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5f897414365394f9bd0","id":"5edb325b1d2742576b91b3ee","name":"Manage users","idShort":49,"shortLink":"zWXqX889"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-08T20:57:14.257Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea628445071686a0632f1","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5f897414365394f9bd0","id":"5ed8097762a37b5adbfb5947","name":"Admin console","idShort":40,"shortLink":"KIZrLw8H"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-08T20:57:12.943Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea627d3840e09315ab61f","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5f897414365394f9bd0","id":"5ed5231de2583f18473d0984","name":"Allow projects to be personal","idShort":35,"shortLink":"73OWLQv2"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-08T20:57:11.660Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea626c4eea75c0e48df93","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5edea5f897414365394f9bd0","id":"5ed80cd925dc470f9e01c5b8","name":"User profile image","idShort":48,"shortLink":"C8tmNe8w"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"}},"type":"updateCard","date":"2020-06-08T20:57:10.318Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea621f6ba7644814b74cd","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":770047},"list":{"pos":386047.03125,"id":"5edea6112546eb4be8a1a55e","name":"Phase 4 - Optimizations/ Bugfixes"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateList","date":"2020-06-08T20:57:05.138Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea61ea6b2e75bd30799c7","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":417791},"list":{"pos":362495.0625,"id":"5edea6020c603d88466b40c6","name":"Phase 3 - Hard Launch"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateList","date":"2020-06-08T20:57:02.772Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea61d90fff786289efc23","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":704511},"list":{"pos":417791,"id":"5edea6020c603d88466b40c6","name":"Phase 3 - Hard Launch"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateList","date":"2020-06-08T20:57:01.634Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea61902396040deef540f","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":638975},"list":{"pos":315391.125,"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateList","date":"2020-06-08T20:56:57.849Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea61695fd7b5cf7b701d5","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"name":"Phase 4 - Optimizations"},"list":{"name":"Phase 4 - Optimizations/ Bugfixes","id":"5edea6112546eb4be8a1a55e"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateList","date":"2020-06-08T20:56:54.024Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea6112546eb4be8a1a560","idMemberCreator":"55642875ac2f713188495fc7","data":{"list":{"id":"5edea6112546eb4be8a1a55e","name":"Phase 4 - Optimizations"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createList","date":"2020-06-08T20:56:49.198Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea60690d8a87a9b5ef2af","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":573439},"list":{"pos":221183.25,"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateList","date":"2020-06-08T20:56:38.325Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea6020c603d88466b40c8","idMemberCreator":"55642875ac2f713188495fc7","data":{"list":{"id":"5edea6020c603d88466b40c6","name":"Phase 3 - Hard Launch"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createList","date":"2020-06-08T20:56:34.937Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea5feb47e14523e480eff","idMemberCreator":"55642875ac2f713188495fc7","data":{"list":{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createList","date":"2020-06-08T20:56:30.586Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edea5f897414365394f9bd2","idMemberCreator":"55642875ac2f713188495fc7","data":{"list":{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createList","date":"2020-06-08T20:56:24.285Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb51f3f8148672b4406381","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":245760},"card":{"pos":301056,"id":"5ed522eb474caf8b0c88c201","name":"Refactor cards into single component","idShort":33,"shortLink":"sxpapv6h"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T08:21:07.286Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb51f12b5d3b308a0cb306","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":286720},"card":{"pos":299008,"id":"5ed522f9abb78475d335be78","name":"Refactor colors to use theme object","idShort":34,"shortLink":"MokJZ3op"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T08:21:05.635Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb51f04021062070740f0b","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":262144},"card":{"pos":286720,"id":"5ed522f9abb78475d335be78","name":"Refactor colors to use theme object","idShort":34,"shortLink":"MokJZ3op"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T08:21:04.153Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb51e5b573c0775f859383","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":229376},"card":{"pos":303104,"id":"5ed80bd9693ee510885fc15c","name":"Project favorites","idShort":43,"shortLink":"fSF4Ds9h"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T08:20:53.703Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb51c3984b7489ab142131","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":206336},"card":{"pos":193024,"id":"5e9e38d28f035d40b2711917","name":"Add team creation","idShort":31,"shortLink":"N4xFvhYD"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T08:20:19.925Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb32b3dfb08d2cbab1f913","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":425984},"card":{"pos":270336,"id":"5ed80be82f0619028ac97ecc","name":"Change project team","idShort":44,"shortLink":"kD4HotdC"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T06:07:47.097Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb32b15f29b97e7e4ce956","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":442368},"card":{"pos":278528,"id":"5ed80bee5c47473f2adb230e","name":"Delete project","idShort":45,"shortLink":"MpVDMIJm"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T06:07:45.213Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb32a4bee2674568e58e6c","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":458752},"card":{"pos":221184,"id":"5edb3279e70c2556f441cea7","name":"Add checklists","idShort":50,"shortLink":"ycZhpt00"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T06:07:32.186Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb32a08f0a2a4c141ef573","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":393216},"card":{"pos":237568,"id":"5ed80bcbcf1eae6cf3b6cc9e","name":"Project switcher","idShort":42,"shortLink":"ZrEWrr8n"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T06:07:28.335Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb329b04fb9b70ef24baf8","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":146432},"card":{"pos":229376,"id":"5ed80bd9693ee510885fc15c","name":"Project favorites","idShort":43,"shortLink":"fSF4Ds9h"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T06:07:23.807Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb32917bd6e284455dd3d7","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":409600},"card":{"pos":146432,"id":"5ed80bd9693ee510885fc15c","name":"Project favorites","idShort":43,"shortLink":"fSF4Ds9h"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T06:07:13.095Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb32894c36b1678c238423","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":278528},"card":{"pos":133120,"id":"5ed5231de2583f18473d0984","name":"Allow projects to be personal","idShort":35,"shortLink":"73OWLQv2"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T06:07:05.093Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb3279e70c2556f441ceaa","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5edb3279e70c2556f441cea7","name":"Add checklists","idShort":50,"shortLink":"ycZhpt00"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-06T06:06:49.182Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb3279e70c2556f441cea8","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5edb3279e70c2556f441cea7","name":"Add checklists","idShort":50,"shortLink":"ycZhpt00"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T06:06:49.152Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb326d20196d4e5cfe0828","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":229376},"card":{"pos":206336,"id":"5e9e38d28f035d40b2711917","name":"Add team creation","idShort":31,"shortLink":"N4xFvhYD"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T06:06:37.644Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb3267974f334e45ff35e3","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":376832},"card":{"pos":199680,"id":"5ed8098066f27d6c0e3c36fa","name":"Project user management","idShort":41,"shortLink":"rqQvInlv"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T06:06:31.913Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb3260c8ee8f8f1363dc4d","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":458752},"card":{"pos":186368,"id":"5edb325b1d2742576b91b3ee","name":"Manage users","idShort":49,"shortLink":"zWXqX889"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T06:06:24.749Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb325b1d2742576b91b3f1","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5edb325b1d2742576b91b3ee","name":"Manage users","idShort":49,"shortLink":"zWXqX889"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-06T06:06:19.271Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb325b1d2742576b91b3ef","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5edb325b1d2742576b91b3ee","name":"Manage users","idShort":49,"shortLink":"zWXqX889"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T06:06:19.242Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb324f418d015b2357550d","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"name":"Add user creation"},"card":{"name":"Admin console","id":"5ed8097762a37b5adbfb5947","idShort":40,"shortLink":"KIZrLw8H"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T06:06:07.906Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb3249ccce6c5ea310b34a","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":360448},"card":{"pos":159744,"id":"5ed8097762a37b5adbfb5947","name":"Add user creation","idShort":40,"shortLink":"KIZrLw8H"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T06:06:01.520Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5edb324474bab94868c952da","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":458752},"card":{"pos":106496,"id":"5ed80cd925dc470f9e01c5b8","name":"User profile image","idShort":48,"shortLink":"C8tmNe8w"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-06T06:05:56.553Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed8139d9208a91570f4097b","idMemberCreator":"55642875ac2f713188495fc7","data":{"attachment":{"id":"5ed8139d9208a91570f4097a","name":"undraw_access_account_99n5.svg","url":"https://trello-attachments.s3.amazonaws.com/5cd4b4281203593b4b18a94d/5e4e10dbc6cf736df3db165e/6e83232946b3a8a7e9dfcbde060eda58/undraw_access_account_99n5.svg"},"card":{"id":"5e4e10dbc6cf736df3db165e","name":"Setup sqlc","idShort":17,"shortLink":"G5BWtqrA"},"list":{"id":"5e8fee0a6929af2165f46268","name":"Complete"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"addAttachmentToCard","date":"2020-06-03T21:18:21.907Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed81101f84f3247ce8ca997","idMemberCreator":"55642875ac2f713188495fc7","data":{"attachment":{"id":"5ed81100f84f3247ce8ca993","name":"undraw_no_data_qbuo.min.svg","url":"https://trello-attachments.s3.amazonaws.com/5cd4b4281203593b4b18a94d/5e4e10dbc6cf736df3db165e/2032ef5296c39987b5e7ba934f0dadd8/undraw_no_data_qbuo.min.svg"},"card":{"id":"5e4e10dbc6cf736df3db165e","name":"Setup sqlc","idShort":17,"shortLink":"G5BWtqrA"},"list":{"id":"5e8fee0a6929af2165f46268","name":"Complete"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"addAttachmentToCard","date":"2020-06-03T21:07:13.169Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80ce93a3d010bdd8dd93f","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"name":"User profile"},"card":{"name":"User profile image","id":"5ed80cd925dc470f9e01c5b8","idShort":48,"shortLink":"C8tmNe8w"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-03T20:49:45.768Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80cd925dc470f9e01c5bc","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed80cd925dc470f9e01c5b8","name":"User profile","idShort":48,"shortLink":"C8tmNe8w"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-03T20:49:29.184Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80cd925dc470f9e01c5b9","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5ed80cd925dc470f9e01c5b8","name":"User profile","idShort":48,"shortLink":"C8tmNe8w"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-03T20:49:29.139Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80cc143b0ff3db530ea59","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed80cc143b0ff3db530ea56","name":"Image covers","idShort":47,"shortLink":"dHDjvlro"},"list":{"id":"5ed80cb9b6906d6bbfce96b9","name":"Possible features"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-03T20:49:05.548Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80cc143b0ff3db530ea57","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5ed80cc143b0ff3db530ea56","name":"Image covers","idShort":47,"shortLink":"dHDjvlro"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5ed80cb9b6906d6bbfce96b9","name":"Possible features"}},"type":"updateCard","date":"2020-06-03T20:49:05.521Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80cbeab74126d681ba2f5","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed80cbeab74126d681ba2ef","name":"Card colors","idShort":46,"shortLink":"mLKvrBp9"},"list":{"id":"5ed80cb9b6906d6bbfce96b9","name":"Possible features"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-03T20:49:02.096Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80cbeab74126d681ba2f0","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5ed80cbeab74126d681ba2ef","name":"Card colors","idShort":46,"shortLink":"mLKvrBp9"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5ed80cb9b6906d6bbfce96b9","name":"Possible features"}},"type":"updateCard","date":"2020-06-03T20:49:02.059Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80cb9b6906d6bbfce96bb","idMemberCreator":"55642875ac2f713188495fc7","data":{"list":{"id":"5ed80cb9b6906d6bbfce96b9","name":"Possible features"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createList","date":"2020-06-03T20:48:57.380Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80c4bd1579a6d459bad29","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed8094a3ecb5e248bec0848","name":"Real time updates","idShort":39,"shortLink":"UA9RPc3u"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"checklist":{"id":"5ed80c47aaaef0624b9894c0","name":"Checklist"}},"type":"removeChecklistFromCard","date":"2020-06-03T20:47:07.799Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80c47aaaef0624b9894c2","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed8094a3ecb5e248bec0848","name":"Real time updates","idShort":39,"shortLink":"UA9RPc3u"},"checklist":{"id":"5ed80c47aaaef0624b9894c0","name":"Checklist"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"addChecklistToCard","date":"2020-06-03T20:47:03.362Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80bee5c47473f2adb2311","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed80bee5c47473f2adb230e","name":"Delete project","idShort":45,"shortLink":"MpVDMIJm"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-03T20:45:34.380Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80bee5c47473f2adb230f","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5ed80bee5c47473f2adb230e","name":"Delete project","idShort":45,"shortLink":"MpVDMIJm"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-03T20:45:34.338Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80be82f0619028ac97ecf","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed80be82f0619028ac97ecc","name":"Change project team","idShort":44,"shortLink":"kD4HotdC"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-03T20:45:28.621Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80be82f0619028ac97ecd","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5ed80be82f0619028ac97ecc","name":"Change project team","idShort":44,"shortLink":"kD4HotdC"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-03T20:45:28.599Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80bda693ee510885fc15f","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed80bd9693ee510885fc15c","name":"Project favorites","idShort":43,"shortLink":"fSF4Ds9h"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-03T20:45:14.043Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80bda693ee510885fc15d","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5ed80bd9693ee510885fc15c","name":"Project favorites","idShort":43,"shortLink":"fSF4Ds9h"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-03T20:45:14.019Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80bcbcf1eae6cf3b6cca1","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed80bcbcf1eae6cf3b6cc9e","name":"Project switcher","idShort":42,"shortLink":"ZrEWrr8n"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-03T20:44:59.550Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80bcbcf1eae6cf3b6cc9f","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5ed80bcbcf1eae6cf3b6cc9e","name":"Project switcher","idShort":42,"shortLink":"ZrEWrr8n"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-03T20:44:59.527Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80a313ebcb67315a8eb48","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"name":"Project invites"},"card":{"name":"Project user management","id":"5ed8098066f27d6c0e3c36fa","idShort":41,"shortLink":"rqQvInlv"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-03T20:38:09.767Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed8098066f27d6c0e3c36fd","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed8098066f27d6c0e3c36fa","name":"Project invites","idShort":41,"shortLink":"rqQvInlv"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-03T20:35:12.492Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed8098066f27d6c0e3c36fb","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5ed8098066f27d6c0e3c36fa","name":"Project invites","idShort":41,"shortLink":"rqQvInlv"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-03T20:35:12.471Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed8097762a37b5adbfb594b","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed8097762a37b5adbfb5947","name":"Add user creation","idShort":40,"shortLink":"KIZrLw8H"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-03T20:35:03.300Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed8097762a37b5adbfb5948","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5ed8097762a37b5adbfb5947","name":"Add user creation","idShort":40,"shortLink":"KIZrLw8H"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-03T20:35:03.267Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed8094c0820e8522a80ff61","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed8094a3ecb5e248bec0848","name":"Real time updates","idShort":39,"shortLink":"UA9RPc3u"},"checklist":{"id":"5ed8094c0820e8522a80ff5f","name":"Checklist"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"addChecklistToCard","date":"2020-06-03T20:34:20.600Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed8094a3ecb5e248bec084b","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed8094a3ecb5e248bec0848","name":"Real time updates","idShort":39,"shortLink":"UA9RPc3u"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-03T20:34:18.442Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed8094a3ecb5e248bec0849","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5ed8094a3ecb5e248bec0848","name":"Real time updates","idShort":39,"shortLink":"UA9RPc3u"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-03T20:34:18.420Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80945ebef49792ffc8074","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed80945ebef49792ffc8071","name":"Notification system","idShort":38,"shortLink":"ICj6IQeI"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-03T20:34:13.813Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed80945ebef49792ffc8072","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5ed80945ebef49792ffc8071","name":"Notification system","idShort":38,"shortLink":"ICj6IQeI"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-03T20:34:13.789Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed7fd98371d32159dddc14e","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed7fd98371d32159dddc14a","name":"Add list tab","idShort":37,"shortLink":"v3SCvCjx"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-03T19:44:24.650Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed7fd98371d32159dddc14b","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5ed7fd98371d32159dddc14a","name":"Add list tab","idShort":37,"shortLink":"v3SCvCjx"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-03T19:44:24.619Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed7fd96e8f3ab69b8e73331","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed7fd96e8f3ab69b8e7332e","name":"Add calendar tab","idShort":36,"shortLink":"QBZmXmHz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-03T19:44:22.237Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed7fd96e8f3ab69b8e7332f","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5ed7fd96e8f3ab69b8e7332e","name":"Add calendar tab","idShort":36,"shortLink":"QBZmXmHz"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-03T19:44:22.210Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed5231de2583f18473d0987","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed5231de2583f18473d0984","name":"Allow projects to be personal","idShort":35,"shortLink":"73OWLQv2"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-01T15:47:41.995Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed5231de2583f18473d0985","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5ed5231de2583f18473d0984","name":"Allow projects to be personal","idShort":35,"shortLink":"73OWLQv2"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-01T15:47:41.969Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed522f9abb78475d335be7b","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed522f9abb78475d335be78","name":"Refactor colors to use theme object","idShort":34,"shortLink":"MokJZ3op"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-01T15:47:05.485Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed522f9abb78475d335be79","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5ed522f9abb78475d335be78","name":"Refactor colors to use theme object","idShort":34,"shortLink":"MokJZ3op"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-01T15:47:05.461Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed522eb474caf8b0c88c205","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5ed522eb474caf8b0c88c201","name":"Refactor cards into single component","idShort":33,"shortLink":"sxpapv6h"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-06-01T15:46:51.623Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed522eb474caf8b0c88c202","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5ed522eb474caf8b0c88c201","name":"Refactor cards into single component","idShort":33,"shortLink":"sxpapv6h"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-06-01T15:46:51.591Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed522c7f486fe77265df9bb","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":245760},"card":{"pos":20480,"id":"5e9e38d88121a869f68c7c24","name":"Add project creation","idShort":32,"shortLink":"qfSzCNie"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-06-01T15:46:15.978Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed522c7f486fe77265df9b9","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5e8fee0a6929af2165f46268","id":"5e9e38d88121a869f68c7c24","name":"Add project creation","idShort":32,"shortLink":"qfSzCNie"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-06-01T15:46:15.952Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed522c602307666fa682807","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":180224},"card":{"pos":8192,"id":"5e9e38797ccd9b62aa1234d3","name":"Refactor Lists data structure","idShort":26,"shortLink":"c72gKy8G"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-06-01T15:46:14.006Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed522c502307666fa682805","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5e8fee0a6929af2165f46268","id":"5e9e38797ccd9b62aa1234d3","name":"Refactor Lists data structure","idShort":26,"shortLink":"c72gKy8G"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-06-01T15:46:13.967Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed522c4415c5d7d14d489a3","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":188416},"card":{"pos":24576,"id":"5e9e38b487660e6120d61dee","name":"Get assignees to update on lists when changed","idShort":29,"shortLink":"YVnjFT8V"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-06-01T15:46:12.179Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed522c4415c5d7d14d489a1","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5e8fee0a6929af2165f46268","id":"5e9e38b487660e6120d61dee","name":"Get assignees to update on lists when changed","idShort":29,"shortLink":"YVnjFT8V"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-06-01T15:46:12.154Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed522c2c3436c6b20dc9378","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":196608},"card":{"pos":36864,"id":"5e9e389e53dac53a9f9f999d","name":"Add task labels","idShort":27,"shortLink":"bct4Mo7m"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-06-01T15:46:10.556Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed522c2c3436c6b20dc9376","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5e8fee0a6929af2165f46268","id":"5e9e389e53dac53a9f9f999d","name":"Add task labels","idShort":27,"shortLink":"bct4Mo7m"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-06-01T15:46:10.532Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed522be6d7258754d10ad19","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":192512},"card":{"pos":40960,"id":"5e9e38c9c35ac446a3fcb6ed","name":"Add project tasks","idShort":30,"shortLink":"oVRLd9kz"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-06-01T15:46:06.146Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5ed522be6d7258754d10ad17","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5e8fee0a6929af2165f46268","id":"5e9e38c9c35ac446a3fcb6ed","name":"Add project tasks","idShort":30,"shortLink":"oVRLd9kz"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-06-01T15:46:06.113Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e38d88121a869f68c7c27","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e9e38d88121a869f68c7c24","name":"Add project creation","idShort":32,"shortLink":"qfSzCNie"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-04-21T00:05:44.406Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e38d88121a869f68c7c25","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e9e38d88121a869f68c7c24","name":"Add project creation","idShort":32,"shortLink":"qfSzCNie"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:05:44.382Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e38d28f035d40b271191a","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e9e38d28f035d40b2711917","name":"Add team creation","idShort":31,"shortLink":"N4xFvhYD"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-04-21T00:05:38.247Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e38d28f035d40b2711918","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e9e38d28f035d40b2711917","name":"Add team creation","idShort":31,"shortLink":"N4xFvhYD"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:05:38.215Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e38cb0698a18ad5c39aae","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":229376},"card":{"pos":192512,"id":"5e9e38c9c35ac446a3fcb6ed","name":"Add project tasks","idShort":30,"shortLink":"oVRLd9kz"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:05:31.659Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e38c9c35ac446a3fcb6f0","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e9e38c9c35ac446a3fcb6ed","name":"Add project tasks","idShort":30,"shortLink":"oVRLd9kz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-04-21T00:05:29.694Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e38c9c35ac446a3fcb6ee","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e9e38c9c35ac446a3fcb6ed","name":"Add project tasks","idShort":30,"shortLink":"oVRLd9kz"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:05:29.671Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e38b7783ada33d376c921","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":229376},"card":{"pos":188416,"id":"5e9e38b487660e6120d61dee","name":"Get assignees to update on lists when changed","idShort":29,"shortLink":"YVnjFT8V"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:05:11.987Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e38b487660e6120d61df1","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e9e38b487660e6120d61dee","name":"Get assignees to update on lists when changed","idShort":29,"shortLink":"YVnjFT8V"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-04-21T00:05:08.297Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e38b487660e6120d61def","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e9e38b487660e6120d61dee","name":"Get assignees to update on lists when changed","idShort":29,"shortLink":"YVnjFT8V"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:05:08.268Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e38a2e24185886fc950ca","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e9e38a2e24185886fc950c7","name":"Add task due date","idShort":28,"shortLink":"wCma0VqF"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-04-21T00:04:50.581Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e38a2e24185886fc950c8","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e9e38a2e24185886fc950c7","name":"Add task due date","idShort":28,"shortLink":"wCma0VqF"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:04:50.555Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e389e53dac53a9f9f99a0","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e9e389e53dac53a9f9f999d","name":"Add task labels","idShort":27,"shortLink":"bct4Mo7m"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-04-21T00:04:46.056Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e389e53dac53a9f9f999e","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e9e389e53dac53a9f9f999d","name":"Add task labels","idShort":27,"shortLink":"bct4Mo7m"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:04:46.029Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e3892ab27dd63c45bb389","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"card":{"closed":true,"id":"5e92035480a07e8d24c439dd","name":"Optimistic updates for list creation, deletion, and updates","idShort":25,"shortLink":"LgN7ZbB5"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:04:34.797Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e3891ceb1313ab28bcb39","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"card":{"closed":true,"id":"5e9203421b2dd46f0c253188","name":"Optimistic ui updates for card creation, deletion, and updates","idShort":24,"shortLink":"GSHTwvh7"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:04:33.635Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e388f0967884b13fe40cb","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"card":{"closed":true,"id":"5e8fee47134e6987492c398c","name":"Add skeleton ui while loading","idShort":23,"shortLink":"2WBclQQw"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:04:31.390Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e388b18611d479f8a2853","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"card":{"closed":true,"id":"5e44c7bd94d5ea5d1ed58b85","name":"Kanban board tasks","idShort":13,"shortLink":"DAEdI4Ng"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:04:27.528Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e388a6f66aa809df81960","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"card":{"closed":true,"id":"5e44c79ddc1e680d8a4e566c","name":"Project management","idShort":11,"shortLink":"6KBWilvJ"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:04:26.293Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e38886b8e5433cfb61546","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"card":{"closed":true,"id":"5e44c798946dde2414d2d239","name":"Ability to add teams","idShort":10,"shortLink":"SamycMpq"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:04:24.988Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e38879de91f688a7984c7","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"card":{"closed":true,"id":"5e44c793b372d216dd03fada","name":"Ability to add users","idShort":9,"shortLink":"PKTkQDPr"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:04:23.371Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e3883125b81285697dd34","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":36864},"card":{"pos":43008,"id":"5e44c793b372d216dd03fada","name":"Ability to add users","idShort":9,"shortLink":"PKTkQDPr"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:04:19.911Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e3881986d2e6a340933fa","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":24576},"card":{"pos":36864,"id":"5e44c793b372d216dd03fada","name":"Ability to add users","idShort":9,"shortLink":"PKTkQDPr"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:04:17.876Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e38797ccd9b62aa1234d6","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e9e38797ccd9b62aa1234d3","name":"Refactor Lists data structure","idShort":26,"shortLink":"c72gKy8G"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-04-21T00:04:09.382Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e38797ccd9b62aa1234d4","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e9e38797ccd9b62aa1234d3","name":"Refactor Lists data structure","idShort":26,"shortLink":"c72gKy8G"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-21T00:04:09.349Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e385d255845477dda71fd","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":114688},"card":{"pos":131072,"id":"5e8fee3f02133c1b26d112d8","name":"Refactor react router layout","idShort":22,"shortLink":"CbHWnkxL"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-04-21T00:03:41.205Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e385d255845477dda71fb","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5e8fee0a6929af2165f46268","id":"5e8fee3f02133c1b26d112d8","name":"Refactor react router layout","idShort":22,"shortLink":"CbHWnkxL"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-04-21T00:03:41.178Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e385972b6187160a34e06","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"card":{"id":"5e44c7bd94d5ea5d1ed58b85","name":"Kanban board tasks","idShort":13,"shortLink":"DAEdI4Ng"},"checklist":{"id":"5e44c7c0681a7a0fc5d898c7","name":"Checklist"},"checkItem":{"id":"5e44c7ce0df8155ba7f2fac7","name":"Assignees","state":"complete"}},"type":"updateCheckItemStateOnCard","date":"2020-04-21T00:03:37.863Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9e38591dddfe1849e5a1ca","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"card":{"id":"5e44c7bd94d5ea5d1ed58b85","name":"Kanban board tasks","idShort":13,"shortLink":"DAEdI4Ng"},"checklist":{"id":"5e44c7c0681a7a0fc5d898c7","name":"Checklist"},"checkItem":{"id":"5e44c7c6260b3918dd44867e","name":"Description","state":"complete"}},"type":"updateCheckItemStateOnCard","date":"2020-04-21T00:03:37.154Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e92049e7ff4997e354fab75","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"name":"Ability to add projects"},"card":{"name":"Project management","id":"5e44c79ddc1e680d8a4e566c","idShort":11,"shortLink":"6KBWilvJ"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-11T17:55:42.449Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e92049e4f53b778d25dfd60","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e44c79ddc1e680d8a4e566c","name":"Ability to add projects","idShort":11,"shortLink":"6KBWilvJ"},"checklist":{"id":"5e92049e4f53b778d25dfd5e","name":"Checklist"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"addChecklistToCard","date":"2020-04-11T17:55:42.226Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e92035480a07e8d24c439e0","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e92035480a07e8d24c439dd","name":"Optimistic updates for list creation, deletion, and updates","idShort":25,"shortLink":"LgN7ZbB5"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-04-11T17:50:12.253Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e92035480a07e8d24c439de","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e92035480a07e8d24c439dd","name":"Optimistic updates for list creation, deletion, and updates","idShort":25,"shortLink":"LgN7ZbB5"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-11T17:50:12.231Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9203421b2dd46f0c25318b","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e9203421b2dd46f0c253188","name":"Optimistic ui updates for card creation, deletion, and updates","idShort":24,"shortLink":"GSHTwvh7"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-04-11T17:49:54.938Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9203421b2dd46f0c253189","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e9203421b2dd46f0c253188","name":"Optimistic ui updates for card creation, deletion, and updates","idShort":24,"shortLink":"GSHTwvh7"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-11T17:49:54.913Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9203229d3ee434a3bbad1c","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"desc":"asdasdasdasdasdasdasdajjdasdkasdalksdjlasjdlakjsdlasjdlkajsdlajsdjaslkdjalsdjalksjdlaskjdalsjdalksjdalskjdalsjdalsjdlaskdalsdjalskdjalsjdlasjdlaskdjasdasdasd\n"},"card":{"desc":"","id":"5e44c793b372d216dd03fada","name":"Ability to add users","idShort":9,"shortLink":"PKTkQDPr"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-11T17:49:22.521Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9203121e06dc4fc5d4934d","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":81920},"card":{"pos":114688,"id":"5e44c7a71302ac65351673f9","name":"Kanban board for projects","idShort":12,"shortLink":"JUHkJPyf"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-04-11T17:49:06.126Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e9203121e06dc4fc5d4934b","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5e8fee0a6929af2165f46268","id":"5e44c7a71302ac65351673f9","name":"Kanban board for projects","idShort":12,"shortLink":"JUHkJPyf"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-04-11T17:49:06.092Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e90e8aca2c14c5dea8d8671","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"prefs":{"background":"sky"}},"board":{"prefs":{"background":"grey"},"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateBoard","date":"2020-04-10T21:44:12.886Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e90e8acf273e57361e9a36d","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"prefs":{"background":"pink"}},"board":{"prefs":{"background":"sky"},"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateBoard","date":"2020-04-10T21:44:12.267Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e90e8ab416ce95e97f6eb2a","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"prefs":{"background":"lime"}},"board":{"prefs":{"background":"pink"},"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateBoard","date":"2020-04-10T21:44:11.762Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e90e8abf6a5cf0ed139ff83","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"prefs":{"background":"grey"}},"board":{"prefs":{"background":"lime"},"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateBoard","date":"2020-04-10T21:44:11.196Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e90e8a3c64ea83f65f4383d","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"prefs":{"background":"5ca500df0ac627319cd9a2cf"}},"board":{"prefs":{"background":"grey"},"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateBoard","date":"2020-04-10T21:44:03.957Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e90e7cb2f512a4f8ceccfff","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"list":{"closed":true,"id":"5e90e7ad7987ff83a09f1483","name":"a"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateList","date":"2020-04-10T21:40:27.962Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e90e7ad7987ff83a09f1489","idMemberCreator":"55642875ac2f713188495fc7","data":{"list":{"id":"5e90e7ad7987ff83a09f1483","name":"a"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createList","date":"2020-04-10T21:39:57.476Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e90c0398ef78316f0614c4b","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"desc":"asdasdasdasdasggasd"},"card":{"desc":"asdasdasdasdasdasdasdajjdasdkasdalksdjlasjdlakjsdlasjdlkajsdlajsdjaslkdjalsdjalksjdlaskjdalsjdalksjdalskjdalsjdalsjdlaskdalsdjalskdjalsjdlasjdlaskdjasdasdasd\n","id":"5e44c793b372d216dd03fada","name":"Ability to add users","idShort":9,"shortLink":"PKTkQDPr"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-10T18:51:37.801Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e90b8832c578d1897a693b9","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"desc":"asdasdasd\n\n\n"},"card":{"desc":"asdasdasdasdasggasd","id":"5e44c793b372d216dd03fada","name":"Ability to add users","idShort":9,"shortLink":"PKTkQDPr"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-10T18:18:43.417Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e90b87fafccb71770da4bce","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"desc":"asdasdasd"},"card":{"desc":"asdasdasd\n\n\n","id":"5e44c793b372d216dd03fada","name":"Ability to add users","idShort":9,"shortLink":"PKTkQDPr"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-10T18:18:39.834Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e90b65af1091918353546b1","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"desc":""},"card":{"desc":"asdasdasd","id":"5e44c793b372d216dd03fada","name":"Ability to add users","idShort":9,"shortLink":"PKTkQDPr"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-10T18:09:30.897Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e90b119ebbccc2eda8e19a1","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"desc":"jdaklsdasdasdasdasda"},"card":{"desc":"","id":"5e44c793b372d216dd03fada","name":"Ability to add users","idShort":9,"shortLink":"PKTkQDPr"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-10T17:47:05.732Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e90b10093dc520df9e4225f","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"desc":""},"card":{"desc":"jdaklsdasdasdasdasda","id":"5e44c793b372d216dd03fada","name":"Ability to add users","idShort":9,"shortLink":"PKTkQDPr"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-10T17:46:40.734Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e90a89aa96a094ec3664add","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"due":null},"card":{"due":"2020-04-20T17:10:00.000Z","id":"5e44c793b372d216dd03fada","name":"Ability to add users","idShort":9,"shortLink":"PKTkQDPr"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-10T17:10:50.771Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e90a79c66847534a47804c2","idMemberCreator":"55642875ac2f713188495fc7","data":{"idMember":"55642875ac2f713188495fc7","card":{"id":"5e44c793b372d216dd03fada","name":"Ability to add users","idShort":9,"shortLink":"PKTkQDPr"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"member":{"id":"55642875ac2f713188495fc7","name":"Jordan Knott"}},"type":"addMemberToCard","date":"2020-04-10T17:06:36.472Z","limits":{},"member":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee47134e6987492c398f","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e8fee47134e6987492c398c","name":"Add skeleton ui while loading","idShort":23,"shortLink":"2WBclQQw"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-04-10T03:55:51.523Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee47134e6987492c398d","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e8fee47134e6987492c398c","name":"Add skeleton ui while loading","idShort":23,"shortLink":"2WBclQQw"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-10T03:55:51.500Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee4002133c1b26d112db","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e8fee3f02133c1b26d112d8","name":"Refactor react router layout","idShort":22,"shortLink":"CbHWnkxL"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-04-10T03:55:44.030Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee4002133c1b26d112d9","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e8fee3f02133c1b26d112d8","name":"Refactor react router layout","idShort":22,"shortLink":"CbHWnkxL"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-10T03:55:44.004Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee2cdaf9b44a237f1a09","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":229376},"card":{"pos":98304,"id":"5e4f6f6aa1d02f4bd2e383f0","name":"Setup graphql code gen","idShort":21,"shortLink":"CFL4DG25"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-04-10T03:55:24.387Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee2cdaf9b44a237f1a07","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5e8fee0a6929af2165f46268","id":"5e4f6f6aa1d02f4bd2e383f0","name":"Setup graphql code gen","idShort":21,"shortLink":"CFL4DG25"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-04-10T03:55:24.352Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee2ad4b91b17f7ac9c08","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":212992},"card":{"pos":81920,"id":"5e4f6f63356b1a83e9726565","name":"Convert to typescript","idShort":20,"shortLink":"ypwmMs6H"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-04-10T03:55:22.322Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee2ad4b91b17f7ac9c06","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5e8fee0a6929af2165f46268","id":"5e4f6f63356b1a83e9726565","name":"Convert to typescript","idShort":20,"shortLink":"ypwmMs6H"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-04-10T03:55:22.297Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee287f3f1c09b76aa252","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":196608},"card":{"pos":65536,"id":"5e4f6f5bdbdbc13c9b2acf35","name":"Setup silent refresh","idShort":19,"shortLink":"6Pd7SuQq"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-04-10T03:55:20.187Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee287f3f1c09b76aa250","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5e8fee0a6929af2165f46268","id":"5e4f6f5bdbdbc13c9b2acf35","name":"Setup silent refresh","idShort":19,"shortLink":"6Pd7SuQq"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-04-10T03:55:20.161Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee2645c4d24fbe756724","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":180224},"card":{"pos":49152,"id":"5e4e10eda043d40c3d66f055","name":"Add api key for __graphql","idShort":18,"shortLink":"010DMyE3"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-04-10T03:55:18.132Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee2645c4d24fbe756722","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5e8fee0a6929af2165f46268","id":"5e4e10eda043d40c3d66f055","name":"Add api key for __graphql","idShort":18,"shortLink":"010DMyE3"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-04-10T03:55:18.107Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee237e58847a4a2e1870","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":155648},"card":{"pos":32768,"id":"5e4e10dbc6cf736df3db165e","name":"Setup sqlc","idShort":17,"shortLink":"G5BWtqrA"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-04-10T03:55:15.474Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee237e58847a4a2e186e","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5e8fee0a6929af2165f46268","id":"5e4e10dbc6cf736df3db165e","name":"Setup sqlc","idShort":17,"shortLink":"G5BWtqrA"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-04-10T03:55:15.449Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee1b1c07ff861c4158a0","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"card":{"id":"5e44c7bd94d5ea5d1ed58b85","name":"Kanban board tasks","idShort":13,"shortLink":"DAEdI4Ng"},"checklist":{"id":"5e44c7c0681a7a0fc5d898c7","name":"Checklist"},"checkItem":{"id":"5e44c8024d5db7736cc4ec00","name":"Archivable","state":"complete"}},"type":"updateCheckItemStateOnCard","date":"2020-04-10T03:55:07.352Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee1bb24eb487c73017fa","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"card":{"id":"5e44c7bd94d5ea5d1ed58b85","name":"Kanban board tasks","idShort":13,"shortLink":"DAEdI4Ng"},"checklist":{"id":"5e44c7c0681a7a0fc5d898c7","name":"Checklist"},"checkItem":{"id":"5e44c7ef54cd6e4fef963eda","name":"Title","state":"complete"}},"type":"updateCheckItemStateOnCard","date":"2020-04-10T03:55:07.088Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee13232c6683403d4ca4","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":32768},"card":{"pos":24576,"id":"5e44c793b372d216dd03fada","name":"Ability to add users","idShort":9,"shortLink":"PKTkQDPr"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-10T03:54:59.108Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee13232c6683403d4ca2","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e8fee0a6929af2165f46268"},"card":{"idList":"5e44c76e90700918899276fb","id":"5e44c793b372d216dd03fada","name":"Ability to add users","idShort":9,"shortLink":"PKTkQDPr"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e8fee0a6929af2165f46268","name":"Complete"},"listAfter":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-04-10T03:54:59.081Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee0f4c83198317d9f372","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5e8fee0a6929af2165f46268","id":"5e44c793b372d216dd03fada","name":"Ability to add users","idShort":9,"shortLink":"PKTkQDPr"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-04-10T03:54:55.662Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee0d2783b7827f4dee1e","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"idList":"5e44c76e90700918899276fb"},"card":{"idList":"5e8fee0a6929af2165f46268","id":"5e44c77a78670f1251f737aa","name":"Login Screen (authentication framework)","idShort":8,"shortLink":"bKdufEVZ"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"listBefore":{"id":"5e44c76e90700918899276fb","name":"MVP"},"listAfter":{"id":"5e8fee0a6929af2165f46268","name":"Complete"}},"type":"updateCard","date":"2020-04-10T03:54:53.421Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e8fee0a6929af2165f4626a","idMemberCreator":"55642875ac2f713188495fc7","data":{"list":{"id":"5e8fee0a6929af2165f46268","name":"Complete"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createList","date":"2020-04-10T03:54:50.292Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4f6f6aa1d02f4bd2e383f3","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e4f6f6aa1d02f4bd2e383f0","name":"Setup graphql code gen","idShort":21,"shortLink":"CFL4DG25"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-02-21T05:49:30.201Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4f6f6aa1d02f4bd2e383f1","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e4f6f6aa1d02f4bd2e383f0","name":"Setup graphql code gen","idShort":21,"shortLink":"CFL4DG25"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-21T05:49:30.172Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4f6f63356b1a83e9726568","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e4f6f63356b1a83e9726565","name":"Convert to typescript","idShort":20,"shortLink":"ypwmMs6H"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-02-21T05:49:23.242Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4f6f63356b1a83e9726566","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e4f6f63356b1a83e9726565","name":"Convert to typescript","idShort":20,"shortLink":"ypwmMs6H"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-21T05:49:23.214Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4f6f5bdbdbc13c9b2acf39","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e4f6f5bdbdbc13c9b2acf35","name":"Setup silent refresh","idShort":19,"shortLink":"6Pd7SuQq"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-02-21T05:49:15.255Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4f6f5bdbdbc13c9b2acf36","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e4f6f5bdbdbc13c9b2acf35","name":"Setup silent refresh","idShort":19,"shortLink":"6Pd7SuQq"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-21T05:49:15.221Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4f6f4c72bba083b1aff39a","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"card":{"closed":true,"id":"5e4e10c111c45c671a8bbedf","name":"Setup Apollo client","idShort":14,"shortLink":"WdtXHd18"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-21T05:49:00.292Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4f6f480ad71a78fdfdc494","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"card":{"closed":true,"id":"5e4e10d71bf47757f1b235fb","name":"Setup user database and schema","idShort":16,"shortLink":"MCILOAsW"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-21T05:48:56.809Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4f6f4754585255d032c775","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":163840},"card":{"pos":155648,"id":"5e4e10dbc6cf736df3db165e","name":"Setup sqlc","idShort":17,"shortLink":"G5BWtqrA"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-21T05:48:55.271Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4f6f4494a4fd79e6363c3a","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"card":{"closed":true,"id":"5e4e10c6f8a6c16e795370ea","name":"Setup react router","idShort":15,"shortLink":"0GXOHETg"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-21T05:48:52.656Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4f6f414bb78f625a521c76","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"pos":131072},"card":{"pos":155648,"id":"5e4e10c6f8a6c16e795370ea","name":"Setup react router","idShort":15,"shortLink":"0GXOHETg"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-21T05:48:49.790Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4e10eea043d40c3d66f059","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e4e10eda043d40c3d66f055","name":"Add api key for __graphql","idShort":18,"shortLink":"010DMyE3"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-02-20T04:54:06.006Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4e10eda043d40c3d66f056","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e4e10eda043d40c3d66f055","name":"Add api key for __graphql","idShort":18,"shortLink":"010DMyE3"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-20T04:54:05.972Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4e10dbc6cf736df3db1661","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e4e10dbc6cf736df3db165e","name":"Setup sqlc","idShort":17,"shortLink":"G5BWtqrA"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-02-20T04:53:47.472Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4e10dbc6cf736df3db165f","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e4e10dbc6cf736df3db165e","name":"Setup sqlc","idShort":17,"shortLink":"G5BWtqrA"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-20T04:53:47.441Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4e10d71bf47757f1b235fe","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e4e10d71bf47757f1b235fb","name":"Setup user database and schema","idShort":16,"shortLink":"MCILOAsW"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-02-20T04:53:43.785Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4e10d71bf47757f1b235fc","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e4e10d71bf47757f1b235fb","name":"Setup user database and schema","idShort":16,"shortLink":"MCILOAsW"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-20T04:53:43.761Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4e10c6f8a6c16e795370ed","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e4e10c6f8a6c16e795370ea","name":"Setup react router","idShort":15,"shortLink":"0GXOHETg"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-02-20T04:53:26.276Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4e10c6f8a6c16e795370eb","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e4e10c6f8a6c16e795370ea","name":"Setup react router","idShort":15,"shortLink":"0GXOHETg"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-20T04:53:26.247Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4e10c111c45c671a8bbee3","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e4e10c111c45c671a8bbedf","name":"Setup Apollo client","idShort":14,"shortLink":"WdtXHd18"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-02-20T04:53:21.092Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e4e10c111c45c671a8bbee0","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e4e10c111c45c671a8bbedf","name":"Setup Apollo client","idShort":14,"shortLink":"WdtXHd18"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-20T04:53:21.053Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c7c0681a7a0fc5d898c9","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e44c7bd94d5ea5d1ed58b85","name":"Kanban board tasks","idShort":13,"shortLink":"DAEdI4Ng"},"checklist":{"id":"5e44c7c0681a7a0fc5d898c7","name":"Checklist"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"addChecklistToCard","date":"2020-02-13T03:51:28.205Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c7bd94d5ea5d1ed58b88","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e44c7bd94d5ea5d1ed58b85","name":"Kanban board tasks","idShort":13,"shortLink":"DAEdI4Ng"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-02-13T03:51:25.318Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c7bd94d5ea5d1ed58b86","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e44c7bd94d5ea5d1ed58b85","name":"Kanban board tasks","idShort":13,"shortLink":"DAEdI4Ng"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-13T03:51:25.293Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c7aacf5d6f316f35a4c1","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e44c7a71302ac65351673f9","name":"Kanban board for projects","idShort":12,"shortLink":"JUHkJPyf"},"checklist":{"id":"5e44c7aacf5d6f316f35a4bf","name":"Checklist"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"addChecklistToCard","date":"2020-02-13T03:51:06.824Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c7a71302ac65351673fc","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e44c7a71302ac65351673f9","name":"Kanban board for projects","idShort":12,"shortLink":"JUHkJPyf"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-02-13T03:51:03.145Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c7a71302ac65351673fa","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e44c7a71302ac65351673f9","name":"Kanban board for projects","idShort":12,"shortLink":"JUHkJPyf"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-13T03:51:03.121Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c79ddc1e680d8a4e5670","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e44c79ddc1e680d8a4e566c","name":"Ability to add projects","idShort":11,"shortLink":"6KBWilvJ"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-02-13T03:50:53.461Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c79ddc1e680d8a4e566d","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e44c79ddc1e680d8a4e566c","name":"Ability to add projects","idShort":11,"shortLink":"6KBWilvJ"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-13T03:50:53.420Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c799946dde2414d2d23c","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e44c798946dde2414d2d239","name":"Ability to add teams","idShort":10,"shortLink":"SamycMpq"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-02-13T03:50:49.004Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c798946dde2414d2d23a","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e44c798946dde2414d2d239","name":"Ability to add teams","idShort":10,"shortLink":"SamycMpq"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-13T03:50:48.978Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c793b372d216dd03fadd","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e44c793b372d216dd03fada","name":"Ability to add users","idShort":9,"shortLink":"PKTkQDPr"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-02-13T03:50:43.996Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c793b372d216dd03fadb","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e44c793b372d216dd03fada","name":"Ability to add users","idShort":9,"shortLink":"PKTkQDPr"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-13T03:50:43.965Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c78c295af40b065e3931","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"name":"Login Screen"},"card":{"name":"Login Screen (authentication framework)","id":"5e44c77a78670f1251f737aa","idShort":8,"shortLink":"bKdufEVZ"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-13T03:50:36.850Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c77a78670f1251f737ad","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5e44c77a78670f1251f737aa","name":"Login Screen","idShort":8,"shortLink":"bKdufEVZ"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createCard","date":"2020-02-13T03:50:18.151Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c77a78670f1251f737ab","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"dueReminder":null},"card":{"dueReminder":-1,"id":"5e44c77a78670f1251f737aa","name":"Login Screen","idShort":8,"shortLink":"bKdufEVZ"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5e44c76e90700918899276fb","name":"MVP"}},"type":"updateCard","date":"2020-02-13T03:50:18.124Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c76e90700918899276fd","idMemberCreator":"55642875ac2f713188495fc7","data":{"list":{"id":"5e44c76e90700918899276fb","name":"MVP"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"createList","date":"2020-02-13T03:50:06.595Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c767a722f25bc9e09cfd","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"list":{"closed":true,"id":"5cd58ddb406e33822e14d20c","name":"Ready for Live"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateList","date":"2020-02-13T03:49:59.260Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c76670bd5e1014663a4b","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"list":{"closed":true,"id":"5cd58dd76dd9c98f289967ab","name":"Needs Tested"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateList","date":"2020-02-13T03:49:58.019Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c7648a4d2e75683fd101","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"list":{"closed":true,"id":"5cd58dc208b043265cc3da49","name":"In Progress"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateList","date":"2020-02-13T03:49:56.080Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c762c6a7b984b88afc4f","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"list":{"closed":true,"id":"5cd58dbbc332358f7a866de2","name":"Develop 1.0.0"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateList","date":"2020-02-13T03:49:54.458Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c7603028ad3fb010570b","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"list":{"closed":true,"id":"5cd58dae0031290a391ce6ea","name":"Base Framework"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateList","date":"2020-02-13T03:49:52.329Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c75ccdbf76548734f42a","idMemberCreator":"55642875ac2f713188495fc7","data":{"card":{"id":"5cd590a0e8a0046d6e100532","idShort":5,"shortLink":"ZaK0PdLa"},"list":{"id":"5cd59079b20b0d05a3b4194b","name":"Resources"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"deleteCard","date":"2020-02-13T03:49:48.541Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c7514ed86f7d9dd88028","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"list":{"closed":true,"id":"5cd58ddde4595e3df2a96f1d","name":"Live"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"}},"type":"updateList","date":"2020-02-13T03:49:37.138Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c7499a15b80f980fc808","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"card":{"closed":true,"id":"5cd5904a289bf730f4000270","name":"Create AuthWithToken middleware","idShort":2,"shortLink":"v9d1kLMz"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5cd58dae0031290a391ce6ea","name":"Base Framework"}},"type":"updateCard","date":"2020-02-13T03:49:29.828Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c7486261c42967d614d5","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"card":{"closed":true,"id":"5cd59041d505c80910c4380e","name":"Create NoAuth middleware","idShort":1,"shortLink":"mp7TnKPL"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5cd58dae0031290a391ce6ea","name":"Base Framework"}},"type":"updateCard","date":"2020-02-13T03:49:28.641Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c747dcf0273094210001","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"card":{"closed":true,"id":"5cd59057f4d7037596e74cdf","name":"Create /auth endpoint","idShort":3,"shortLink":"BR4odK7Y"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5cd58dae0031290a391ce6ea","name":"Base Framework"}},"type":"updateCard","date":"2020-02-13T03:49:27.390Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c74452477875d39b21cd","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"card":{"closed":true,"id":"5cd590666ee2ab57fa12f4d8","name":"Design UML document showing relationship of models","idShort":4,"shortLink":"UaAqZUIc"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5cd58dae0031290a391ce6ea","name":"Base Framework"}},"type":"updateCard","date":"2020-02-13T03:49:24.309Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5e44c741f2eb9783c7b3b1e8","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"closed":false},"card":{"closed":true,"id":"5cd596ada5cdc53a05f96c75","name":"Create feature list","idShort":7,"shortLink":"KYm8XRQ4"},"board":{"id":"5cd4b4281203593b4b18a94d","name":"Project / Citadel","shortLink":"fZa0Bxoz"},"list":{"id":"5cd58dae0031290a391ce6ea","name":"Base Framework"}},"type":"updateCard","date":"2020-02-13T03:49:21.108Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5db8963fe13fca18cd8460f8","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"name":"Project / Clocktower"},"board":{"name":"Project / Citadel","id":"5cd4b4281203593b4b18a94d","shortLink":"fZa0Bxoz"}},"type":"updateBoard","date":"2019-10-29T19:42:55.495Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5d1bc04ed65776562b8cb650","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","id":"5cd4b4281203593b4b18a94d","name":"Project / Clocktower"},"old":{"name":"PERSONAL/OSS - TimeVault"}},"type":"updateBoard","date":"2019-07-02T20:36:30.468Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5d0167e2d1a095648111a3f7","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"name":"OPENSOURCE - TimeVault"},"board":{"name":"PERSONAL/OSS - TimeVault","id":"5cd4b4281203593b4b18a94d","shortLink":"fZa0Bxoz"}},"type":"updateBoard","date":"2019-06-12T21:00:18.916Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5d0167d190c2f12476aea87c","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"name":"OPENSOURCE - GoChrono/TimeVault"},"board":{"name":"OPENSOURCE - TimeVault","id":"5cd4b4281203593b4b18a94d","shortLink":"fZa0Bxoz"}},"type":"updateBoard","date":"2019-06-12T21:00:01.310Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5d0167c7c5eeda49f175e4d3","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"name":"PERSONAL/OPENSOURCE - GoChrono/TimeVault"},"board":{"name":"OPENSOURCE - GoChrono/TimeVault","id":"5cd4b4281203593b4b18a94d","shortLink":"fZa0Bxoz"}},"type":"updateBoard","date":"2019-06-12T20:59:51.040Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5d0167bf4b78e52cc0420b46","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"name":"FOSS - GoChrono/TimeVault"},"board":{"name":"PERSONAL/OPENSOURCE - GoChrono/TimeVault","id":"5cd4b4281203593b4b18a94d","shortLink":"fZa0Bxoz"}},"type":"updateBoard","date":"2019-06-12T20:59:43.488Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5d0167498b6600508bd9936a","idMemberCreator":"55642875ac2f713188495fc7","data":{"old":{"name":"Project - GoChrono/TimeVault"},"board":{"name":"FOSS - GoChrono/TimeVault","id":"5cd4b4281203593b4b18a94d","shortLink":"fZa0Bxoz"}},"type":"updateBoard","date":"2019-06-12T20:57:45.249Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd5b6cb89a1d205465fc2be","idMemberCreator":"55642875ac2f713188495fc7","data":{"attachment":{"previewUrl2x":"https://trello-attachments.s3.amazonaws.com/5cd596ada5cdc53a05f96c75/1200x473/a7e28dddf15b1a9414bfa6f413e439c7/timevault_data_models_r1.png","previewUrl":"https://trello-attachments.s3.amazonaws.com/5cd596ada5cdc53a05f96c75/599x236/a7e28dddf15b1a9414bfa6f413e439c7/timevault_data_models_r1.png","url":"https://trello-attachments.s3.amazonaws.com/5cd4b4281203593b4b18a94d/5cd596ada5cdc53a05f96c75/ee49b466dd13fb5979478e4c241d416e/timevault_data_models_r1.png","name":"timevault_data_models_r1.png","id":"5cd5b6cb89a1d205465fc2a5"},"board":{"shortLink":"fZa0Bxoz","name":"Project - GoChrono/TimeVault","id":"5cd4b4281203593b4b18a94d"},"list":{"name":"Base Framework","id":"5cd58dae0031290a391ce6ea"},"card":{"shortLink":"KYm8XRQ4","idShort":7,"name":"Create feature list","id":"5cd596ada5cdc53a05f96c75"}},"type":"addAttachmentToCard","date":"2019-05-10T17:37:15.764Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd5b6c97e1eac226c52c9f6","idMemberCreator":"55642875ac2f713188495fc7","data":{"attachment":{"url":"https://trello-attachments.s3.amazonaws.com/5cd4b4281203593b4b18a94d/5cd596ada5cdc53a05f96c75/d243a1f23bdf38bfff9f58c4447c08f5/timevault_data_models.mdj","name":"timevault_data_models.mdj","id":"5cd5b6c97e1eac226c52c9f5"},"board":{"shortLink":"fZa0Bxoz","name":"Project - GoChrono/TimeVault","id":"5cd4b4281203593b4b18a94d"},"list":{"name":"Base Framework","id":"5cd58dae0031290a391ce6ea"},"card":{"shortLink":"KYm8XRQ4","idShort":7,"name":"Create feature list","id":"5cd596ada5cdc53a05f96c75"}},"type":"addAttachmentToCard","date":"2019-05-10T17:37:13.671Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd5af9b13df5a7936fc10c7","idMemberCreator":"55642875ac2f713188495fc7","data":{"list":{"name":"Base Framework","id":"5cd58dae0031290a391ce6ea"},"board":{"shortLink":"fZa0Bxoz","name":"Project - GoChrono/TimeVault","id":"5cd4b4281203593b4b18a94d"},"card":{"shortLink":"KYm8XRQ4","idShort":7,"name":"Create feature list","id":"5cd596ada5cdc53a05f96c75","desc":"Users with various roles\nProjects\n - tasks\nFrames\nTimers\nReporting\nScreenshots\n\nClients\n- Web\n- CLI\n- Desktop App\n- Mobile App?"},"old":{"desc":""}},"type":"updateCard","date":"2019-05-10T17:06:35.253Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd5a24cca0aaf1ab6820462","idMemberCreator":"55642875ac2f713188495fc7","data":{"list":{"name":"Base Framework","id":"5cd58dae0031290a391ce6ea"},"board":{"shortLink":"fZa0Bxoz","name":"Project - GoChrono/TimeVault","id":"5cd4b4281203593b4b18a94d"},"card":{"shortLink":"KYm8XRQ4","idShort":7,"id":"5cd596ada5cdc53a05f96c75","name":"Create feature list"},"old":{"name":"Create home dashboard design"}},"type":"updateCard","date":"2019-05-10T16:09:48.205Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd5a2420a16c0510ab8a8e8","idMemberCreator":"55642875ac2f713188495fc7","data":{"list":{"name":"Base Framework","id":"5cd58dae0031290a391ce6ea"},"board":{"shortLink":"fZa0Bxoz","name":"Project - GoChrono/TimeVault","id":"5cd4b4281203593b4b18a94d"},"card":{"shortLink":"Vlus26Qy","idShort":6,"name":"Create login page design","id":"5cd59683e6c04f027f470d4e","closed":true},"old":{"closed":false}},"type":"updateCard","date":"2019-05-10T16:09:38.393Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd596ada5cdc53a05f96c76","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - GoChrono/TimeVault","id":"5cd4b4281203593b4b18a94d"},"list":{"name":"Base Framework","id":"5cd58dae0031290a391ce6ea"},"card":{"shortLink":"KYm8XRQ4","idShort":7,"name":"Create home dashboard design","id":"5cd596ada5cdc53a05f96c75"}},"type":"createCard","date":"2019-05-10T15:20:13.083Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd59683e6c04f027f470d50","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - GoChrono/TimeVault","id":"5cd4b4281203593b4b18a94d"},"list":{"name":"Base Framework","id":"5cd58dae0031290a391ce6ea"},"card":{"shortLink":"Vlus26Qy","idShort":6,"name":"Create login page design","id":"5cd59683e6c04f027f470d4e"}},"type":"createCard","date":"2019-05-10T15:19:31.990Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd5964446599864198ce474","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - GoChrono/TimeVault","id":"5cd4b4281203593b4b18a94d"},"plugin":{"usageBrackets":{"boards":1000},"listing":{"overview":"Move cards to a list with one click, not four.","description":"Feel like you're making dozens of clicks to send your cards from one list to another? Looking for a way to streamline your GTD process?\n\nWith _Move to Done_, simply:\n\n- Pick a list\n- Every time you click _Move to Done_, your cards go there\n\nIt's that easy!\n\n![Move to Done demo](https://movetodone.co/wp-content/uploads/2019/01/mtd-demo.gif)","locale":"en-us","name":"Move to Done"},"icon":{"url":"https://movetodone.co/wp-content/uploads/2019/01/mtd-logo.png"},"isCompliantWithPrivacyStandards":null,"tags":[],"supportEmail":"movetodone@gmail.com","moderatedState":null,"public":true,"privacyUrl":"https://movetodone.co/privacy-policy","name":"Move to Done","iframeConnectorUrl":"https://movetodone.herokuapp.com/","categories":["automation","board-utilities"],"capabilities":["card-buttons","callback","show-settings","authorization-status","show-authorization"],"author":"Gerry Claps","idOrganizationOwner":"5c2756c3e2f26550303cec14","id":"5c275744043ea474d98a8119"}},"type":"disablePlugin","date":"2019-05-10T15:18:28.736Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd5964366990165198bbf50","idMemberCreator":"55642875ac2f713188495fc7","data":{"listAfter":{"name":"Base Framework","id":"5cd58dae0031290a391ce6ea"},"listBefore":{"name":"Ready for Live","id":"5cd58ddb406e33822e14d20c"},"board":{"shortLink":"fZa0Bxoz","name":"Project - GoChrono/TimeVault","id":"5cd4b4281203593b4b18a94d"},"card":{"shortLink":"mp7TnKPL","idShort":1,"name":"Create NoAuth middleware","id":"5cd59041d505c80910c4380e","idList":"5cd58dae0031290a391ce6ea"},"old":{"idList":"5cd58ddb406e33822e14d20c"}},"type":"updateCard","date":"2019-05-10T15:18:27.127Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd5964019b76b4fcb7a91e4","idMemberCreator":"55642875ac2f713188495fc7","data":{"listAfter":{"name":"Ready for Live","id":"5cd58ddb406e33822e14d20c"},"listBefore":{"name":"Base Framework","id":"5cd58dae0031290a391ce6ea"},"board":{"shortLink":"fZa0Bxoz","name":"Project - GoChrono/TimeVault","id":"5cd4b4281203593b4b18a94d"},"card":{"shortLink":"mp7TnKPL","idShort":1,"name":"Create NoAuth middleware","id":"5cd59041d505c80910c4380e","idList":"5cd58ddb406e33822e14d20c"},"old":{"idList":"5cd58dae0031290a391ce6ea"}},"type":"updateCard","date":"2019-05-10T15:18:24.175Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd5908dd5a955014a217c2d","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","id":"5cd4b4281203593b4b18a94d","name":"Project - GoChrono/TimeVault"},"old":{"name":"Project - TimeVault"}},"type":"updateBoard","date":"2019-05-10T14:54:05.704Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd59087b83e0c1a5b8cdfbc","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","id":"5cd4b4281203593b4b18a94d","name":"Project - TimeVault"},"old":{"name":"Project - Go Monitor"}},"type":"updateBoard","date":"2019-05-10T14:53:59.266Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd5907c7856df8beeb0f0c4","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"list":{"name":"Resources","id":"5cd59079b20b0d05a3b4194b","pos":32767.5},"old":{"pos":458751}},"type":"updateList","date":"2019-05-10T14:53:48.246Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd59079b20b0d05a3b4194c","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"list":{"name":"Resources","id":"5cd59079b20b0d05a3b4194b"}},"type":"createList","date":"2019-05-10T14:53:45.553Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd590666ee2ab57fa12f4d9","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"list":{"name":"Base Framework","id":"5cd58dae0031290a391ce6ea"},"card":{"shortLink":"UaAqZUIc","idShort":4,"name":"Design UML document showing relationship of models","id":"5cd590666ee2ab57fa12f4d8"}},"type":"createCard","date":"2019-05-10T14:53:26.951Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd59057f4d7037596e74ce0","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"list":{"name":"Base Framework","id":"5cd58dae0031290a391ce6ea"},"card":{"shortLink":"BR4odK7Y","idShort":3,"name":"Create /auth endpoint","id":"5cd59057f4d7037596e74cdf"}},"type":"createCard","date":"2019-05-10T14:53:11.042Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd5904a289bf730f4000271","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"list":{"name":"Base Framework","id":"5cd58dae0031290a391ce6ea"},"card":{"shortLink":"v9d1kLMz","idShort":2,"name":"Create AuthWithToken middleware","id":"5cd5904a289bf730f4000270"}},"type":"createCard","date":"2019-05-10T14:52:58.695Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd59042d505c80910c4380f","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"list":{"name":"Base Framework","id":"5cd58dae0031290a391ce6ea"},"card":{"shortLink":"mp7TnKPL","idShort":1,"name":"Create NoAuth middleware","id":"5cd59041d505c80910c4380e"}},"type":"createCard","date":"2019-05-10T14:52:50.022Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd5900372601f2358216eb1","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"plugin":{"usageBrackets":{"boards":0},"listing":{"overview":"Set a limit on your lists and we'll highlight the list if the number of cards in it passes this limit.","description":"Set a limit on your lists and we'll highlight the list if the number of cards in it passes this limit.\n\n![Once enabled, you will find the \"Set List Limit...\" option in the List actions menu.](https://trello-attachments.s3.amazonaws.com/5b56280b7694ac008082fe38/5cc0df36475a318042e2b269/49a99b761f13f1b96823fe2aa9ba2520/set-limit.mp4-856-bicubic.gif)\n\n![List is highlighted when you exceed the List Limit.](https://trello-attachments.s3.amazonaws.com/5b56280b7694ac008082fe38/5cc0df36475a318042e2b269/b381fe07c77bd9843c91e349eec63118/exceeding-limit.mp4-856-bicubic.gif)\n\n[Check out this blog to find out how to optimize your team's process with work-in-progress limits.](https://www.atlassian.com/agile/kanban/wip-limits)","locale":"en-us","name":"List Limits"},"icon":{"url":"https://list-limits.trello.services/images/list-limits.svg"},"isCompliantWithPrivacyStandards":null,"tags":[],"supportEmail":"support@trello.com","moderatedState":null,"public":true,"privacyUrl":"http://trello.com/privacy","name":"List Limits","iframeConnectorUrl":"https://list-limits.trello.services/index.html?ver=d4c8feffd4","categories":["it-project-management","board-utilities"],"capabilities":[],"author":"Trello Inc","idOrganizationOwner":"5a999cd36066c584c097f193","id":"5c2462c384ab8949b1724a20"}},"type":"enablePlugin","date":"2019-05-10T14:51:47.511Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd58fe69b51983cdadf3b2e","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"plugin":{"usageBrackets":{"boards":50000},"listing":{"overview":"Attach branches, commits, issues, and pull requests to cards, and at a glance see the status of pull requests on your boards.","description":"The GitHub Power-Up for Trello let’s teams track everything that’s going on in GitHub directly from their Trello boards. Bring perspective to your codebase by attaching pull requests, issues, branches, and more directly to their respective cards. In a glance, see whether a PR has been merged, the status of checks, who’s assigned to a PR, and more. Checks will also display as visual badges on the front of cards color coded to their status.\n\n- Attach branches, commits, issues and pull requests directly to cards.\n- See the status of pull requests on the front of cards.\n- Identify cards that have not passed their checks with color coded badges that display on the front of cards.\n- Developers and managers can easily jump into GitHub to work on assigned tasks in a single click.\n- Associate one or more GitHub repositories with a board.\n- The GitHub Power-Up supports both GitHub and GitHub Enterprise instances.\n\n![screenshot](https://github.trello.services/images/screenshots/GitHub_1.jpg)\n![screenshot](https://github.trello.services/images/screenshots/GitHub_2.jpg)\n![screenshot](https://github.trello.services/images/screenshots/GitHub_3.jpg)","locale":"en-US","name":"GitHub"},"icon":{"url":"https://github.trello.services/images/github.png"},"isCompliantWithPrivacyStandards":null,"tags":[],"url":"https://github.trello.services/manifest.json","supportEmail":"support@trello.com","moderatedState":null,"public":true,"privacyUrl":"https://trello.com/privacy","name":"GitHub","iframeConnectorUrl":"https://github.trello.services/index.html?ver=a7da2c5758","categories":["developer-tools","it-project-management"],"capabilities":["authorization-status","attachment-sections","attachment-thumbnail","board-buttons","callback","card-badges","card-buttons","card-detail-badges","card-from-url","format-url","show-authorization","show-settings"],"author":"Trello Inc","idOrganizationOwner":"5a999cd36066c584c097f193","id":"55a5d916446f517774210004"}},"type":"enablePlugin","date":"2019-05-10T14:51:18.797Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd58fcc854a1661db67930a","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"plugin":{"usageBrackets":{"boards":1000},"listing":{"overview":"Move cards to a list with one click, not four.","description":"Feel like you're making dozens of clicks to send your cards from one list to another? Looking for a way to streamline your GTD process?\n\nWith _Move to Done_, simply:\n\n- Pick a list\n- Every time you click _Move to Done_, your cards go there\n\nIt's that easy!\n\n![Move to Done demo](https://movetodone.co/wp-content/uploads/2019/01/mtd-demo.gif)","locale":"en-us","name":"Move to Done"},"icon":{"url":"https://movetodone.co/wp-content/uploads/2019/01/mtd-logo.png"},"isCompliantWithPrivacyStandards":null,"tags":[],"supportEmail":"movetodone@gmail.com","moderatedState":null,"public":true,"privacyUrl":"https://movetodone.co/privacy-policy","name":"Move to Done","iframeConnectorUrl":"https://movetodone.herokuapp.com/","categories":["automation","board-utilities"],"capabilities":["card-buttons","callback","show-settings","authorization-status","show-authorization"],"author":"Gerry Claps","idOrganizationOwner":"5c2756c3e2f26550303cec14","id":"5c275744043ea474d98a8119"}},"type":"enablePlugin","date":"2019-05-10T14:50:52.430Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd58deb548bea0134f406c3","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"plugin":{"usageBrackets":{"boards":1000000},"listing":{"overview":"Visualize Trello cards in a calendar view.","description":"Bring perspective to due dates with the Calendar Power-Up for Trello. Whether you are planning a conference, managing an editorial calendar, or organizing a family vacation, the Calendar Power-Up let’s you display cards with due dates in a weekly or monthly calendar view. Easily prioritize cards by dragging and dropping them on the calendar to automatically update their due dates, and export your Trello calendar to third party apps with an iCalendar link.\n\n- Display and filter cards with due dates in a weekly or monthly calendar view.\n\n- Manage due dates by dragging and dropping cards on the calendar.\n\n- Easily see completed tasks by marking due dates complete.\n\n- Export a board’s calendar to third party calendars with each board’s unique iCalendar link.\n\n- The Calendar Power-Up is supported on the web and iOS and Android mobile devices.\n\n![screenshot](https://calendar.trello.services/images/Calendar_1.jpg)\n![screenshot](https://calendar.trello.services/images/Calendar_2.jpg)\n![screenshot](https://calendar.trello.services/images/Calendar_3.jpg)\n![screenshot](https://calendar.trello.services/images/Calendar_4.jpg)","locale":"en-US","name":"Calendar"},"icon":{"url":"https://calendar.trello.services/images/calendar-icon.svg"},"isCompliantWithPrivacyStandards":null,"heroImageUrl":{"@2x":"https://trello-attachments.s3.amazonaws.com/5b56280b7694ac008082fe38/5b5628c7fcbdca04e2d6334c/4025fdb1f203e43f2cd5997b29e53e65/calendar%402x.jpg","@1x":"https://trello-attachments.s3.amazonaws.com/5b56280b7694ac008082fe38/5b5628c7fcbdca04e2d6334c/f52b4188bdca53cf13a9036efb95eced/calendar.jpg","_id":"5b5629bd96d94a97675090c7"},"tags":["essential"],"url":"https://calendar.trello.services/manifest.json","supportEmail":"support@trello.com","moderatedState":null,"public":true,"privacyUrl":"https://trello.com/privacy","name":"Calendar","iframeConnectorUrl":"https://calendar.trello.services/","categories":["board-utilities","communication-collaboration"],"capabilities":[],"author":"Trello Inc","idOrganizationOwner":"5a999cd36066c584c097f193","id":"55a5d917446f517774210011"}},"type":"enablePlugin","date":"2019-05-10T14:42:51.067Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd58dea678e50262434d511","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"plugin":{"usageBrackets":{"boards":500000},"listing":{"overview":"Access all of your Drive files for a project directly from its Trello card, or create and automatically attach new Drive files from a card.","description":"The Google Drive Power-Up for Trello brings your files and folders to Trello cards. Search Google Drive right from Trello and attach relevant files and folders. See real-time previews and details and click back into Google Drive. It also lets you turn your Trello board into a Google Slides presentation with one click.\n\n- Built in file search lets you attach folders and files from Google Drive to a Trello card on any version of Trello.\n- See real-time information and previews for any Google Drive files or folders attached to cards.\n- Turn your Trello board into a Google Slides presentation with one click.\n\n![screenshot](https://google-drive.trello.services/images/screenshots/Google_Drive_1.jpg)\n![screenshot](https://google-drive.trello.services/images/screenshots/Google_Drive_2.jpg)\n![screenshot](https://google-drive.trello.services/images/screenshots/Google_Drive_3.jpg)\n![screenshot](https://google-drive.trello.services/images/screenshots/Google_Drive_4.jpg)","locale":"en-US","name":"Google Drive"},"icon":{"url":"https://google-drive.trello.services/images/drive.png"},"isCompliantWithPrivacyStandards":null,"heroImageUrl":{"@2x":"https://trello-attachments.s3.amazonaws.com/5b56280b7694ac008082fe38/5b5628d6824e3c9e823d3f5f/785db43c4d09078b4497d990f4bea110/google-drive%402x.jpg","@1x":"https://trello-attachments.s3.amazonaws.com/5b56280b7694ac008082fe38/5b5628d6824e3c9e823d3f5f/eb52fbc60b3281e05e0a1093aac38fec/google-drive.jpg","_id":"5b562ad833bb25157586d348"},"tags":["essential"],"url":"https://google-drive.trello.services/manifest.json","supportEmail":"support@trello.com","moderatedState":null,"public":true,"privacyUrl":"https://trello.com/privacy","name":"Google Drive","iframeConnectorUrl":"https://google-drive.trello.services/index.html?ver=4375edde40","categories":["communication-collaboration","file-management"],"capabilities":["attachment-sections","attachment-thumbnail","board-buttons","callback","card-buttons","show-settings"],"author":"Trello Inc","idOrganizationOwner":"5a999cd36066c584c097f193","id":"55a5d916446f517774210006"}},"type":"enablePlugin","date":"2019-05-10T14:42:50.245Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd58ddde4595e3df2a96f1e","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"list":{"name":"Live","id":"5cd58ddde4595e3df2a96f1d"}},"type":"createList","date":"2019-05-10T14:42:37.014Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd58ddb406e33822e14d20d","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"list":{"name":"Ready for Live","id":"5cd58ddb406e33822e14d20c"}},"type":"createList","date":"2019-05-10T14:42:35.465Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd58dd76dd9c98f289967ac","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"list":{"name":"Needs Tested","id":"5cd58dd76dd9c98f289967ab"}},"type":"createList","date":"2019-05-10T14:42:31.840Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd58dd370c5a1303424e629","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"list":{"id":"5cd58dc208b043265cc3da49","name":"In Progress"},"old":{"name":"Developed"}},"type":"updateList","date":"2019-05-10T14:42:27.885Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd58dcc3d437451030fddeb","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"list":{"id":"5cd58dc208b043265cc3da49","name":"Developed"},"old":{"name":"Current Sprint"}},"type":"updateList","date":"2019-05-10T14:42:20.030Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd58dc208b043265cc3da4a","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"list":{"name":"Current Sprint","id":"5cd58dc208b043265cc3da49"}},"type":"createList","date":"2019-05-10T14:42:10.905Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd58dbbc332358f7a866de3","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"list":{"name":"Develop 1.0.0","id":"5cd58dbbc332358f7a866de2"}},"type":"createList","date":"2019-05-10T14:42:03.882Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd58dae0031290a391ce6eb","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"},"list":{"name":"Base Framework","id":"5cd58dae0031290a391ce6ea"}},"type":"createList","date":"2019-05-10T14:41:50.484Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd4b460b7a08576d2409404","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d","prefs":{"background":"5ca500df0ac627319cd9a2cf"}},"old":{"prefs":{"background":"5cbf5cad8d61e2119be1fc66"}}},"type":"updateBoard","date":"2019-05-09T23:14:40.430Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd4b45334a29c4f1c8f77fc","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d","prefs":{"background":"5cbf5cad8d61e2119be1fc66"}},"old":{"prefs":{"background":"5ccc639cdcccd5444b6f83c2"}}},"type":"updateBoard","date":"2019-05-09T23:14:27.495Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd4b447a53edf197a9b0316","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d","prefs":{"background":"5ccc639cdcccd5444b6f83c2"}},"old":{"prefs":{"background":"5ccc454975478e1f4c94161b"}}},"type":"updateBoard","date":"2019-05-09T23:14:15.395Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd4b445e6ecd905704c627e","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d","prefs":{"background":"5ccc454975478e1f4c94161b"}},"old":{"prefs":{"background":"5ccb23e156c3470209361a40"}}},"type":"updateBoard","date":"2019-05-09T23:14:13.869Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd4b4435bc1d960f21b4643","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d","prefs":{"background":"5ccb23e156c3470209361a40"}},"old":{"prefs":{"background":"5c369a71115e4a500728b342"}}},"type":"updateBoard","date":"2019-05-09T23:14:11.781Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}},{"id":"5cd4b4281203593b4b18a94f","idMemberCreator":"55642875ac2f713188495fc7","data":{"board":{"shortLink":"fZa0Bxoz","name":"Project - Go Monitor","id":"5cd4b4281203593b4b18a94d"}},"type":"createBoard","date":"2019-05-09T23:13:44.321Z","limits":{},"memberCreator":{"id":"55642875ac2f713188495fc7","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idMemberReferrer":null,"initials":"JK","nonPublic":{},"nonPublicAvailable":false}}],"cards":[{"id":"5cd59041d505c80910c4380e","address":null,"checkItemStates":null,"closed":true,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-02-13T03:49:28.629Z","desc":"","descData":null,"dueReminder":null,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":["5cd4b42891d0c2ddc54e8bb3"],"idList":"5cd58dae0031290a391ce6ea","idMembersVoted":[],"idShort":1,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Create NoAuth middleware","pos":65535,"shortLink":"mp7TnKPL","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2sa05zbvxmc5v5n4q32+13q88sc3p0@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[{"id":"5cd4b42891d0c2ddc54e8bb3","idBoard":"5cd4b4281203593b4b18a94d","name":"API","color":"green"}],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/mp7TnKPL","subscribed":false,"url":"https://trello.com/c/mp7TnKPL/1-create-noauth-middleware","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5cd5904a289bf730f4000270","address":null,"checkItemStates":null,"closed":true,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-02-13T03:49:29.814Z","desc":"","descData":null,"dueReminder":null,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":["5cd4b42891d0c2ddc54e8bb3"],"idList":"5cd58dae0031290a391ce6ea","idMembersVoted":[],"idShort":2,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Create AuthWithToken middleware","pos":131071,"shortLink":"v9d1kLMz","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2sa0608aw3ymy9pb3ao+1pzkalubpm@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[{"id":"5cd4b42891d0c2ddc54e8bb3","idBoard":"5cd4b4281203593b4b18a94d","name":"API","color":"green"}],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/v9d1kLMz","subscribed":false,"url":"https://trello.com/c/v9d1kLMz/2-create-authwithtoken-middleware","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5cd59057f4d7037596e74cdf","address":null,"checkItemStates":null,"closed":true,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-02-13T03:49:27.378Z","desc":"","descData":null,"dueReminder":null,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":["5cd4b42891d0c2ddc54e8bb3"],"idList":"5cd58dae0031290a391ce6ea","idMembersVoted":[],"idShort":3,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Create /auth endpoint","pos":196607,"shortLink":"BR4odK7Y","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2sa061q0n9lp1pn4xcv+1dtlfbbarj@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[{"id":"5cd4b42891d0c2ddc54e8bb3","idBoard":"5cd4b4281203593b4b18a94d","name":"API","color":"green"}],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/BR4odK7Y","subscribed":false,"url":"https://trello.com/c/BR4odK7Y/3-create-auth-endpoint","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5cd590666ee2ab57fa12f4d8","address":null,"checkItemStates":null,"closed":true,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-02-13T03:49:24.292Z","desc":"","descData":null,"dueReminder":null,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":["5cd4b42891d0c2ddc54e8bb3"],"idList":"5cd58dae0031290a391ce6ea","idMembersVoted":[],"idShort":4,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Design UML document showing relationship of models","pos":262143,"shortLink":"UaAqZUIc","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2sa063adk29v2r2x1p4+10668qdity@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[{"id":"5cd4b42891d0c2ddc54e8bb3","idBoard":"5cd4b4281203593b4b18a94d","name":"API","color":"green"}],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/UaAqZUIc","subscribed":false,"url":"https://trello.com/c/UaAqZUIc/4-design-uml-document-showing-relationship-of-models","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5cd59683e6c04f027f470d4e","address":null,"checkItemStates":null,"closed":true,"coordinates":null,"creationMethod":null,"dateLastActivity":"2019-05-10T16:09:38.383Z","desc":"","descData":null,"dueReminder":null,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5cd58dae0031290a391ce6ea","idMembersVoted":[],"idShort":6,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Create login page design","pos":327679,"shortLink":"Vlus26Qy","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2sa0askthaqv896d0em+1g9sayn3na@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/Vlus26Qy","subscribed":false,"url":"https://trello.com/c/Vlus26Qy/6-create-login-page-design","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5cd596ada5cdc53a05f96c75","address":null,"checkItemStates":null,"closed":true,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-02-13T03:49:21.095Z","desc":"Users with various roles\nProjects\n - tasks\nFrames\nTimers\nReporting\nScreenshots\n\nClients\n- Web\n- CLI\n- Desktop App\n- Mobile App?","descData":{"emoji":{}},"dueReminder":null,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":["5cd4b42891d0c2ddc54e8bb3","5cd4b42891d0c2ddc54e8bb4","5cd5aef21397931b939e099b"],"idList":"5cd58dae0031290a391ce6ea","idMembersVoted":[],"idShort":7,"idAttachmentCover":"5cd5b6cb89a1d205465fc2a5","locationName":null,"manualCoverAttachment":false,"name":"Create feature list","pos":393215,"shortLink":"KYm8XRQ4","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":2,"description":true,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2sa0ax3c7n8pe6owtbp+0q13rlud4j@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[{"id":"5cd4b42891d0c2ddc54e8bb3","idBoard":"5cd4b4281203593b4b18a94d","name":"API","color":"green"},{"id":"5cd4b42891d0c2ddc54e8bb4","idBoard":"5cd4b4281203593b4b18a94d","name":"Web","color":"yellow"},{"id":"5cd5aef21397931b939e099b","idBoard":"5cd4b4281203593b4b18a94d","name":"High Priority","color":"pink"}],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/KYm8XRQ4","subscribed":false,"url":"https://trello.com/c/KYm8XRQ4/7-create-feature-list","cover":{"idAttachment":"5cd5b6cb89a1d205465fc2a5","color":null,"idUploadedBackground":null,"size":"normal","brightness":"light","scaled":[{"_id":"5cd5b6cb89a1d205465fc2bd","id":"5cd5b6cb89a1d205465fc2bd","scaled":false,"url":"https://trello-attachments.s3.amazonaws.com/5cd596ada5cdc53a05f96c75/70x50/a7e28dddf15b1a9414bfa6f413e439c7/timevault_data_models_r1.png","bytes":2979,"height":50,"width":70},{"_id":"5cd5b6cb89a1d205465fc2bc","id":"5cd5b6cb89a1d205465fc2bc","scaled":false,"url":"https://trello-attachments.s3.amazonaws.com/5cd596ada5cdc53a05f96c75/250x150/a7e28dddf15b1a9414bfa6f413e439c7/timevault_data_models_r1.png","bytes":29373,"height":150,"width":250},{"_id":"5cd5b6cb89a1d205465fc2bb","id":"5cd5b6cb89a1d205465fc2bb","scaled":true,"url":"https://trello-attachments.s3.amazonaws.com/5cd596ada5cdc53a05f96c75/150x59/a7e28dddf15b1a9414bfa6f413e439c7/timevault_data_models_r1.png","bytes":11232,"height":59,"width":150},{"_id":"5cd5b6cb89a1d205465fc2ba","id":"5cd5b6cb89a1d205465fc2ba","scaled":true,"url":"https://trello-attachments.s3.amazonaws.com/5cd596ada5cdc53a05f96c75/300x118/a7e28dddf15b1a9414bfa6f413e439c7/timevault_data_models_r1.png","bytes":43101,"height":118,"width":300},{"_id":"5cd5b6cb89a1d205465fc2b9","id":"5cd5b6cb89a1d205465fc2b9","scaled":true,"url":"https://trello-attachments.s3.amazonaws.com/5cd596ada5cdc53a05f96c75/599x236/a7e28dddf15b1a9414bfa6f413e439c7/timevault_data_models_r1.png","bytes":98849,"height":236,"width":599},{"_id":"5cd5b6cb89a1d205465fc2b8","id":"5cd5b6cb89a1d205465fc2b8","scaled":true,"url":"https://trello-attachments.s3.amazonaws.com/5cd596ada5cdc53a05f96c75/1200x473/a7e28dddf15b1a9414bfa6f413e439c7/timevault_data_models_r1.png","bytes":307112,"height":473,"width":1200},{"_id":"5cd5b6cb89a1d205465fc2b7","id":"5cd5b6cb89a1d205465fc2b7","scaled":true,"url":"https://trello-attachments.s3.amazonaws.com/5cd4b4281203593b4b18a94d/5cd596ada5cdc53a05f96c75/ee49b466dd13fb5979478e4c241d416e/timevault_data_models_r1.png","bytes":119943,"height":530,"width":1346}]},"attachments":[{"bytes":61114,"date":"2019-05-10T17:37:13.596Z","edgeColor":null,"idMember":"55642875ac2f713188495fc7","isUpload":true,"mimeType":null,"name":"timevault_data_models.mdj","previews":[],"url":"https://trello-attachments.s3.amazonaws.com/5cd4b4281203593b4b18a94d/5cd596ada5cdc53a05f96c75/d243a1f23bdf38bfff9f58c4447c08f5/timevault_data_models.mdj","pos":16384,"id":"5cd5b6c97e1eac226c52c9f5"},{"bytes":119943,"date":"2019-05-10T17:37:15.231Z","edgeColor":null,"idMember":"55642875ac2f713188495fc7","isUpload":true,"mimeType":null,"name":"timevault_data_models_r1.png","previews":[{"_id":"5cd5b6cb89a1d205465fc2bd","id":"5cd5b6cb89a1d205465fc2bd","scaled":false,"url":"https://trello-attachments.s3.amazonaws.com/5cd596ada5cdc53a05f96c75/70x50/a7e28dddf15b1a9414bfa6f413e439c7/timevault_data_models_r1.png","bytes":2979,"height":50,"width":70},{"_id":"5cd5b6cb89a1d205465fc2bc","id":"5cd5b6cb89a1d205465fc2bc","scaled":false,"url":"https://trello-attachments.s3.amazonaws.com/5cd596ada5cdc53a05f96c75/250x150/a7e28dddf15b1a9414bfa6f413e439c7/timevault_data_models_r1.png","bytes":29373,"height":150,"width":250},{"_id":"5cd5b6cb89a1d205465fc2bb","id":"5cd5b6cb89a1d205465fc2bb","scaled":true,"url":"https://trello-attachments.s3.amazonaws.com/5cd596ada5cdc53a05f96c75/150x59/a7e28dddf15b1a9414bfa6f413e439c7/timevault_data_models_r1.png","bytes":11232,"height":59,"width":150},{"_id":"5cd5b6cb89a1d205465fc2ba","id":"5cd5b6cb89a1d205465fc2ba","scaled":true,"url":"https://trello-attachments.s3.amazonaws.com/5cd596ada5cdc53a05f96c75/300x118/a7e28dddf15b1a9414bfa6f413e439c7/timevault_data_models_r1.png","bytes":43101,"height":118,"width":300},{"_id":"5cd5b6cb89a1d205465fc2b9","id":"5cd5b6cb89a1d205465fc2b9","scaled":true,"url":"https://trello-attachments.s3.amazonaws.com/5cd596ada5cdc53a05f96c75/599x236/a7e28dddf15b1a9414bfa6f413e439c7/timevault_data_models_r1.png","bytes":98849,"height":236,"width":599},{"_id":"5cd5b6cb89a1d205465fc2b8","id":"5cd5b6cb89a1d205465fc2b8","scaled":true,"url":"https://trello-attachments.s3.amazonaws.com/5cd596ada5cdc53a05f96c75/1200x473/a7e28dddf15b1a9414bfa6f413e439c7/timevault_data_models_r1.png","bytes":307112,"height":473,"width":1200},{"_id":"5cd5b6cb89a1d205465fc2b7","id":"5cd5b6cb89a1d205465fc2b7","scaled":true,"url":"https://trello-attachments.s3.amazonaws.com/5cd4b4281203593b4b18a94d/5cd596ada5cdc53a05f96c75/ee49b466dd13fb5979478e4c241d416e/timevault_data_models_r1.png","bytes":119943,"height":530,"width":1346}],"url":"https://trello-attachments.s3.amazonaws.com/5cd4b4281203593b4b18a94d/5cd596ada5cdc53a05f96c75/ee49b466dd13fb5979478e4c241d416e/timevault_data_models_r1.png","pos":32768,"id":"5cd5b6cb89a1d205465fc2a5"}],"pluginData":[],"customFieldItems":[]},{"id":"5ed522f9abb78475d335be78","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-10T00:22:54.532Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5f897414365394f9bd0","idMembersVoted":[],"idShort":34,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Refactor colors to use theme object","pos":119808,"shortLink":"MokJZ3op","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2ufpnxc5suto9aabx4o+1zv16kkfj2@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/MokJZ3op","subscribed":false,"url":"https://trello.com/c/MokJZ3op/34-refactor-colors-to-use-theme-object","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5ed5231de2583f18473d0984","address":null,"checkItemStates":null,"closed":true,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-08T23:41:15.950Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5f897414365394f9bd0","idMembersVoted":[],"idShort":35,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Allow projects to be personal","pos":133120,"shortLink":"73OWLQv2","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2ufpo1953iqt1nshe2s+05idfpgp5q@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/73OWLQv2","subscribed":false,"url":"https://trello.com/c/73OWLQv2/35-allow-projects-to-be-personal","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5ee027eaa2a8ba5ab9c7305d","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-10Tto separate files","pos":139776,"shortLink":"vhPJ6X6Z","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2uhdx7z61d3wanyu4il+0s3t9pukpt@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/vhPJ6X6Z","subscribed":false,"url":"https://trello.com/c/vhPJ6X6Z/54-migrate-often-used-components-into-separate-files","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e9e38a2e24185886fc950c7","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-15T23:06:05.163Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5f897414365394f9bd0","idMembersVoted":[],"idShort":28,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Add task due date","pos":149760,"shortLink":"wCma0VqF","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2u7dd3rqs5xyqfookav+1l8gmogcc0@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/wCma0VqF","subscribed":false,"url":"https://trello.com/c/wCma0VqF/28-add-task-due-date","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5edb3279e70c2556f441cea7","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-15T23:06:04.811Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5f897414365394f9bd0","idMembersVoted":[],"idShort":50,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Add checklists","pos":154752,"shortLink":"ycZhpt00","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2ugmt0xa246b27mq55z+0sk2j5feko@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/ycZhpt00","subscribed":false,"url":"https://trello.com/c/ycZhpt00/50-add-checklists","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5ed8097762a37b5adbfb5947","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-08T20:57:12.933Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5f897414365394f9bd0","idMembersVoted":[],"idShort":40,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Admin console","pos":159744,"shortLink":"KIZrLw8H","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2ug5iwdr0so2j2kqerr+2mskv7fh9u@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/KIZrLw8H","subscribed":false,"url":"https://trello.com/c/KIZrLw8H/40-admin-console","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5edb325b1d2742576b91b3ee","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-08T20:57:14.247Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5f897414365394f9bd0","idMembersVoted":[],"idShort":49,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Manage users","pos":186368,"shortLink":"zWXqX889","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2ugmsxlf1dv0jjnyy26+0l1guve3jt@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/zWXqX889","subscribed":false,"url":"https://trello.com/c/zWXqX889/49-manage-users","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e9e38d28f035d40b2711917","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-15T23:06:04.227Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5f897414365394f9bd0","idMembersVoted":[],"idShort":31,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Add team creation","pos":193024,"shortLink":"N4xFvhYD","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2u7dd8xce9vz9v607pz+04g2250con@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/N4xFvhYD","subscribed":false,"url":"https://trello.com/c/N4xFvhYD/31-add-team-creation","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5ed8098066f27d6c0e3c36fa","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-08T20:57:16.745Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5f897414365394f9bd0","idMembersVoted":[],"idShort":41,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Project user management","pos":199680,"shortLink":"rqQvInlv","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2ug5ixcuq7xgzbavvga+1ft72cd1uf@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/rqQvInlv","subscribed":false,"url":"https://trello.com/c/rqQvInlv/41-project-user-management","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5ed7fd96e8f3ab69b8e7332e","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-08T20:57:30.146Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5f897414365394f9bd0","idMembersVoted":[],"idShort":36,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Add calendar tab","pos":294912,"shortLink":"QBZmXmHz","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2ug59rl19w0fcffhs1a+0hf4u7hi9w@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/QBZmXmHz","subscribed":false,"url":"https://trello.com/c/QBZmXmHz/36-add-calendar-tab","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5edea6711d8e9c82a32c3ee7","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-08T20:58:25.792Z","desc":"","descData":null,"dueReminder":null,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5f897414365394f9bd0","idMembersVoted":[],"idShort":51,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Import from Trello","pos":360448,"shortLink":"nHyqBjTw","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2uh5osjbasasfllaqqv+28317a5fea@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/nHyqBjTw","subscribed":false,"url":"https://trello.com/c/nHyqBjTw/51-import-from-trello","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5edecca939a7b284542a76ab","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-08T23:41:29.199Z","desc":"","descData":null,"dueReminder":null,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5f897414365394f9bd0","idMembersVoted":[],"idShort":53,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Refactor dashboard design","pos":425984,"shortLink":"wtsna3XY","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2uh6i6lbh7tvpkdihm3+1xvw8myocz@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/wtsna3XY","subscribed":false,"url":"https://trello.com/c/wtsna3XY/53-refactor-dashboard-design","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5ed80bcbcf1eae6cf3b6cc9e","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-08T20:57:22.665Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5feb47e14523e480efd","idMembersVoted":[],"idShort":42,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Project switcher","pos":237568,"shortLink":"ZrEWrr8n","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2ug5kovnn20lvgm3jq6+2ay4xzctd8@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/ZrEWrr8n","subscribed":false,"url":"https://trello.com/c/ZrEWrr8n/42-project-switcher","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5ed80be82f0619028ac97ecc","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-08T20:57:23.967Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5feb47e14523e480efd","idMembersVoted":[],"idShort":44,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Change project team","pos":270336,"shortLink":"kD4HotdC","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2ug5kry4c3fztqkouz0+1vlzgnpo4s@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/kD4HotdC","subscribed":false,"url":"https://trello.com/c/kD4HotdC/44-change-project-team","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5ed80bee5c47473f2adb230e","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-08T20:57:25.508Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5feb47e14523e480efd","idMembersVoted":[],"idShort":45,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Delete project","pos":278528,"shortLink":"MpVDMIJm","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2ug5ksm60c4dinadoge+0xsnqjzrgn@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/MpVDMIJm","subscribed":false,"url":"https://trello.com/c/MpVDMIJm/45-delete-project","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5ed80bd9693ee510885fc15c","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-15T23:06:00.546Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5feb47e14523e480efd","idMembersVoted":[],"idShort":43,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Project favorites","pos":283648,"shortLink":"fSF4Ds9h","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2ug5kqclypw043pkvh8+0w5scydclw@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/fSF4Ds9h","subscribed":false,"url":"https://trello.com/c/fSF4Ds9h/43-project-favorites","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5ed7fd98371d32159dddc14a","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-15T23:06:02.632Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5feb47e14523e480efd","idMembersVoted":[],"idShort":37,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Add list tab","pos":288768,"shortLink":"v3SCvCjx","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2ug59rq47qqy8ew7ya2+0vd3ge2r9p@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/v3SCvCjx","subscribed":false,"url":"https://trello.com/c/v3SCvCjx/37-add-list-tab","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5ed80945ebef49792ffc8071","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-15T21:48:34.664Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5feb47e14523e480efd","idMembersVoted":[],"idShort":38,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Notification system","pos":293888,"shortLink":"ICj6IQeI","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":"2023-06-20T21:47:00.000Z","dueComplete":false},"dueComplete":false,"due":"2023-06-20T21:47:00.000Z","email":"jordanthedev+2k8klodpfpyrloxcwcn+2ug5ir16p7x3rph0i29+1qeqfnbuak@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/ICj6IQeI","subscribed":false,"url":"https://trello.com/c/ICj6IQeI/38-notification-system","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5ed8094a3ecb5e248bec0848","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-08T20:57:43.762Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5feb47e14523e480efd","idMembersVoted":[],"idShort":39,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Real time updates","pos":344064,"shortLink":"UA9RPc3u","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":5,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2ug5iri0ntn2l8n7wp4+1robq3dqw3@boards.trello.com","idChecklists":["5ed8094c0820e8522a80ff5f"],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/UA9RPc3u","subscribed":false,"url":"https://trello.com/c/UA9RPc3u/39-real-time-updates","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5edeb5a560db636e34e85c0d","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-08T22:03:25.869Z","desc":"","descData":null,"dueReminder":null,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea6112546eb4be8a1a55e","idMembersVoted":[],"idShort":52,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Merge refresh async call stack [axios & apollo]","pos":65535,"shortLink":"V0dWaoZv","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2uh60hg2ttexbwhplvx+1uevgzh8hw@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/V0dWaoZv","subscribed":false,"url":"https://trello.com/c/V0dWaoZv/52-merge-refresh-async-call-stack-axios-apollo","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e44c793b372d216dd03fada","address":null,"checkItemStates":null,"closed":true,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-04-21T00:04:23.362Z","desc":"","descData":{"emoji":{}},"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":["5cd4b42891d0c2ddc54e8bb4","5cd4b42891d0c2ddc54e8bb3"],"idList":"5e44c76e90700918899276fb","idMembersVoted":[],"idShort":9,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Ability to add users","pos":43008,"shortLink":"PKTkQDPr","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":true,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":"2020-04-20T17:10:00.000Z","dueComplete":false},"dueComplete":false,"due":"2020-04-20T17:10:00.000Z","email":"jordanthedev+2k8klodpfpyrloxcwcn+2tts9c09x6mjbcn65zu+1dr35uwsg8@boards.trello.com","idChecklists":[],"idMembers":["55642875ac2f713188495fc7"],"labels":[{"id":"5cd4b42891d0c2ddc54e8bb4","idBoard":"5cd4b4281203593b4b18a94d","name":"Web","color":"yellow"},{"id":"5cd4b42891d0c2ddc54e8bb3","idBoard":"5cd4b4281203593b4b18a94d","name":"API","color":"green"}],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/PKTkQDPr","subscribed":true,"url":"https://trello.com/c/PKTkQDPr/9-ability-to-add-users","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e44c798946dde2414d2d239","address":null,"checkItemStates":null,"closed":true,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-04-21T00:04:24.981Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e44c76e90700918899276fb","idMembersVoted":[],"idShort":10,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Ability to add teams","pos":49152,"shortLink":"SamycMpq","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2tts9cj9osanxfjd9vd+25lk8j01gh@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/SamycMpq","subscribed":false,"url":"https://trello.com/c/SamycMpq/10-ability-to-add-teams","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e44c79ddc1e680d8a4e566c","address":null,"checkItemStates":null,"closed":true,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-04-21T00:04:26.284Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e44c76e90700918899276fb","idMembersVoted":[],"idShort":11,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Project management","pos":65536,"shortLink":"6KBWilvJ","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":3,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2tts9d3toms4yi6b3vw+18m5skjd83@boards.trello.com","idChecklists":["5e92049e4f53b778d25dfd5e"],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/6KBWilvJ","subscribed":false,"url":"https://trello.com/c/6KBWilvJ/11-project-management","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e44c7bd94d5ea5d1ed58b85","address":null,"checkItemStates":null,"closed":true,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-04-21T00:04:27.513Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e44c76e90700918899276fb","idMembersVoted":[],"idShort":13,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Kanban board tasks","pos":98304,"shortLink":"DAEdI4Ng","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":7,"checkItemsChecked":4,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2tts9gjbg7q2krz7pfp+1yxm94gk6u@boards.trello.com","idChecklists":["5e44c7c0681a7a0fc5d898c7"],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/DAEdI4Ng","subscribed":false,"url":"https://trello.com/c/DAEdI4Ng/13-kanban-board-tasks","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e4e10c111c45c671a8bbedf","address":null,"checkItemStates":null,"closed":true,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-02-21T05:49:00.281Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e44c76e90700918899276fb","idMembersVoted":[],"idShort":14,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Setup Apollo client","pos":114688,"shortLink":"WdtXHd18","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2tv71dj2pilhin5bxen+261a6rlf3d@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/WdtXHd18","subscribed":false,"url":"https://trello.com/c/WdtXHd18/14-setup-apollo-client","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e8fee47134e6987492c398c","address":null,"checkItemStates":null,"closed":true,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-04-21T00:04:31.383Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e44c76e90700918899276fb","idMembersVoted":[],"idShort":23,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Add skeleton ui while loading","pos":131072,"shortLink":"2WBclQQw","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2u577u5p0ycpio4l0gc+0d68xdpyq0@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/2WBclQQw","subscribed":false,"url":"https://trello.com/c/2WBclQQw/23-add-skeleton-ui-while-loading","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e4e10d71bf47757f1b235fb","address":null,"checkItemStates":null,"closed":true,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-02-21T05:48:56.798Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e44c76e90700918899276fb","idMembersVoted":[],"idShort":16,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Setup user database and schema","pos":147456,"shortLink":"MCILOAsW","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2tv71fwvkvmnyumtw57+2ft1ym2okh@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/MCILOAsW","subscribed":false,"url":"https://trello.com/c/MCILOAsW/16-setup-user-database-and-schema","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e9203421b2dd46f0c253188","address":null,"checkItemStates":null,"closed":true,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-04-21T00:04:33.625Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e44c76e90700918899276fb","idMembersVoted":[],"idShort":24,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Optimistic ui updates for card creation, deletion, and updates","pos":147456,"shortLink":"GSHTwvh7","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2u5ilp4wontoc02jxc8+1wubloz0l0@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/GSHTwvh7","subscribed":false,"url":"https://trello.com/c/GSHTwvh7/24-optimistic-ui-updates-for-card-creation-deletion-and-updates","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e4e10c6f8a6c16e795370ea","address":null,"checkItemStates":null,"closed":true,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-02-21T05:48:52.644Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e44c76e90700918899276fb","idMembersVoted":[],"idShort":15,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Setup react router","pos":155648,"shortLink":"0GXOHETg","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2tv71e61uv0o4tf092i+18xpjodxnm@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/0GXOHETg","subscribed":false,"url":"https://trello.com/c/0GXOHETg/15-setup-react-router","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e92035480a07e8d24c439dd","address":null,"checkItemStates":null,"closed":true,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-04-21T00:04:34.787Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e44c76e90700918899276fb","idMembersVoted":[],"idShort":25,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Optimistic updates for list creation, deletion, and updates","pos":163840,"shortLink":"LgN7ZbB5","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2u5ilr4ix2fmb6ls2ql+2i0qmas73c@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/LgN7ZbB5","subscribed":false,"url":"https://trello.com/c/LgN7ZbB5/25-optimistic-updates-for-list-creation-deletion-and-updates","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5ed522eb474caf8b0c88c201","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-15T00:20:12.557Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e8fee0a6929af2165f46268","idMembersVoted":[],"idShort":33,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Refactor cards into single component","pos":2048,"shortLink":"sxpapv6h","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2ufpnvs4qbjncmx7lkx+1lriw89th0@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/sxpapv6h","subscribed":false,"url":"https://trello.com/c/sxpapv6h/33-refactor-cards-into-single-component","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5ed80cd925dc470f9e01c5b8","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-08T22:00:34.939Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e8fee0a6929af2165f46268","idMembersVoted":[],"idShort":48,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"User profile image","pos":4096,"shortLink":"C8tmNe8w","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2ug5li07eeuxxs611vc+05idfs6t5z@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/C8tmNe8w","subscribed":false,"url":"https://trello.com/c/C8tmNe8w/48-user-profile-image","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e9e38797ccd9b62aa1234d3","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-01T15:46:13.995Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e8fee0a6929af2165f46268","idMembersVoted":[],"idShort":26,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Refactor Lists data structure","pos":8192,"shortLink":"c72gKy8G","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2u7dczal3p7m3ezeswj+0h3va88c2t@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/c72gKy8G","subscribed":false,"url":"https://trello.com/c/c72gKy8G/26-refactor-lists-data-structure","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e44c77a78670f1251f737aa","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-04-10T03:54:53.413Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e8fee0a6929af2165f46268","idMembersVoted":[],"idShort":8,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Login Screen (authentication framework)","pos":16384,"shortLink":"bKdufEVZ","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2tts99a1uqcfwxwxzu2+01r9656stp@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/bKdufEVZ","subscribed":false,"url":"https://trello.com/c/bKdufEVZ/8-login-screen-authentication-framework","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e9e38d88121a869f68c7c24","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-01T15:46:15.971Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e8fee0a6929af2165f46268","idMembersVoted":[],"idShort":32,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Add project creation","pos":20480,"shortLink":"qfSzCNie","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2u7dd9khp0woy2lw4kk+0u4ejld9ec@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/qfSzCNie","subscribed":false,"url":"https://trello.com/c/qfSzCNie/32-add-project-creation","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e9e38b487660e6120d61dee","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-01T15:46:12.171Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e8fee0a6929af2165f46268","idMembersVoted":[],"idShort":29,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Get assignees to update on lists when changed","pos":24576,"shortLink":"YVnjFT8V","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2u7dd5ofqihr5kdl5v2+1lmckblawv@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/YVnjFT8V","subscribed":false,"url":"https://trello.com/c/YVnjFT8V/29-get-assignees-to-update-on-lists-when-changed","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e4e10dbc6cf736df3db165e","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-03T21:18:21.909Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e8fee0a6929af2165f46268","idMembersVoted":[],"idShort":17,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Setup sqlc","pos":32768,"shortLink":"G5BWtqrA","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":2,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2tv71gf1pr0dpw9pg0u+2bf5r64pa1@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/G5BWtqrA","subscribed":false,"url":"https://trello.com/c/G5BWtqrA/17-setup-sqlc","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[{"bytes":4436,"date":"2020-06-03T21:07:12.960Z","edgeColor":null,"idMember":"55642875ac2f713188495fc7","isUpload":true,"mimeType":"image/svg+xml","name":"undraw_no_data_qbuo.min.svg","previews":[],"url":"https://trello-attachments.s3.amazonaws.com/5cd4b4281203593b4b18a94d/5e4e10dbc6cf736df3db165e/2032ef5296c39987b5e7ba934f0dadd8/undraw_no_data_qbuo.min.svg","pos":16384,"id":"5ed81100f84f3247ce8ca993"},{"bytes":6873,"date":"2020-06-03T21:18:21.693Z","edgeColor":null,"idMember":"55642875ac2f713188495fc7","isUpload":true,"mimeType":"image/svg+xml","name":"undraw_access_account_99n5.svg","previews":[],"url":"https://trello-attachments.s3.amazonaws.com/5cd4b4281203593b4b18a94d/5e4e10dbc6cf736df3db165e/6e83232946b3a8a7e9dfcbde060eda58/undraw_access_account_99n5.svg","pos":32768,"id":"5ed8139d9208a91570f4097a"}],"pluginData":[],"customFieldItems":[]},{"id":"5e9e389e53dac53a9f9f999d","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-01T15:46:10.549Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e8fee0a6929af2165f46268","idMembersVoted":[],"idShort":27,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Add task labels","pos":36864,"shortLink":"bct4Mo7m","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2u7dd3a082xdur4rmal+03y3z1w661@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/bct4Mo7m","subscribed":false,"url":"https://trello.com/c/bct4Mo7m/27-add-task-labels","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e9e38c9c35ac446a3fcb6ed","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-01T15:46:06.137Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e8fee0a6929af2165f46268","idMembersVoted":[],"idShort":30,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Add project tasks","pos":40960,"shortLink":"oVRLd9kz","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2u7dd7z3pca35iwcmwd+1sfv6c6nbr@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/oVRLd9kz","subscribed":false,"url":"https://trello.com/c/oVRLd9kz/30-add-project-tasks","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e4e10eda043d40c3d66f055","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-04-10T03:55:18.124Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e8fee0a6929af2165f46268","idMembersVoted":[],"idShort":18,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Add api key for __graphql","pos":49152,"shortLink":"010DMyE3","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2tv71icjb39afzcde1h+0g5of64tcq@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/010DMyE3","subscribed":false,"url":"https://trello.com/c/010DMyE3/18-add-api-key-for-graphql","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e4f6f5bdbdbc13c9b2acf35","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-04-10T03:55:20.180Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e8fee0a6929af2165f46268","idMembersVoted":[],"idShort":19,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Setup silent refresh","pos":65536,"shortLink":"6Pd7SuQq","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2tveizmqq2mp74s9rg5+27ohfjel80@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/6Pd7SuQq","subscribed":false,"url":"https://trello.com/c/6Pd7SuQq/19-setup-silent-refresh","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e4f6f63356b1a83e9726565","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-04-10T03:55:22.314Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e8fee0a6929af2165f46268","idMembersVoted":[],"idShort":20,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Convert to typescript","pos":81920,"shortLink":"ypwmMs6H","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2tvej0fcswbuo5y85t1+0jha02vtaf@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/ypwmMs6H","subscribed":false,"url":"https://trello.com/c/ypwmMs6H/20-convert-to-typescript","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e4f6f6aa1d02f4bd2e383f0","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-04-10T03:55:24.380Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e8fee0a6929af2165f46268","idMembersVoted":[],"idShort":21,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Setup graphql code gen","pos":98304,"shortLink":"CFL4DG25","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2tvej1896xj72kbgq9c+0ozom0lx4b@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/CFL4DG25","subscribed":false,"url":"https://trello.com/c/CFL4DG25/21-setup-graphql-code-gen","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e44c7a71302ac65351673f9","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-04-11T17:49:06.114Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e8fee0a6929af2165f46268","idMembersVoted":[],"idShort":12,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Kanban board for projects","pos":114688,"shortLink":"JUHkJPyf","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2tts9e3p2z41hlpb6rd+0f0pwkwf3d@boards.trello.com","idChecklists":["5e44c7aacf5d6f316f35a4bf"],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/JUHkJPyf","subscribed":false,"url":"https://trello.com/c/JUHkJPyf/12-kanban-board-for-projects","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5e8fee3f02133c1b26d112d8","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-04-21T00:03:41.195Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5e8fee0a6929af2165f46268","idMembersVoted":[],"idShort":22,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Refactor react router layout","pos":131072,"shortLink":"CbHWnkxL","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2u577taae8h7zmp39aw+1y8a2cmf8s@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/CbHWnkxL","subscribed":false,"url":"https://trello.com/c/CbHWnkxL/22-refactor-react-router-layout","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5ed80cbeab74126d681ba2ef","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-03T20:49:02.052Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5ed80cb9b6906d6bbfce96b9","idMembersVoted":[],"idShort":46,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Card colors","pos":16384,"shortLink":"mLKvrBp9","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2ug5lf54htcb1mxb7cf+1kwwc5olpl@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/mLKvrBp9","subscribed":false,"url":"https://trello.com/c/mLKvrBp9/46-card-colors","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]},{"id":"5ed80cc143b0ff3db530ea56","address":null,"checkItemStates":null,"closed":false,"coordinates":null,"creationMethod":null,"dateLastActivity":"2020-06-03T20:49:05.511Z","desc":"","descData":null,"dueReminder":-1,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5ed80cb9b6906d6bbfce96b9","idMembersVoted":[],"idShort":47,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Image covers","pos":32768,"shortLink":"dHDjvlro","isTemplate":false,"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":0,"description":false,"due":null,"dueComplete":false},"dueComplete":false,"due":null,"email":"jordanthedev+2k8klodpfpyrloxcwcn+2ug5lff84zghvxl8ymu+03nh4tvc72@boards.trello.com","idChecklists":[],"idMembers":[],"labels":[],"limits":{"attachments":{"perCard":{"status":"ok","disableAt":1000,"warnAt":900}},"checklists":{"perCard":{"status":"ok","disableAt":500,"warnAt":450}},"stickers":{"perCard":{"status":"ok","disableAt":70,"warnAt":63}}},"shortUrl":"https://trello.com/c/dHDjvlro","subscribed":false,"url":"https://trello.com/c/dHDjvlro/47-image-covers","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"attachments":[],"pluginData":[],"customFieldItems":[]}],"labels":[{"id":"5cd4b42891d0c2ddc54e8bb3","idBoard":"5cd4b4281203593b4b18a94d","name":"API","color":"green"},{"id":"5cd4b42891d0c2ddc54e8bb4","idBoard":"5cd4b4281203593b4b18a94d","name":"Web","color":"yellow"},{"id":"5cd5aef21397931b939e099b","idBoard":"5cd4b4281203593b4b18a94d","name":"High Priority","color":"pink"},{"id":"5cd4b42891d0c2ddc54e8bb6","idBoard":"5cd4b4281203593b4b18a94d","name":"","color":"red"},{"id":"5cd4b42891d0c2ddc54e8bbb","idBoard":"5cd4b4281203593b4b18a94d","name":"","color":"purple"},{"id":"5cd4b42891d0c2ddc54e8bb5","idBoard":"5cd4b4281203593b4b18a94d","name":"","color":"orange"},{"id":"5cd4b42891d0c2ddc54e8bba","idBoard":"5cd4b4281203593b4b18a94d","name":"","color":"blue"}],"lists":[{"id":"5cd59079b20b0d05a3b4194b","name":"Resources","closed":false,"pos":32767.5,"softLimit":null,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"cards":{"openPerList":{"status":"ok","disableAt":5000,"warnAt":4500},"totalPerList":{"status":"ok","disableAt":1000000,"warnAt":900000}}},"subscribed":false},{"id":"5cd58dae0031290a391ce6ea","name":"Base Framework","closed":true,"pos":65535,"softLimit":null,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"cards":{"openPerList":{"status":"ok","disableAt":5000,"warnAt":4500},"totalPerList":{"status":"ok","disableAt":1000000,"warnAt":900000}}},"subscribed":true},{"id":"5cd58dbbc332358f7a866de2","name":"Develop 1.0.0","closed":true,"pos":131071,"softLimit":null,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"cards":{"openPerList":{"status":"ok","disableAt":5000,"warnAt":4500},"totalPerList":{"status":"ok","disableAt":1000000,"warnAt":900000}}},"subscribed":false},{"id":"5cd58dc208b043265cc3da49","name":"In Progress","closed":true,"pos":196607,"softLimit":null,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"cards":{"openPerList":{"status":"ok","disableAt":5000,"warnAt":4500},"totalPerList":{"status":"ok","disableAt":1000000,"warnAt":900000}}},"subscribed":false},{"id":"5edea5f897414365394f9bd0","name":"Phase 1 - Personal Launch","closed":false,"pos":221183.25,"softLimit":null,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"cards":{"openPerList":{"status":"ok","disableAt":5000,"warnAt":4500},"totalPerList":{"status":"ok","disableAt":1000000,"warnAt":900000}}},"subscribed":false},{"id":"5cd58dd76dd9c98f289967ab","name":"Needs Tested","closed":true,"pos":262143,"softLimit":null,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"cards":{"openPerList":{"status":"ok","disableAt":5000,"warnAt":4500},"totalPerList":{"status":"ok","disableAt":1000000,"warnAt":900000}}},"subscribed":false},{"id":"5edea5feb47e14523e480efd","name":"Phase 2 - Soft Launch","closed":false,"pos":315391.125,"softLimit":null,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"cards":{"openPerList":{"status":"ok","disableAt":5000,"warnAt":4500},"totalPerList":{"status":"ok","disableAt":1000000,"warnAt":900000}}},"subscribed":false},{"id":"5cd58ddb406e33822e14d20c","name":"Ready for Live","closed":true,"pos":327679,"softLimit":null,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"cards":{"openPerList":{"status":"ok","disableAt":5000,"warnAt":4500},"totalPerList":{"status":"ok","disableAt":1000000,"warnAt":900000}}},"subscribed":false},{"id":"5edea6020c603d88466b40c6","name":"Phase 3 - Hard Launch","closed":false,"pos":362495.0625,"softLimit":null,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"cards":{"openPerList":{"status":"ok","disableAt":5000,"warnAt":4500},"totalPerList":{"status":"ok","disableAt":1000000,"warnAt":900000}}},"subscribed":false},{"id":"5edea6112546eb4be8a1a55e","name":"Phase 4 - Optimizations/ Bugfixes","closed":false,"pos":386047.03125,"softLimit":null,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"cards":{"openPerList":{"status":"ok","disableAt":5000,"warnAt":4500},"totalPerList":{"status":"ok","disableAt":1000000,"warnAt":900000}}},"subscribed":false},{"id":"5cd58ddde4595e3df2a96f1d","name":"Live","closed":true,"pos":393215,"softLimit":null,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"cards":{"openPerList":{"status":"ok","disableAt":5000,"warnAt":4500},"totalPerList":{"status":"ok","disableAt":1000000,"warnAt":900000}}},"subscribed":true},{"id":"5e44c76e90700918899276fb","name":"MVP","closed":true,"pos":409599,"softLimit":null,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"cards":{"openPerList":{"status":"ok","disableAt":5000,"warnAt":4500},"totalPerList":{"status":"ok","disableAt":1000000,"warnAt":900000}}},"subscribed":false},{"id":"5e8fee0a6929af2165f46268","name":"Complete","closed":false,"pos":425983,"softLimit":null,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"cards":{"openPerList":{"status":"ok","disableAt":5000,"warnAt":4500},"totalPerList":{"status":"ok","disableAt":1000000,"warnAt":900000}}},"subscribed":false},{"id":"5e90e7ad7987ff83a09f1483","name":"a","closed":true,"pos":491519,"softLimit":null,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"cards":{"openPerList":{"status":"ok","disableAt":5000,"warnAt":4500},"totalPerList":{"status":"ok","disableAt":1000000,"warnAt":900000}}},"subscribed":false},{"id":"5ed80cb9b6906d6bbfce96b9","name":"Possible features","closed":false,"pos":507903,"softLimit":null,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"cards":{"openPerList":{"status":"ok","disableAt":5000,"warnAt":4500},"totalPerList":{"status":"ok","disableAt":1000000,"warnAt":900000}}},"subscribed":false}],"members":[{"id":"55642875ac2f713188495fc7","bio":"I'm a full stack developer","bioData":{"emoji":{}},"confirmed":true,"memberType":"normal","username":"jordanthedev","activityBlocked":false,"avatarHash":"401e5e13083571c3a689fbf870657eac","avatarUrl":"https://trello-members.s3.amazonaws.com/55642875ac2f713188495fc7/401e5e13083571c3a689fbf870657eac","fullName":"Jordan Knott","idEnterprise":null,"idEnterprisesDeactivated":[],"idMemberReferrer":null,"idPremOrgsAdmin":[],"initials":"JK","nonPublic":{},"nonPublicAvailable":false,"products":[],"url":"https://trello.com/jordanthedev","status":"disconnected"}],"checklists":[{"id":"5ed8094c0820e8522a80ff5f","name":"Checklist","idCard":"5ed8094a3ecb5e248bec0848","pos":16384,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"checkItems":{"perChecklist":{"status":"ok","disableAt":200,"warnAt":180}}},"checkItems":[{"idChecklist":"5ed8094c0820e8522a80ff5f","state":"incomplete","idMember":null,"id":"5ed80952f5856714a57fd5a3","name":"Tasks","nameData":null,"pos":16384,"due":null},{"idChecklist":"5ed8094c0820e8522a80ff5f","state":"incomplete","idMember":null,"id":"5ed80955112fa83e3fbc382d","name":"Task groups","nameData":null,"pos":32768,"due":null},{"idChecklist":"5ed8094c0820e8522a80ff5f","state":"incomplete","idMember":null,"id":"5ed8096232aa4233d208c91f","name":"Project","nameData":null,"pos":49152,"due":null},{"idChecklist":"5ed8094c0820e8522a80ff5f","state":"incomplete","idMember":null,"id":"5ed8096655e87051c2c857a6","name":"Project labels","nameData":null,"pos":65536,"due":null},{"idChecklist":"5ed8094c0820e8522a80ff5f","state":"incomplete","idMember":null,"id":"5ed8096b1c5b9047ecd4221f","name":"Project members","nameData":null,"pos":81920,"due":null}]},{"id":"5e44c7aacf5d6f316f35a4bf","name":"Checklist","idCard":"5e44c7a71302ac65351673f9","pos":16384,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"checkItems":{"perChecklist":{"status":"ok","disableAt":200,"warnAt":180}}},"checkItems":[]},{"id":"5e44c7c0681a7a0fc5d898c7","name":"Checklist","idCard":"5e44c7bd94d5ea5d1ed58b85","pos":16384,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"checkItems":{"perChecklist":{"status":"ok","disableAt":200,"warnAt":180}}},"checkItems":[{"idChecklist":"5e44c7c0681a7a0fc5d898c7","state":"complete","idMember":null,"id":"5e44c7c6260b3918dd44867e","name":"Description","nameData":null,"pos":16384,"due":null},{"idChecklist":"5e44c7c0681a7a0fc5d898c7","state":"incomplete","idMember":null,"id":"5e44c7c9677c3d4482861236","name":"Due date","nameData":null,"pos":32768,"due":null},{"idChecklist":"5e44c7c0681a7a0fc5d898c7","state":"incomplete","idMember":null,"id":"5e44c7cbf2ff420fb8822567","name":"Labels","nameData":null,"pos":49152,"due":null},{"idChecklist":"5e44c7c0681a7a0fc5d898c7","state":"complete","idMember":null,"id":"5e44c7ce0df8155ba7f2fac7","name":"Assignees","nameData":null,"pos":65536,"due":null},{"idChecklist":"5e44c7c0681a7a0fc5d898c7","state":"complete","idMember":null,"id":"5e44c7ef54cd6e4fef963eda","name":"Title","nameData":null,"pos":81920,"due":null},{"idChecklist":"5e44c7c0681a7a0fc5d898c7","state":"complete","idMember":null,"id":"5e44c8024d5db7736cc4ec00","name":"Archivable","nameData":null,"pos":98304,"due":null},{"idChecklist":"5e44c7c0681a7a0fc5d898c7","state":"incomplete","idMember":null,"id":"5e44c8072b3cf87eb0e26eea","name":"Checklists","nameData":null,"pos":114688,"due":null}]},{"id":"5e92049e4f53b778d25dfd5e","name":"Checklist","idCard":"5e44c79ddc1e680d8a4e566c","pos":16384,"creationMethod":null,"idBoard":"5cd4b4281203593b4b18a94d","limits":{"checkItems":{"perChecklist":{"status":"ok","disableAt":200,"warnAt":180}}},"checkItems":[{"idChecklist":"5e92049e4f53b778d25dfd5e","state":"incomplete","idMember":null,"id":"5e9204a2d879ad7528758d24","name":"Creation","nameData":null,"pos":16384,"due":null},{"idChecklist":"5e92049e4f53b778d25dfd5e","state":"incomplete","idMember":null,"id":"5e9204a6e5275e7602612b0a","name":"Title update","nameData":null,"pos":32768,"due":null},{"idChecklist":"5e92049e4f53b778d25dfd5e","state":"incomplete","idMember":null,"id":"5e9204a8d638fd4ee107de07","name":"Deletion","nameData":null,"pos":49152,"due":null}]}],"customFields":[],"memberships":[{"id":"5cd4b4281203593b4b18a94e","idMember":"55642875ac2f713188495fc7","memberType":"admin","unconfirmed":false,"deactivated":false}],"pluginData":[{"id":"5ee7eca947569960dc927450","idPlugin":"55a5d917446f517774210011","scope":"board","idModel":"5cd4b4281203593b4b18a94d","value":"{\"dateAutoEnabled\":1592257670144}","access":"shared"}]}00:23:16.352Z","desc":"","descData":null,"dueReminder":null,"idBoard":"5cd4b4281203593b4b18a94d","idLabels":[],"idList":"5edea5f897414365394f9bd0","idMembersVoted":[],"idShort":54,"idAttachmentCover":null,"locationName":null,"manualCoverAttachment":false,"name":"Migrate often used components in diff --git a/web/codegen.yml b/web/codegen.yml index 3061ad2..fabf6a6 100644 --- a/web/codegen.yml +++ b/web/codegen.yml @@ -1,7 +1,9 @@ overwrite: true schema: - '../api/graph/schema.graphqls' -documents: 'src/shared/graphql/*.graphqls' +documents: + - 'src/shared/graphql/*.graphqls' + - 'src/shared/graphql/**/*.ts' generates: src/shared/generated/graphql.tsx: plugins: diff --git a/web/src/App/BaseStyles.ts b/web/src/App/BaseStyles.ts index 329e9fa..ee88068 100644 --- a/web/src/App/BaseStyles.ts +++ b/web/src/App/BaseStyles.ts @@ -112,7 +112,7 @@ export default createGlobalStyle` } ::-webkit-scrollbar { - width: 12px; + width: 10px; } ::-webkit-scrollbar-track { diff --git a/web/src/App/Routes.tsx b/web/src/App/Routes.tsx index 58f4bab..ecdf42d 100644 --- a/web/src/App/Routes.tsx +++ b/web/src/App/Routes.tsx @@ -10,9 +10,12 @@ import Profile from 'Profile'; import styled from 'styled-components'; const MainContent = styled.div` - padding: 0 0 50px 80px; + padding: 0 0 0 80px; background: #262c49; height: 100%; + display: flex; + flex-direction: column; + flex-grow: 1; `; type RoutesProps = { history: H.History; diff --git a/web/src/App/ThemeStyles.ts b/web/src/App/ThemeStyles.ts index a16961f..a50642f 100644 --- a/web/src/App/ThemeStyles.ts +++ b/web/src/App/ThemeStyles.ts @@ -26,23 +26,3 @@ const theme: DefaultTheme = { }; export { theme }; - -export default createGlobalStyle` - :root { - --color-text: #c2c6dc; - --color-text-hover: #fff; - --color-primary: rgba(115, 103, 240); - --color-button-text: #c2c6dc; - --color-button-text-hover: #fff; - --color-button-background: rgba(115, 103, 240); - - --color-background: #262c49; - --color-background-dark: #10163a; - - --color-input-text: #c2c6dc; - --color-input-text-focus: #fff; - - --color-icon: #c2c6dc; - --color-active-icon: rgba(115, 103, 240); - } -`; diff --git a/web/src/App/index.tsx b/web/src/App/index.tsx index e34af90..502df34 100644 --- a/web/src/App/index.tsx +++ b/web/src/App/index.tsx @@ -5,7 +5,7 @@ import { setAccessToken } from 'shared/utils/accessToken'; import styled, { ThemeProvider } from 'styled-components'; import NormalizeStyles from './NormalizeStyles'; import BaseStyles from './BaseStyles'; -import ThemeStyles, { theme } from './ThemeStyles'; +import { theme } from './ThemeStyles'; import Routes from './Routes'; import { UserIDContext } from './context'; import Navbar from './Navbar'; @@ -44,7 +44,6 @@ const App = () => { - {loading ? (
loading
diff --git a/web/src/Projects/Project/Details/index.tsx b/web/src/Projects/Project/Details/index.tsx index 39c483e..2d025e2 100644 --- a/web/src/Projects/Project/Details/index.tsx +++ b/web/src/Projects/Project/Details/index.tsx @@ -9,10 +9,16 @@ import { useUpdateTaskDueDateMutation, useAssignTaskMutation, useUnassignTaskMutation, + useSetTaskChecklistItemCompleteMutation, + useDeleteTaskChecklistItemMutation, + useUpdateTaskChecklistItemNameMutation, + useCreateTaskChecklistItemMutation, + FindTaskDocument, } from 'shared/generated/graphql'; import UserIDContext from 'App/context'; import MiniProfile from 'shared/components/MiniProfile'; import DueDateManager from 'shared/components/DueDateManager'; +import produce from 'immer'; type DetailsProps = { taskID: string; @@ -43,6 +49,64 @@ const Details: React.FC = ({ const match = useRouteMatch(); const [currentMemberTask, setCurrentMemberTask] = useState(''); const [memberPopupData, setMemberPopupData] = useState(initialMemberPopupState); + const [setTaskChecklistItemComplete] = useSetTaskChecklistItemCompleteMutation(); + const [updateTaskChecklistItemName] = useUpdateTaskChecklistItemNameMutation(); + const [deleteTaskChecklistItem] = useDeleteTaskChecklistItemMutation({ + update: (client, deleteData) => { + const cacheData: any = client.readQuery({ + query: FindTaskDocument, + variables: { taskID }, + }); + console.log(deleteData); + const newData = produce(cacheData.findTask, (draftState: any) => { + const idx = draftState.checklists.findIndex( + (checklist: TaskChecklist) => + checklist.id === deleteData.data.deleteTaskChecklistItem.taskChecklistItem.taskChecklistID, + ); + console.log(`idx ${idx}`); + if (idx !== -1) { + draftState.checklists[idx].items = cacheData.findTask.checklists[idx].items.filter( + (item: any) => item.id !== deleteData.data.deleteTaskChecklistItem.taskChecklistItem.id, + ); + } + }); + client.writeQuery({ + query: FindTaskDocument, + variables: { taskID }, + data: { + findTask: newData, + }, + }); + }, + }); + const [createTaskChecklistItem] = useCreateTaskChecklistItemMutation({ + update: (client, newTaskItem) => { + const cacheData: any = client.readQuery({ + query: FindTaskDocument, + variables: { taskID }, + }); + console.log(cacheData); + console.log(newTaskItem); + const newData = produce(cacheData.findTask, (draftState: any) => { + const idx = draftState.checklists.findIndex( + (checklist: TaskChecklist) => checklist.id === newTaskItem.data.createTaskChecklistItem.taskChecklistID, + ); + if (idx !== -1) { + draftState.checklists[idx].items = [ + ...cacheData.findTask.checklists[idx].items, + { ...newTaskItem.data.createTaskChecklistItem }, + ]; + } + }); + client.writeQuery({ + query: FindTaskDocument, + variables: { taskID }, + data: { + findTask: newData, + }, + }); + }, + }); const { loading, data, refetch } = useFindTaskQuery({ variables: { taskID } }); const [updateTaskDueDate] = useUpdateTaskDueDateMutation({ onCompleted: () => { @@ -83,7 +147,19 @@ const Details: React.FC = ({ onTaskNameChange={onTaskNameChange} onTaskDescriptionChange={onTaskDescriptionChange} onDeleteTask={onDeleteTask} + onChangeItemName={(itemID, itemName) => { + updateTaskChecklistItemName({ variables: { taskChecklistItemID: itemID, name: itemName } }); + }} onCloseModal={() => history.push(projectURL)} + onDeleteItem={itemID => { + deleteTaskChecklistItem({ variables: { taskChecklistItemID: itemID } }); + }} + onToggleChecklistItem={(itemID, complete) => { + setTaskChecklistItemComplete({ variables: { taskChecklistItemID: itemID, complete } }); + }} + onAddItem={(taskChecklistID, name, position) => { + createTaskChecklistItem({ variables: { taskChecklistID, name, position } }); + }} onMemberProfile={($targetRef, memberID) => { const member = data.findTask.assigned.find(m => m.id === memberID); const profileIcon = member ? member.profileIcon : null; @@ -124,7 +200,6 @@ const Details: React.FC = ({ onOpenDueDatePopop={(task, $targetRef) => { showPopup( $targetRef, - = ({ > { + updateTaskDueDate({ variables: { taskID: t.id, dueDate: null } }); + hidePopup(); + }} onDueDateChange={(t, newDueDate) => { - console.log(`${newDueDate}`); updateTaskDueDate({ variables: { taskID: t.id, dueDate: newDueDate } }); hidePopup(); }} diff --git a/web/src/Projects/Project/index.tsx b/web/src/Projects/Project/index.tsx index ac796d3..ef07899 100644 --- a/web/src/Projects/Project/index.tsx +++ b/web/src/Projects/Project/index.tsx @@ -5,9 +5,11 @@ import { Bolt, ToggleOn, Tags } from 'shared/icons'; import { usePopup, Popup } from 'shared/components/PopupMenu'; import { useParams, Route, useRouteMatch, useHistory, RouteComponentProps } from 'react-router-dom'; import { + useSetTaskCompleteMutation, useToggleTaskLabelMutation, useUpdateProjectNameMutation, useFindProjectQuery, + useUpdateTaskGroupNameMutation, useUpdateTaskNameMutation, useUpdateProjectLabelMutation, useCreateTaskMutation, @@ -23,6 +25,7 @@ import { FindProjectDocument, useCreateProjectLabelMutation, useUnassignTaskMutation, + useUpdateTaskDueDateMutation, } from 'shared/generated/graphql'; import TaskAssignee from 'shared/components/TaskAssignee'; @@ -40,6 +43,7 @@ import MiniProfile from 'shared/components/MiniProfile'; import Details from './Details'; import { useApolloClient } from '@apollo/react-hooks'; import UserIDContext from 'App/context'; +import DueDateManager from 'shared/components/DueDateManager'; const getCacheData = (client: any, projectID: string) => { const cacheData: any = client.readQuery({ @@ -69,6 +73,7 @@ interface QuickCardEditorState { isOpen: boolean; left: number; top: number; + width: number; taskID: string | null; taskGroupID: string | null; } @@ -209,6 +214,7 @@ const initialQuickCardEditorState: QuickCardEditorState = { isOpen: false, top: 0, left: 0, + width: 272, }; const ProjectBar = styled.div` @@ -367,12 +373,36 @@ const Project = () => { if (taskGroup) { let position = 65535; if (taskGroup.tasks.length !== 0) { - const [lastTask] = taskGroup.tasks.sort((a: any, b: any) => a.position - b.position).slice(-1); + const [lastTask] = taskGroup.tasks + .slice() + .sort((a: any, b: any) => a.position - b.position) + .slice(-1); position = Math.ceil(lastTask.position) * 2 + 1; } console.log(`position ${position}`); - createTask({ variables: { taskGroupID, name, position } }); + createTask({ + variables: { taskGroupID, name, position }, + optimisticResponse: { + __typename: 'Mutation', + createTask: { + __typename: 'Task', + id: '' + Math.round(Math.random() * -1000000), + name: name, + taskGroup: { + __typename: 'TaskGroup', + id: taskGroup.id, + name: taskGroup.name, + position: taskGroup.position, + }, + position: position, + dueDate: null, + description: null, + labels: [], + assigned: [], + }, + }, + }); } } }; @@ -410,6 +440,10 @@ const Project = () => { const [assignTask] = useAssignTaskMutation(); const [unassignTask] = useUnassignTaskMutation(); + const [updateTaskGroupName] = useUpdateTaskGroupNameMutation({}); + + const [updateTaskDueDate] = useUpdateTaskDueDateMutation(); + const [updateProjectName] = useUpdateProjectNameMutation({ update: (client, newName) => { const cacheData = getCacheData(client, projectID); @@ -421,6 +455,8 @@ const Project = () => { }, }); + const [setTaskComplete] = useSetTaskCompleteMutation(); + const client = useApolloClient(); const { userID } = useContext(UserIDContext); @@ -441,6 +477,7 @@ const Project = () => { ); } if (data) { + console.log(data.findProject); const onQuickEditorOpen = (e: ContextMenuEvent) => { const taskGroup = data.findProject.taskGroups.find(t => t.id === e.taskGroupID); const currentTask = taskGroup ? taskGroup.tasks.find(t => t.id === e.taskID) : null; @@ -448,6 +485,7 @@ const Project = () => { setQuickCardEditor({ top: e.top, left: e.left, + width: e.width, isOpen: true, taskID: currentTask.id, taskGroupID: currentTask.taskGroup.id, @@ -567,7 +605,9 @@ const Project = () => { , ); }} - onChangeTaskGroupName={(taskGroupID, name) => {}} + onChangeTaskGroupName={(taskGroupID, name) => { + updateTaskGroupName({ variables: { taskGroupID, name } }); + }} onQuickEditorOpen={onQuickEditorOpen} onExtraMenuOpen={(taskGroupID: string, $targetRef: any) => { showPopup( @@ -660,8 +700,37 @@ const Project = () => { }, }) } + onOpenDueDatePopup={($targetRef, task) => { + showPopup( + $targetRef, + { + hidePopup(); + }} + > + { + updateTaskDueDate({ variables: { taskID: t.id, dueDate: null } }); + hidePopup(); + }} + onDueDateChange={(t, newDueDate) => { + updateTaskDueDate({ variables: { taskID: t.id, dueDate: newDueDate } }); + hidePopup(); + }} + onCancel={() => {}} + /> + , + ); + }} + onToggleComplete={task => { + setTaskComplete({ variables: { taskID: task.id, complete: !task.complete } }); + }} top={quickCardEditor.top} left={quickCardEditor.left} + width={quickCardEditor.width} /> )} ; +}; + +type TaskChecklistItem = { + id: string; + complete: boolean; + position: number; + name: string; + taskChecklistID: string; + assigned?: null | TaskUser; + dueDate?: null | string; +}; + type Task = { id: string; taskGroup: InnerTaskGroup; name: string; position: number; dueDate?: string; + complete?: boolean; labels: TaskLabel[]; description?: string | null; assigned?: Array; + checklists?: Array | null; }; type Project = { diff --git a/web/src/shared/components/AddList/Styles.ts b/web/src/shared/components/AddList/Styles.ts index 09b50fc..e29da6e 100644 --- a/web/src/shared/components/AddList/Styles.ts +++ b/web/src/shared/components/AddList/Styles.ts @@ -3,7 +3,15 @@ import TextareaAutosize from 'react-autosize-textarea/lib'; import { mixin } from 'shared/utils/styles'; import Button from 'shared/components/Button'; -export const Container = styled.div``; +export const Container = styled.div` + width: 272px; + margin: 0 4px; + height: 100%; + box-sizing: border-box; + display: inline-block; + vertical-align: top; + white-space: nowrap; +`; export const Wrapper = styled.div<{ editorOpen: boolean }>` display: inline-block; diff --git a/web/src/shared/components/AddList/index.tsx b/web/src/shared/components/AddList/index.tsx index e9d9272..999991a 100644 --- a/web/src/shared/components/AddList/index.tsx +++ b/web/src/shared/components/AddList/index.tsx @@ -62,7 +62,7 @@ const NameEditor: React.FC = ({ onSave, onCancel }) => { Save onCancel()}> - + diff --git a/web/src/shared/components/Card/Styles.ts b/web/src/shared/components/Card/Styles.ts index ce17e58..c4339f8 100644 --- a/web/src/shared/components/Card/Styles.ts +++ b/web/src/shared/components/Card/Styles.ts @@ -2,6 +2,7 @@ import styled, { css } from 'styled-components'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { mixin } from 'shared/utils/styles'; import TextareaAutosize from 'react-autosize-textarea'; +import { CheckCircle } from 'shared/icons'; import { RefObject } from 'react'; export const ClockIcon = styled(FontAwesomeIcon)``; @@ -20,9 +21,9 @@ export const EditorTextarea = styled(TextareaAutosize)` max-height: 162px; min-height: 54px; padding: 0; - font-size: 16px; - line-height: 20px; - color: rgba(${props => props.theme.colors.text.secondary}); + font-size: 14px; + line-height: 16px; + color: rgba(${props => props.theme.colors.text.primary}); &:focus { border: none; outline: none; @@ -92,11 +93,13 @@ export const ListCardInnerContainer = styled.div` height: 100%; `; -export const ListCardDetails = styled.div` +export const ListCardDetails = styled.div<{ complete: boolean }>` overflow: hidden; padding: 6px 8px 2px; position: relative; z-index: 10; + + ${props => props.complete && 'opacity: 0.6;'} `; export const ListCardLabels = styled.div` @@ -140,15 +143,28 @@ export const ListCardOperation = styled.span` export const CardTitle = styled.span` clear: both; - display: block; margin: 0 0 4px; overflow: hidden; text-decoration: none; word-wrap: break-word; + line-height: 16px; + font-size: 14px; color: rgba(${props => props.theme.colors.text.primary}); + + display: flex; + align-items: center; `; export const CardMembers = styled.div` float: right; margin: 0 -2px 4px 0; `; + +export const CompleteIcon = styled(CheckCircle)` + fill: rgba(${props => props.theme.colors.success}); + margin-right: 4px; +`; + +export const EditorContent = styled.div` + display: flex; +`; diff --git a/web/src/shared/components/Card/index.tsx b/web/src/shared/components/Card/index.tsx index 88a3ddc..a423637 100644 --- a/web/src/shared/components/Card/index.tsx +++ b/web/src/shared/components/Card/index.tsx @@ -5,6 +5,8 @@ import { faPencilAlt, faList } from '@fortawesome/free-solid-svg-icons'; import { faClock, faCheckSquare, faEye } from '@fortawesome/free-regular-svg-icons'; import { EditorTextarea, + EditorContent, + CompleteIcon, DescriptionBadge, DueDateCardBadge, ListCardBadges, @@ -35,6 +37,7 @@ type Props = { title: string; taskID: string; taskGroupID: string; + complete?: boolean; onContextMenu?: (e: ContextMenuEvent) => void; onClick?: (e: React.MouseEvent) => void; description?: null | string; @@ -57,6 +60,7 @@ const Card = React.forwardRef( onContextMenu, taskID, taskGroupID, + complete, onClick, labels, title, @@ -101,6 +105,7 @@ const Card = React.forwardRef( const pos = $innerCardRef.current.getBoundingClientRect(); if (onContextMenu) { onContextMenu({ + width: pos.width, top: pos.top, left: pos.left, taskGroupID, @@ -140,7 +145,7 @@ const Card = React.forwardRef( )} - + {labels && labels.map(label => ( @@ -150,22 +155,28 @@ const Card = React.forwardRef( ))} {editable ? ( - { - setCardTitle(e.currentTarget.value); - if (onCardTitleChange) { - onCardTitleChange(e.currentTarget.value); - } - }} - onClick={e => { - e.stopPropagation(); - }} - onKeyDown={handleKeyDown} - value={currentCardTitle} - ref={$editorRef} - /> + + {complete && } + { + setCardTitle(e.currentTarget.value); + if (onCardTitleChange) { + onCardTitleChange(e.currentTarget.value); + } + }} + onClick={e => { + e.stopPropagation(); + }} + onKeyDown={handleKeyDown} + value={currentCardTitle} + ref={$editorRef} + /> + ) : ( - {title} + + {complete && } + {title} + )} {watched && ( diff --git a/web/src/shared/components/Checklist/Checklist.stories.tsx b/web/src/shared/components/Checklist/Checklist.stories.tsx new file mode 100644 index 0000000..e845365 --- /dev/null +++ b/web/src/shared/components/Checklist/Checklist.stories.tsx @@ -0,0 +1,138 @@ +import React, { useState } from 'react'; +import { action } from '@storybook/addon-actions'; +import BaseStyles from 'App/BaseStyles'; +import NormalizeStyles from 'App/NormalizeStyles'; +import { theme } from 'App/ThemeStyles'; +import produce from 'immer'; +import styled, { ThemeProvider } from 'styled-components'; +import Checklist from '.'; + +export default { + component: Checklist, + title: 'Checklist', + parameters: { + backgrounds: [ + { name: 'gray', value: '#f8f8f8', default: true }, + { name: 'white', value: '#ffffff' }, + ], + }, +}; + +const Container = styled.div` + width: 552px; + margin: 25px; + border: 1px solid rgba(${props => props.theme.colors.bg.primary}); +`; + +const defaultItems = [ + { + id: '1', + position: 1, + taskChecklistID: '1', + complete: false, + name: 'Tasks', + assigned: null, + dueDate: null, + }, + { + id: '2', + taskChecklistID: '1', + position: 2, + complete: false, + name: 'Projects', + assigned: null, + dueDate: null, + }, + { + id: '3', + position: 3, + taskChecklistID: '1', + complete: false, + name: 'Teams', + assigned: null, + dueDate: null, + }, + { + id: '4', + position: 4, + complete: false, + taskChecklistID: '1', + name: 'Organizations', + assigned: null, + dueDate: null, + }, +]; + +export const Default = () => { + const [checklistName, setChecklistName] = useState('Checklist'); + const [items, setItems] = useState(defaultItems); + const onToggleItem = (itemID: string, complete: boolean) => { + setItems( + produce(items, draftState => { + const idx = items.findIndex(item => item.id === itemID); + if (idx !== -1) { + draftState[idx] = { + ...draftState[idx], + complete, + }; + } + }), + ); + }; + return ( + <> + + + + + { + setChecklistName(currentName); + }} + onAddItem={itemName => { + let position = 1; + const lastItem = items[-1]; + if (lastItem) { + position = lastItem.position * 2 + 1; + } + setItems([ + ...items, + { + id: `${Math.random()}`, + name: itemName, + complete: false, + assigned: null, + dueDate: null, + position, + taskChecklistID: '1', + }, + ]); + }} + onDeleteItem={itemID => { + console.log(`itemID ${itemID}`); + setItems(items.filter(item => item.id !== itemID)); + }} + onChangeItemName={(itemID, currentName) => { + setItems( + produce(items, draftState => { + const idx = items.findIndex(item => item.id === itemID); + if (idx !== -1) { + draftState[idx] = { + ...draftState[idx], + name: currentName, + }; + } + }), + ); + }} + onToggleItem={onToggleItem} + /> + + + + ); +}; diff --git a/web/src/shared/components/Checklist/index.tsx b/web/src/shared/components/Checklist/index.tsx new file mode 100644 index 0000000..85b1f0f --- /dev/null +++ b/web/src/shared/components/Checklist/index.tsx @@ -0,0 +1,596 @@ +import React, { useState, useRef, useEffect } from 'react'; +import styled from 'styled-components'; +import { CheckSquare, Trash, Square, CheckSquareOutline, Clock, Cross, AccountPlus } from 'shared/icons'; +import Button from 'shared/components/Button'; +import TextareaAutosize from 'react-autosize-textarea'; +import Control from 'react-select/src/components/Control'; +import useOnOutsideClick from 'shared/hooks/onOutsideClick'; + +const Wrapper = styled.div` + margin-bottom: 24px; +`; + +const WindowTitle = styled.div` + padding: 8px 0; + position: relative; + margin: 0 0 4px 40px; +`; + +const WindowTitleIcon = styled(CheckSquareOutline)` + top: 10px; + left: -40px; + position: absolute; +`; + +const WindowChecklistTitle = styled.div` + display: flex; + justify-content: space-between; + align-items: center; + flex-flow: row wrap; +`; + +const WindowTitleText = styled.h3` + cursor: pointer; + color: rgba(${props => props.theme.colors.text.primary}); + margin: 6px 0; + display: inline-block; + width: auto; + min-height: 18px; + font-size: 16px; + line-height: 20px; + min-width: 40px; +`; + +const WindowOptions = styled.div` + margin: 0 2px 0 auto; + float: right; +`; + +const DeleteButton = styled(Button)` + padding: 6px 12px; +`; + +const ChecklistProgress = styled.div` + margin-bottom: 6px; + position: relative; +`; +const ChecklistProgressPercent = styled.span` + color: #5e6c84; + font-size: 11px; + line-height: 10px; + position: absolute; + left: 5px; + top: -1px; + text-align: center; + width: 32px; +`; + +const ChecklistProgressBar = styled.div` + background: rgba(${props => props.theme.colors.bg.primary}); + border-radius: 4px; + clear: both; + height: 8px; + margin: 0 0 0 40px; + overflow: hidden; + position: relative; +`; +const ChecklistProgressBarCurrent = styled.div<{ width: number }>` + width: ${props => props.width}%; + background: rgba(${props => (props.width === 100 ? props.theme.colors.success : props.theme.colors.primary)}); + bottom: 0; + left: 0; + position: absolute; + top: 0; + transition: width 0.14s ease-in, background 0.14s ease-in; +`; + +const ChecklistItems = styled.div` + min-height: 8px; +`; + +const ChecklistItemUncheckedIcon = styled(Square)``; + +const ChecklistIcon = styled.div` + cursor: pointer; + position: absolute; + left: 0; + top: 0; + margin: 10px; + text-align: center; + + &:hover { + opacity: 0.8; + } +`; + +const ChecklistItemCheckedIcon = styled(CheckSquare)` + fill: rgba(${props => props.theme.colors.primary}); +`; + +const ChecklistItemDetails = styled.div` + word-break: break-word; + word-wrap: break-word; + overflow-wrap: break-word; +`; +const ChecklistItemRow = styled.div` + cursor: pointer; + display: flex; + flex-direction: row; +`; + +const ChecklistItemTextControls = styled.div` + padding: 6px 0; + width: 100%; + display: inline-flex; +`; + +const ChecklistItemText = styled.span<{ complete: boolean }>` + color: ${props => (props.complete ? '#5e6c84' : `rgba(${props.theme.colors.text.primary})`)}; + ${props => props.complete && 'text-decoration: line-through;'} + line-height: 20px; + font-size: 16px; + + min-height: 20px; + margin-bottom: 0; + align-self: center; + flex: 1; +`; + +const ChecklistControls = styled.div` + display: inline-flex; + flex-direction: row; + float: right; +`; + +const ControlButton = styled.div` + opacity: 0; + margin-left: 4px; + padding: 4px 6px; + border-radius: 6px; + background-color: rgba(${props => props.theme.colors.bg.primary}, 0.8); + &:hover { + background-color: rgba(${props => props.theme.colors.primary}, 1); + } +`; + +const ChecklistNameEditorWrapper = styled.div` + display: block; + float: left; + padding-top: 6px; + padding-bottom: 8px; + z-index: 50; + width: 100%; +`; +export const ChecklistNameEditor = styled(TextareaAutosize)` + overflow: hidden; + overflow-wrap: break-word; + resize: none; + height: 54px; + width: 100%; + + background: none; + border: none; + box-shadow: none; + max-height: 162px; + min-height: 54px; + padding: 8px 12px; + font-size: 16px; + line-height: 20px; + border: 1px solid rgba(${props => props.theme.colors.primary}); + border-radius: 3px; + color: rgba(${props => props.theme.colors.text.primary}); + + border-color: rgba(${props => props.theme.colors.border}); + background-color: rgba(${props => props.theme.colors.bg.primary}, 0.4); + &:focus { + border-color: rgba(${props => props.theme.colors.primary}); + } +`; + +const AssignUserButton = styled(AccountPlus)` + fill: rgba(${props => props.theme.colors.text.primary}); +`; + +const ClockButton = styled(Clock)` + fill: rgba(${props => props.theme.colors.text.primary}); +`; + +const TrashButton = styled(Trash)` + fill: rgba(${props => props.theme.colors.text.primary}); +`; + +const ChecklistItemWrapper = styled.div` + user-select: none; + clear: both; + padding-left: 40px; + position: relative; + border-radius: 6px; + transform-origin: left bottom; + transition-property: transform, opacity, height, padding, margin; + transition-duration: 0.14s; + transition-timing-function: ease-in; + + &:hover { + background-color: rgba(${props => props.theme.colors.bg.primary}, 0.4); + } + &:hover ${ControlButton} { + opacity: 1; + } +`; + +const EditControls = styled.div` + clear: both; + display: flex; + padding-bottom: 9px; + flex-direction: row; +`; + +const SaveButton = styled(Button)` + margin-right: 4px; + padding: 6px 12px; +`; +const CancelButton = styled.div` + cursor: pointer; + margin: 5px; + & svg { + fill: rgba(${props => props.theme.colors.text.primary}); + } + &:hover svg { + fill: rgba(${props => props.theme.colors.text.secondary}); + } +`; + +const Spacer = styled.div` + flex: 1; +`; + +const EditableDeleteButton = styled.button` + cursor: pointer; + display: flex; + margin: 0 2px; + padding: 6px 8px; + border-radius: 3px; + + &:hover { + background: rgba(${props => props.theme.colors.primary}, 0.8); + } +`; + +const NewItemButton = styled(Button)` + padding: 6px 8px; +`; + +const ChecklistNewItem = styled.div` + margin: 8px 0; + margin-left: 40px; +`; + +type ChecklistItemProps = { + itemID: string; + complete: boolean; + name: string; + onChangeName: (itemID: string, currentName: string) => void; + onToggleItem: (itemID: string, complete: boolean) => void; + onDeleteItem: (itemID: string) => void; +}; + +const ChecklistItem: React.FC = ({ + itemID, + complete, + name, + onChangeName, + onToggleItem, + onDeleteItem, +}) => { + const $item = useRef(null); + const $editor = useRef(null); + const [editting, setEditting] = useState(false); + const [currentName, setCurrentName] = useState(name); + useEffect(() => { + if (editting && $editor && $editor.current) { + $editor.current.focus(); + $editor.current.select(); + } + }, [editting]); + useOnOutsideClick($item, true, () => setEditting(false), null); + return ( + + { + e.stopPropagation(); + onToggleItem(itemID, !complete); + }} + > + {complete ? ( + + ) : ( + + )} + + {editting ? ( + <> + + { + if (e.key === 'Enter') { + onChangeName(itemID, currentName); + setEditting(false); + } + }} + onChange={e => { + setCurrentName(e.currentTarget.value); + }} + value={currentName} + /> + + + { + onChangeName(itemID, currentName); + setEditting(false); + }} + variant="relief" + > + Save + + { + e.stopPropagation(); + setEditting(false); + }} + > + + + + { + e.stopPropagation(); + setEditting(false); + onDeleteItem(itemID); + }} + > + + + + + ) : ( + { + setEditting(true); + }} + > + + + {name} + + + + + + + + { + e.stopPropagation(); + onDeleteItem(itemID); + }} + > + + + + + + + )} + + ); +}; + +type AddNewItemProps = { + onAddItem: (name: string) => void; +}; + +const AddNewItem: React.FC = ({ onAddItem }) => { + const $editor = useRef(null); + const $wrapper = useRef(null); + const [currentName, setCurrentName] = useState(''); + const [editting, setEditting] = useState(false); + useEffect(() => { + if (editting && $editor && $editor.current) { + $editor.current.focus(); + $editor.current.select(); + } + }, [editting]); + useOnOutsideClick($wrapper, true, () => setEditting(false), null); + return ( + + {editting ? ( + <> + + { + if (e.key === 'Enter') { + e.preventDefault(); + onAddItem(currentName); + setCurrentName(''); + } + }} + onChange={e => { + setCurrentName(e.currentTarget.value); + }} + value={currentName} + /> + + + { + onAddItem(currentName); + setCurrentName(''); + if (editting && $editor && $editor.current) { + $editor.current.focus(); + $editor.current.select(); + } + }} + variant="relief" + > + Save + + { + e.stopPropagation(); + setEditting(false); + }} + > + + + + + ) : ( + setEditting(true)}>Add an item + )} + + ); +}; + +type ChecklistTitleEditorProps = { + name: string; + onChangeName: (item: string) => void; + onCancel: () => void; +}; + +const ChecklistTitleEditor = React.forwardRef( + ({ name, onChangeName, onCancel }: ChecklistTitleEditorProps, $name: any) => { + const [currentName, setCurrentName] = useState(name); + return ( + <> + { + setCurrentName(e.currentTarget.value); + }} + onKeyDown={e => { + if (e.key === 'Enter') { + onChangeName(currentName); + } + }} + /> + + { + onChangeName(currentName); + }} + variant="relief" + > + Save + + { + e.stopPropagation(); + onCancel(); + }} + > + + + + + ); + }, +); +type ChecklistProps = { + checklistID: string; + onDeleteChecklist: (checklistID: string) => void; + name: string; + onChangeName: (item: string) => void; + onToggleItem: (taskID: string, complete: boolean) => void; + onChangeItemName: (itemID: string, currentName: string) => void; + onDeleteItem: (itemID: string) => void; + onAddItem: (itemName: string) => void; + items: Array; +}; + +const Checklist: React.FC = ({ + checklistID, + onDeleteChecklist, + name, + items, + onToggleItem, + onAddItem, + onChangeItemName, + onChangeName, + onDeleteItem, +}) => { + const $name = useRef(null); + const complete = items.reduce((prev, item) => prev + (item.complete ? 1 : 0), 0); + const percent = items.length === 0 ? 0 : Math.floor((complete / items.length) * 100); + const [editting, setEditting] = useState(false); + // useOnOutsideClick($name, true, () => setEditting(false), null); + useEffect(() => { + if (editting && $name && $name.current) { + $name.current.focus(); + $name.current.select(); + } + }, [editting]); + return ( + + + + {editting ? ( + { + onChangeName(currentName); + setEditting(false); + }} + onCancel={() => { + setEditting(false); + }} + /> + ) : ( + + setEditting(true)}>{name} + + { + onDeleteChecklist(checklistID); + }} + color="danger" + variant="outline" + > + Delete + + + + )} + + + {`${percent}%`} + + + + + + {items + .slice() + .sort((a, b) => a.position - b.position) + .map(item => ( + + ))} + + + + ); +}; + +export default Checklist; diff --git a/web/src/shared/components/DueDateManager/DueDateManager.stories.tsx b/web/src/shared/components/DueDateManager/DueDateManager.stories.tsx index 838cea9..74d1a0e 100644 --- a/web/src/shared/components/DueDateManager/DueDateManager.stories.tsx +++ b/web/src/shared/components/DueDateManager/DueDateManager.stories.tsx @@ -64,6 +64,7 @@ export const Default = () => { }} onCancel={action('cancel')} onDueDateChange={action('due date change')} + onRemoveDueDate={action('remove due date')} /> diff --git a/web/src/shared/components/DueDateManager/Styles.ts b/web/src/shared/components/DueDateManager/Styles.ts index 31d4367..656f6ef 100644 --- a/web/src/shared/components/DueDateManager/Styles.ts +++ b/web/src/shared/components/DueDateManager/Styles.ts @@ -102,11 +102,15 @@ export const DueDatePickerWrapper = styled.div` `; export const ConfirmAddDueDate = styled(Button)` - float: left; margin: 0 4px 0 0; padding: 6px 12px; `; +export const RemoveDueDate = styled(Button)` + padding: 6px 12px; + margin: 0 0 0 4px; +`; + export const CancelDueDate = styled.div` display: flex; align-items: center; @@ -126,4 +130,5 @@ export const ActionWrapper = styled.div` padding-top: 8px; width: 100%; display: flex; + justify-content: space-between; `; diff --git a/web/src/shared/components/DueDateManager/index.tsx b/web/src/shared/components/DueDateManager/index.tsx index ffadbd9..b921335 100644 --- a/web/src/shared/components/DueDateManager/index.tsx +++ b/web/src/shared/components/DueDateManager/index.tsx @@ -5,7 +5,15 @@ import DatePicker from 'react-datepicker'; import { Cross } from 'shared/icons'; import _ from 'lodash'; -import { Wrapper, ActionWrapper, DueDateInput, DueDatePickerWrapper, ConfirmAddDueDate, CancelDueDate } from './Styles'; +import { + Wrapper, + ActionWrapper, + RemoveDueDate, + DueDateInput, + DueDatePickerWrapper, + ConfirmAddDueDate, + CancelDueDate, +} from './Styles'; import 'react-datepicker/dist/react-datepicker.css'; import { getYear, getMonth } from 'date-fns'; @@ -14,6 +22,7 @@ import { useForm } from 'react-hook-form'; type DueDateManagerProps = { task: Task; onDueDateChange: (task: Task, newDueDate: Date) => void; + onRemoveDueDate: (task: Task) => void; onCancel: () => void; }; @@ -109,7 +118,7 @@ const HeaderActions = styled.div` } `; -const DueDateManager: React.FC = ({ task, onDueDateChange, onCancel }) => { +const DueDateManager: React.FC = ({ task, onDueDateChange, onRemoveDueDate, onCancel }) => { const now = moment(); const [textStartDate, setTextStartDate] = useState(now.format('YYYY-MM-DD')); const [startDate, setStartDate] = useState(new Date()); @@ -260,19 +269,18 @@ const DueDateManager: React.FC = ({ task, onDueDateChange, /> - { - // const newDate = moment(startDate).format('YYYY-MM-DD'); - // const newTime = moment(endTime).format('h:mm A'); - // onDueDateChange(task, moment(`${newDate} ${newTime}`, 'YYYY-MM-DD h:mm A').toDate()); - }} - > + {}}> Save - - - + { + onRemoveDueDate(task); + }} + > + Remove + diff --git a/web/src/shared/components/Lists/Styles.ts b/web/src/shared/components/Lists/Styles.ts index ee66afc..ba23ded 100644 --- a/web/src/shared/components/Lists/Styles.ts +++ b/web/src/shared/components/Lists/Styles.ts @@ -7,11 +7,41 @@ export const Container = styled.div` overflow-x: auto; overflow-y: hidden; padding-bottom: 8px; + + ::-webkit-scrollbar { + height: 10px; + } + ::-webkit-scrollbar-thumb { + background: #7367f0; + border-radius: 6px; + } + + ::-webkit-scrollbar-track { + background: #10163a; + border-radius: 6px; + } +`; + +export const BoardContainer = styled.div` + position: relative; + overflow-y: auto; + outline: none; + flex-grow: 1; `; export const BoardWrapper = styled.div` display: flex; - margin-top: 12px; - margin-left: 8px; + + user-select: none; + white-space: nowrap; + margin-bottom: 8px; + overflow-x: auto; + overflow-y: hidden; + padding-bottom: 8px; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; `; export default Container; diff --git a/web/src/shared/components/Lists/index.tsx b/web/src/shared/components/Lists/index.tsx index e4874d9..47e6193 100644 --- a/web/src/shared/components/Lists/index.tsx +++ b/web/src/shared/components/Lists/index.tsx @@ -10,10 +10,10 @@ import { getNewDraggablePosition, getAfterDropDraggableList, } from 'shared/utils/draggables'; - -import { Container, BoardWrapper } from './Styles'; import moment from 'moment'; +import { Container, BoardContainer, BoardWrapper } from './Styles'; + interface SimpleProps { taskGroups: Array; onTaskDrop: (task: Task, previousTaskGroupID: string) => void; @@ -120,104 +120,107 @@ const SimpleLists: React.FC = ({ const [currentComposer, setCurrentComposer] = useState(''); return ( - - - - {provided => ( - - {taskGroups - .slice() - .sort((a: any, b: any) => a.position - b.position) - .map((taskGroup: TaskGroup, index: number) => { - return ( - - {columnDragProvided => ( - - {(columnDropProvided, snapshot) => ( - setCurrentComposer(id)} - isComposerOpen={currentComposer === taskGroup.id} - onSaveName={name => onChangeTaskGroupName(taskGroup.id, name)} - ref={columnDragProvided.innerRef} - wrapperProps={columnDragProvided.draggableProps} - headerProps={columnDragProvided.dragHandleProps} - onExtraMenuOpen={onExtraMenuOpen} - id={taskGroup.id} - key={taskGroup.id} - index={index} - > - - {taskGroup.tasks - .slice() - .sort((a: any, b: any) => a.position - b.position) - .map((task: Task, taskIndex: any) => { - return ( - - {taskProvided => { - return ( - label.projectLabel)} - dueDate={ - task.dueDate - ? { - isPastDue: false, - formattedDate: moment(task.dueDate).format('MMM D, YYYY'), - } - : undefined - } - title={task.name} - members={task.assigned} - onClick={() => { - onTaskClick(task); - }} - onCardMemberClick={onCardMemberClick} - onContextMenu={onQuickEditorOpen} - /> - ); - }} - - ); - })} - {columnDropProvided.placeholder} - {currentComposer === taskGroup.id && ( - { - setCurrentComposer(''); - }} - onCreateCard={name => { - onCreateTask(taskGroup.id, name); - }} - isOpen - /> - )} - - - )} - - )} - - ); - })} - {provided.placeholder} - - )} - - - { - onCreateTaskGroup(listName); - }} - /> - + + + + + {provided => ( + + {taskGroups + .slice() + .sort((a: any, b: any) => a.position - b.position) + .map((taskGroup: TaskGroup, index: number) => { + return ( + + {columnDragProvided => ( + + {(columnDropProvided, snapshot) => ( + setCurrentComposer(id)} + isComposerOpen={currentComposer === taskGroup.id} + onSaveName={name => onChangeTaskGroupName(taskGroup.id, name)} + ref={columnDragProvided.innerRef} + wrapperProps={columnDragProvided.draggableProps} + headerProps={columnDragProvided.dragHandleProps} + onExtraMenuOpen={onExtraMenuOpen} + id={taskGroup.id} + key={taskGroup.id} + index={index} + > + + {taskGroup.tasks + .slice() + .sort((a: any, b: any) => a.position - b.position) + .map((task: Task, taskIndex: any) => { + return ( + + {taskProvided => { + return ( + label.projectLabel)} + dueDate={ + task.dueDate + ? { + isPastDue: false, + formattedDate: moment(task.dueDate).format('MMM D, YYYY'), + } + : undefined + } + title={task.name} + members={task.assigned} + onClick={() => { + onTaskClick(task); + }} + onCardMemberClick={onCardMemberClick} + onContextMenu={onQuickEditorOpen} + /> + ); + }} + + ); + })} + {columnDropProvided.placeholder} + {currentComposer === taskGroup.id && ( + { + setCurrentComposer(''); + }} + onCreateCard={name => { + onCreateTask(taskGroup.id, name); + }} + isOpen + /> + )} + + + )} + + )} + + ); + })} + { + onCreateTaskGroup(listName); + }} + /> + {provided.placeholder} + + )} + + + + ); }; diff --git a/web/src/shared/components/MemberManager/index.tsx b/web/src/shared/components/MemberManager/index.tsx index 24d0c0f..c924951 100644 --- a/web/src/shared/components/MemberManager/index.tsx +++ b/web/src/shared/components/MemberManager/index.tsx @@ -59,7 +59,7 @@ const MemberManager: React.FC = ({ {member.fullName} {activeMembers.findIndex(m => m.id === member.id) !== -1 && ( - + )} diff --git a/web/src/shared/components/NewProject/index.tsx b/web/src/shared/components/NewProject/index.tsx index 0505375..bd05292 100644 --- a/web/src/shared/components/NewProject/index.tsx +++ b/web/src/shared/components/NewProject/index.tsx @@ -232,7 +232,7 @@ const NewProject: React.FC = ({ teams, onClose, onCreateProject onClose(); }} > - + diff --git a/web/src/shared/components/PopupMenu/LabelEditor.tsx b/web/src/shared/components/PopupMenu/LabelEditor.tsx index 69827f8..235b710 100644 --- a/web/src/shared/components/PopupMenu/LabelEditor.tsx +++ b/web/src/shared/components/PopupMenu/LabelEditor.tsx @@ -44,7 +44,7 @@ const LabelManager = ({ labelColors, label, onLabelEdit, onLabelDelete }: Props) setCurrentColor(labelColor); }} > - {currentColor && labelColor.id === currentColor.id && } + {currentColor && labelColor.id === currentColor.id && } ))} diff --git a/web/src/shared/components/PopupMenu/LabelManager.tsx b/web/src/shared/components/PopupMenu/LabelManager.tsx index a07c92a..3f77238 100644 --- a/web/src/shared/components/PopupMenu/LabelManager.tsx +++ b/web/src/shared/components/PopupMenu/LabelManager.tsx @@ -72,7 +72,7 @@ const LabelManager: React.FC = ({ labels, taskLabels, onLabelToggle, onLa {label.name} {taskLabels && taskLabels.find(t => t.projectLabel.id === label.id) && ( - + )} diff --git a/web/src/shared/components/PopupMenu/PopupMenu.stories.tsx b/web/src/shared/components/PopupMenu/PopupMenu.stories.tsx index 684f434..0b7f2c5 100644 --- a/web/src/shared/components/PopupMenu/PopupMenu.stories.tsx +++ b/web/src/shared/components/PopupMenu/PopupMenu.stories.tsx @@ -265,6 +265,7 @@ export const DueDateManagerPopup = () => { {popupData.isOpen && ( setPopupData(initalState)} left={popupData.left}> = ({ width, top, left, onClose, children, invert }) => { - const $containerRef = useRef(); + const $containerRef = useRef(null); + const [currentTop, setCurrentTop] = useState(top); useOnOutsideClick($containerRef, true, onClose, null); + useEffect(() => { + if ($containerRef && $containerRef.current) { + const bounding = $containerRef.current.getBoundingClientRect(); + if (bounding.bottom > (window.innerHeight || document.documentElement.clientHeight)) { + setCurrentTop(44); + } + } + }, []); return ( - + {children} ); @@ -91,11 +100,12 @@ export const PopupProvider: React.FC = ({ children }) => { const show = (target: RefObject, content: JSX.Element, width?: number | string) => { if (target && target.current) { const bounds = target.current.getBoundingClientRect(); + const top = bounds.top + bounds.height; if (bounds.left + 304 + 30 > window.innerWidth) { setState({ isOpen: true, left: bounds.left + bounds.width, - top: bounds.top + bounds.height, + top, invert: true, currentTab: 0, previousTab: 0, @@ -106,7 +116,7 @@ export const PopupProvider: React.FC = ({ children }) => { setState({ isOpen: true, left: bounds.left, - top: bounds.top + bounds.height, + top, invert: false, currentTab: 0, previousTab: 0, @@ -176,7 +186,7 @@ type Props = { }; const PopupMenu: React.FC = ({ width, title, top, left, onClose, noHeader, children, onPrevious }) => { - const $containerRef = useRef(); + const $containerRef = useRef(null); useOnOutsideClick($containerRef, true, onClose, null); return ( @@ -189,13 +199,13 @@ const PopupMenu: React.FC = ({ width, title, top, left, onClose, noHeader )} {noHeader ? ( onClose()}> - + ) : (
{title} onClose()}> - +
)} @@ -230,7 +240,7 @@ export const Popup: React.FC = ({ title, onClose, tab, children }) = )} {onClose && ( onClose()}> - + )} {children} diff --git a/web/src/shared/components/QuickCardEditor/QuickCardEditor.stories.tsx b/web/src/shared/components/QuickCardEditor/QuickCardEditor.stories.tsx index f569a44..a181245 100644 --- a/web/src/shared/components/QuickCardEditor/QuickCardEditor.stories.tsx +++ b/web/src/shared/components/QuickCardEditor/QuickCardEditor.stories.tsx @@ -57,7 +57,9 @@ export const Default = () => { onCloseEditor={() => setEditorOpen(false)} onEditCard={action('edit card')} onOpenLabelsPopup={action('open popup')} + onOpenDueDatePopup={action('open popup')} onOpenMembersPopup={action('open popup')} + onToggleComplete={action('complete')} onArchiveCard={action('archive card')} top={top} left={left} diff --git a/web/src/shared/components/QuickCardEditor/Styles.ts b/web/src/shared/components/QuickCardEditor/Styles.ts index 22a7c62..dae83a8 100644 --- a/web/src/shared/components/QuickCardEditor/Styles.ts +++ b/web/src/shared/components/QuickCardEditor/Styles.ts @@ -14,9 +14,9 @@ export const Wrapper = styled.div<{ open: boolean }>` visibility: ${props => (props.open ? 'show' : 'hidden')}; `; -export const Container = styled.div<{ top: number; left: number }>` +export const Container = styled.div<{ width: number; top: number; left: number }>` position: absolute; - width: 256px; + width: ${props => props.width}px; top: ${props => props.top}px; left: ${props => props.left}px; `; diff --git a/web/src/shared/components/QuickCardEditor/index.tsx b/web/src/shared/components/QuickCardEditor/index.tsx index 529e021..ca145c0 100644 --- a/web/src/shared/components/QuickCardEditor/index.tsx +++ b/web/src/shared/components/QuickCardEditor/index.tsx @@ -14,12 +14,15 @@ type Props = { task: Task; onCloseEditor: () => void; onEditCard: (taskGroupID: string, taskID: string, cardName: string) => void; + onToggleComplete: (task: Task) => void; onOpenLabelsPopup: ($targetRef: React.RefObject, task: Task) => void; onOpenMembersPopup: ($targetRef: React.RefObject, task: Task) => void; + onOpenDueDatePopup: ($targetRef: React.RefObject, task: Task) => void; onArchiveCard: (taskGroupID: string, taskID: string) => void; onCardMemberClick?: OnCardMemberClick; top: number; left: number; + width?: number; }; const QuickCardEditor = ({ @@ -27,14 +30,18 @@ const QuickCardEditor = ({ onCloseEditor, onOpenLabelsPopup, onOpenMembersPopup, + onOpenDueDatePopup, + onToggleComplete, onCardMemberClick, onArchiveCard, onEditCard, + width = 272, top, left, }: Props) => { const [currentCardTitle, setCardTitle] = useState(task.name); const $labelsRef: any = useRef(); + const $dueDate: any = useRef(); const $membersRef: any = useRef(); const handleCloseEditor = (e: any) => { @@ -45,9 +52,9 @@ const QuickCardEditor = ({ return ( - + - + onEditCard(task.taskGroup.id, task.id, currentCardTitle)}>Save + { + e.stopPropagation(); + onToggleComplete(task); + }} + > + {task.complete ? 'Mark Incomplete' : 'Mark Complete'} + { @@ -72,6 +88,15 @@ const QuickCardEditor = ({ > Edit Assigned + { + e.stopPropagation(); + onOpenDueDatePopup($labelsRef, task); + }} + > + Edit Due Date + { diff --git a/web/src/shared/components/TaskDetails/Styles.ts b/web/src/shared/components/TaskDetails/Styles.ts index bb3ffe5..d127367 100644 --- a/web/src/shared/components/TaskDetails/Styles.ts +++ b/web/src/shared/components/TaskDetails/Styles.ts @@ -148,6 +148,20 @@ export const TaskDetailsMarkdown = styled.div` cursor: pointer; color: #c2c6dc; + h1 { + font-size: 24px; + font-weight: 600; + line-height: 28px; + margin: 0 0 12px; + } + + h2 { + font-weight: 600; + font-size: 20px; + line-height: 24px; + margin: 16px 0 8px; + } + p { margin: 0 0 8px; } @@ -155,6 +169,15 @@ export const TaskDetailsMarkdown = styled.div` strong { font-weight: 700; } + + ul { + margin: 8px 0; + } + + ul > li { + margin: 8px 8px 8px 24px; + list-style: disc; + } `; export const TaskDetailsControls = styled.div` diff --git a/web/src/shared/components/TaskDetails/TaskDetails.stories.tsx b/web/src/shared/components/TaskDetails/TaskDetails.stories.tsx index 98ef26d..034ad5e 100644 --- a/web/src/shared/components/TaskDetails/TaskDetails.stories.tsx +++ b/web/src/shared/components/TaskDetails/TaskDetails.stories.tsx @@ -28,6 +28,8 @@ export const Default = () => { renderContent={() => { return ( { onCloseModal={action('close modal')} onMemberProfile={action('profile')} onOpenAddMemberPopup={action('open add member popup')} + onAddItem={action('add item')} + onToggleChecklistItem={action('toggle checklist item')} onOpenAddLabelPopup={action('open add label popup')} onOpenDueDatePopop={action('open due date popup')} /> diff --git a/web/src/shared/components/TaskDetails/index.tsx b/web/src/shared/components/TaskDetails/index.tsx index d7c3e33..81844db 100644 --- a/web/src/shared/components/TaskDetails/index.tsx +++ b/web/src/shared/components/TaskDetails/index.tsx @@ -3,6 +3,7 @@ import { Bin, Cross, Plus } from 'shared/icons'; import useOnOutsideClick from 'shared/hooks/onOutsideClick'; import ReactMarkdown from 'react-markdown'; import TaskAssignee from 'shared/components/TaskAssignee'; +import moment from 'moment'; import { NoDueDateLabel, @@ -37,15 +38,33 @@ import { TaskDetailAssignees, TaskDetailsAddMemberIcon, } from './Styles'; - -import convertDivElementRefToBounds from 'shared/utils/boundingRect'; -import moment from 'moment'; +import Checklist from '../Checklist'; type TaskContentProps = { onEditContent: () => void; description: string; }; +type TaskLabelProps = { + label: TaskLabel; + onClick: ($target: React.RefObject) => void; +}; + +const TaskLabelItem: React.FC = ({ label, onClick }) => { + const $label = useRef(null); + return ( + { + onClick($label); + }} + ref={$label} + color={label.projectLabel.labelColor.colorHex} + > + {label.projectLabel.name} + + ); +}; + const TaskContent: React.FC = ({ description, onEditContent }) => { return description === '' ? ( Add a more detailed description @@ -105,6 +124,10 @@ type TaskDetailsProps = { onTaskNameChange: (task: Task, newName: string) => void; onTaskDescriptionChange: (task: Task, newDescription: string) => void; onDeleteTask: (task: Task) => void; + onAddItem: (checklistID: string, name: string, position: number) => void; + onDeleteItem: (itemID: string) => void; + onChangeItemName: (itemID: string, itemName: string) => void; + onToggleChecklistItem: (itemID: string, complete: boolean) => void; onOpenAddMemberPopup: (task: Task, $targetRef: React.RefObject) => void; onOpenAddLabelPopup: (task: Task, $targetRef: React.RefObject) => void; onOpenDueDatePopop: (task: Task, $targetRef: React.RefObject) => void; @@ -116,11 +139,15 @@ const TaskDetails: React.FC = ({ task, onTaskNameChange, onTaskDescriptionChange, + onChangeItemName, + onDeleteItem, onDeleteTask, onCloseModal, onOpenAddMemberPopup, onOpenAddLabelPopup, onOpenDueDatePopop, + onAddItem, + onToggleChecklistItem, onMemberProfile, }) => { const [editorOpen, setEditorOpen] = useState(false); @@ -158,7 +185,7 @@ const TaskDetails: React.FC = ({ - + @@ -195,6 +222,33 @@ const TaskDetails: React.FC = ({ ) : ( )} + {task.checklists && + task.checklists + .slice() + .sort((a, b) => a.position - b.position) + .map(checklist => ( + {}} + onChangeName={() => {}} + onToggleItem={onToggleChecklistItem} + onDeleteItem={onDeleteItem} + onAddItem={n => { + if (task.checklists) { + let position = 1; + const lastChecklist = task.checklists.sort((a, b) => a.position - b.position)[-1]; + if (lastChecklist) { + position = lastChecklist.position * 2 + 1; + } + onAddItem(checklist.id, n, position); + } + }} + onChangeItemName={onChangeItemName} + /> + ))} Assignees @@ -221,9 +275,13 @@ const TaskDetails: React.FC = ({ {task.labels.map(label => { return ( - - {label.projectLabel.name} - + { + onOpenAddLabelPopup(task, $target); + }} + /> ); })} diff --git a/web/src/shared/generated/graphql.tsx b/web/src/shared/generated/graphql.tsx index c0456ba..a8b043f 100644 --- a/web/src/shared/generated/graphql.tsx +++ b/web/src/shared/generated/graphql.tsx @@ -111,8 +111,10 @@ export type Task = { position: Scalars['Float']; description?: Maybe; dueDate?: Maybe; + complete: Scalars['Boolean']; assigned: Array; labels: Array; + checklists: Array; }; export type ProjectsFilter = { @@ -239,6 +241,30 @@ export type DeleteTaskGroupPayload = { taskGroup: TaskGroup; }; +export type DeleteTaskChecklistItemPayload = { + __typename?: 'DeleteTaskChecklistItemPayload'; + ok: Scalars['Boolean']; + taskChecklistItem: TaskChecklistItem; +}; + +export type TaskChecklistItem = { + __typename?: 'TaskChecklistItem'; + id: Scalars['ID']; + name: Scalars['String']; + taskChecklistID: Scalars['UUID']; + complete: Scalars['Boolean']; + position: Scalars['Float']; + dueDate: Scalars['Time']; +}; + +export type TaskChecklist = { + __typename?: 'TaskChecklist'; + id: Scalars['ID']; + name: Scalars['String']; + position: Scalars['Float']; + items: Array; +}; + export type AssignTaskInput = { taskID: Scalars['UUID']; userID: Scalars['UUID']; @@ -321,6 +347,37 @@ export type UpdateTaskDueDate = { dueDate?: Maybe; }; +export type SetTaskComplete = { + taskID: Scalars['UUID']; + complete: Scalars['Boolean']; +}; + +export type CreateTaskChecklist = { + taskID: Scalars['UUID']; + name: Scalars['String']; + position: Scalars['Float']; +}; + +export type CreateTaskChecklistItem = { + taskChecklistID: Scalars['UUID']; + name: Scalars['String']; + position: Scalars['Float']; +}; + +export type SetTaskChecklistItemComplete = { + taskChecklistItemID: Scalars['UUID']; + complete: Scalars['Boolean']; +}; + +export type DeleteTaskChecklistItem = { + taskChecklistItemID: Scalars['UUID']; +}; + +export type UpdateTaskChecklistItemName = { + taskChecklistItemID: Scalars['UUID']; + name: Scalars['String']; +}; + export type Mutation = { __typename?: 'Mutation'; createRefreshToken: RefreshToken; @@ -341,10 +398,16 @@ export type Mutation = { addTaskLabel: Task; removeTaskLabel: Task; toggleTaskLabel: ToggleTaskLabelPayload; + createTaskChecklist: TaskChecklist; + createTaskChecklistItem: TaskChecklistItem; + updateTaskChecklistItemName: TaskChecklistItem; + setTaskChecklistItemComplete: TaskChecklistItem; + deleteTaskChecklistItem: DeleteTaskChecklistItemPayload; createTask: Task; updateTaskDescription: Task; updateTaskLocation: UpdateTaskLocationPayload; updateTaskName: Task; + setTaskComplete: Task; updateTaskDueDate: Task; deleteTask: DeleteTaskPayload; assignTask: Task; @@ -438,6 +501,31 @@ export type MutationToggleTaskLabelArgs = { }; +export type MutationCreateTaskChecklistArgs = { + input: CreateTaskChecklist; +}; + + +export type MutationCreateTaskChecklistItemArgs = { + input: CreateTaskChecklistItem; +}; + + +export type MutationUpdateTaskChecklistItemNameArgs = { + input: UpdateTaskChecklistItemName; +}; + + +export type MutationSetTaskChecklistItemCompleteArgs = { + input: SetTaskChecklistItemComplete; +}; + + +export type MutationDeleteTaskChecklistItemArgs = { + input: DeleteTaskChecklistItem; +}; + + export type MutationCreateTaskArgs = { input: NewTask; }; @@ -458,6 +546,11 @@ export type MutationUpdateTaskNameArgs = { }; +export type MutationSetTaskCompleteArgs = { + input: SetTaskComplete; +}; + + export type MutationUpdateTaskDueDateArgs = { input: UpdateTaskDueDate; }; @@ -564,7 +657,7 @@ export type CreateTaskMutation = ( { __typename?: 'Mutation' } & { createTask: ( { __typename?: 'Task' } - & Pick + & Pick & { taskGroup: ( { __typename?: 'TaskGroup' } & Pick @@ -681,29 +774,7 @@ export type FindProjectQuery = ( & Pick & { tasks: Array<( { __typename?: 'Task' } - & Pick - & { taskGroup: ( - { __typename?: 'TaskGroup' } - & Pick - ), labels: Array<( - { __typename?: 'TaskLabel' } - & Pick - & { projectLabel: ( - { __typename?: 'ProjectLabel' } - & Pick - & { labelColor: ( - { __typename?: 'LabelColor' } - & Pick - ) } - ) } - )>, assigned: Array<( - { __typename?: 'ProjectMember' } - & Pick - & { profileIcon: ( - { __typename?: 'ProfileIcon' } - & Pick - ) } - )> } + & TaskFieldsFragment )> } )> } ), labelColors: Array<( @@ -725,7 +796,14 @@ export type FindTaskQuery = ( & { taskGroup: ( { __typename?: 'TaskGroup' } & Pick - ), labels: Array<( + ), checklists: Array<( + { __typename?: 'TaskChecklist' } + & Pick + & { items: Array<( + { __typename?: 'TaskChecklistItem' } + & Pick + )> } + )>, labels: Array<( { __typename?: 'TaskLabel' } & Pick & { projectLabel: ( @@ -747,6 +825,33 @@ export type FindTaskQuery = ( ) } ); +export type TaskFieldsFragment = ( + { __typename?: 'Task' } + & Pick + & { taskGroup: ( + { __typename?: 'TaskGroup' } + & Pick + ), labels: Array<( + { __typename?: 'TaskLabel' } + & Pick + & { projectLabel: ( + { __typename?: 'ProjectLabel' } + & Pick + & { labelColor: ( + { __typename?: 'LabelColor' } + & Pick + ) } + ) } + )>, assigned: Array<( + { __typename?: 'ProjectMember' } + & Pick + & { profileIcon: ( + { __typename?: 'ProfileIcon' } + & Pick + ) } + )> } +); + export type GetProjectsQueryVariables = {}; @@ -780,6 +885,94 @@ export type MeQuery = ( ) } ); +export type CreateTaskChecklistItemMutationVariables = { + taskChecklistID: Scalars['UUID']; + name: Scalars['String']; + position: Scalars['Float']; +}; + + +export type CreateTaskChecklistItemMutation = ( + { __typename?: 'Mutation' } + & { createTaskChecklistItem: ( + { __typename?: 'TaskChecklistItem' } + & Pick + ) } +); + +export type DeleteTaskChecklistItemMutationVariables = { + taskChecklistItemID: Scalars['UUID']; +}; + + +export type DeleteTaskChecklistItemMutation = ( + { __typename?: 'Mutation' } + & { deleteTaskChecklistItem: ( + { __typename?: 'DeleteTaskChecklistItemPayload' } + & Pick + & { taskChecklistItem: ( + { __typename?: 'TaskChecklistItem' } + & Pick + ) } + ) } +); + +export type SetTaskChecklistItemCompleteMutationVariables = { + taskChecklistItemID: Scalars['UUID']; + complete: Scalars['Boolean']; +}; + + +export type SetTaskChecklistItemCompleteMutation = ( + { __typename?: 'Mutation' } + & { setTaskChecklistItemComplete: ( + { __typename?: 'TaskChecklistItem' } + & Pick + ) } +); + +export type SetTaskCompleteMutationVariables = { + taskID: Scalars['UUID']; + complete: Scalars['Boolean']; +}; + + +export type SetTaskCompleteMutation = ( + { __typename?: 'Mutation' } + & { setTaskComplete: ( + { __typename?: 'Task' } + & TaskFieldsFragment + ) } +); + +export type UpdateTaskChecklistItemNameMutationVariables = { + taskChecklistItemID: Scalars['UUID']; + name: Scalars['String']; +}; + + +export type UpdateTaskChecklistItemNameMutation = ( + { __typename?: 'Mutation' } + & { updateTaskChecklistItemName: ( + { __typename?: 'TaskChecklistItem' } + & Pick + ) } +); + +export type UpdateTaskGroupNameMutationVariables = { + taskGroupID: Scalars['UUID']; + name: Scalars['String']; +}; + + +export type UpdateTaskGroupNameMutation = ( + { __typename?: 'Mutation' } + & { updateTaskGroupName: ( + { __typename?: 'TaskGroup' } + & Pick + ) } +); + export type ToggleTaskLabelMutationVariables = { taskID: Scalars['UUID']; projectLabelID: Scalars['UUID']; @@ -940,7 +1133,43 @@ export type UpdateTaskNameMutation = ( ) } ); - +export const TaskFieldsFragmentDoc = gql` + fragment TaskFields on Task { + id + name + description + dueDate + complete + position + taskGroup { + id + } + labels { + id + assignedDate + projectLabel { + id + name + createdDate + labelColor { + id + colorHex + position + name + } + } + } + assigned { + id + fullName + profileIcon { + url + initials + bgColor + } + } +} + `; export const AssignTaskDocument = gql` mutation assignTask($taskID: UUID!, $userID: UUID!) { assignTask(input: {taskID: $taskID, userID: $userID}) { @@ -1103,6 +1332,7 @@ export const CreateTaskDocument = gql` name position description + dueDate taskGroup { id name @@ -1331,40 +1561,7 @@ export const FindProjectDocument = gql` name position tasks { - id - name - position - description - dueDate - taskGroup { - id - name - position - } - labels { - id - assignedDate - projectLabel { - id - name - createdDate - labelColor { - id - colorHex - position - name - } - } - } - assigned { - id - fullName - profileIcon { - url - initials - bgColor - } - } + ...TaskFields } } } @@ -1375,7 +1572,7 @@ export const FindProjectDocument = gql` name } } - `; + ${TaskFieldsFragmentDoc}`; /** * __useFindProjectQuery__ @@ -1413,6 +1610,18 @@ export const FindTaskDocument = gql` taskGroup { id } + checklists { + id + name + position + items { + id + name + taskChecklistID + complete + position + } + } labels { id assignedDate @@ -1546,6 +1755,218 @@ export function useMeLazyQuery(baseOptions?: ApolloReactHooks.LazyQueryHookOptio export type MeQueryHookResult = ReturnType; export type MeLazyQueryHookResult = ReturnType; export type MeQueryResult = ApolloReactCommon.QueryResult; +export const CreateTaskChecklistItemDocument = gql` + mutation createTaskChecklistItem($taskChecklistID: UUID!, $name: String!, $position: Float!) { + createTaskChecklistItem(input: {taskChecklistID: $taskChecklistID, name: $name, position: $position}) { + id + name + taskChecklistID + position + complete + } +} + `; +export type CreateTaskChecklistItemMutationFn = ApolloReactCommon.MutationFunction; + +/** + * __useCreateTaskChecklistItemMutation__ + * + * To run a mutation, you first call `useCreateTaskChecklistItemMutation` within a React component and pass it any options that fit your needs. + * When your component renders, `useCreateTaskChecklistItemMutation` returns a tuple that includes: + * - A mutate function that you can call at any time to execute the mutation + * - An object with fields that represent the current status of the mutation's execution + * + * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; + * + * @example + * const [createTaskChecklistItemMutation, { data, loading, error }] = useCreateTaskChecklistItemMutation({ + * variables: { + * taskChecklistID: // value for 'taskChecklistID' + * name: // value for 'name' + * position: // value for 'position' + * }, + * }); + */ +export function useCreateTaskChecklistItemMutation(baseOptions?: ApolloReactHooks.MutationHookOptions) { + return ApolloReactHooks.useMutation(CreateTaskChecklistItemDocument, baseOptions); + } +export type CreateTaskChecklistItemMutationHookResult = ReturnType; +export type CreateTaskChecklistItemMutationResult = ApolloReactCommon.MutationResult; +export type CreateTaskChecklistItemMutationOptions = ApolloReactCommon.BaseMutationOptions; +export const DeleteTaskChecklistItemDocument = gql` + mutation deleteTaskChecklistItem($taskChecklistItemID: UUID!) { + deleteTaskChecklistItem(input: {taskChecklistItemID: $taskChecklistItemID}) { + ok + taskChecklistItem { + id + taskChecklistID + } + } +} + `; +export type DeleteTaskChecklistItemMutationFn = ApolloReactCommon.MutationFunction; + +/** + * __useDeleteTaskChecklistItemMutation__ + * + * To run a mutation, you first call `useDeleteTaskChecklistItemMutation` within a React component and pass it any options that fit your needs. + * When your component renders, `useDeleteTaskChecklistItemMutation` returns a tuple that includes: + * - A mutate function that you can call at any time to execute the mutation + * - An object with fields that represent the current status of the mutation's execution + * + * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; + * + * @example + * const [deleteTaskChecklistItemMutation, { data, loading, error }] = useDeleteTaskChecklistItemMutation({ + * variables: { + * taskChecklistItemID: // value for 'taskChecklistItemID' + * }, + * }); + */ +export function useDeleteTaskChecklistItemMutation(baseOptions?: ApolloReactHooks.MutationHookOptions) { + return ApolloReactHooks.useMutation(DeleteTaskChecklistItemDocument, baseOptions); + } +export type DeleteTaskChecklistItemMutationHookResult = ReturnType; +export type DeleteTaskChecklistItemMutationResult = ApolloReactCommon.MutationResult; +export type DeleteTaskChecklistItemMutationOptions = ApolloReactCommon.BaseMutationOptions; +export const SetTaskChecklistItemCompleteDocument = gql` + mutation setTaskChecklistItemComplete($taskChecklistItemID: UUID!, $complete: Boolean!) { + setTaskChecklistItemComplete(input: {taskChecklistItemID: $taskChecklistItemID, complete: $complete}) { + id + name + taskChecklistID + complete + position + } +} + `; +export type SetTaskChecklistItemCompleteMutationFn = ApolloReactCommon.MutationFunction; + +/** + * __useSetTaskChecklistItemCompleteMutation__ + * + * To run a mutation, you first call `useSetTaskChecklistItemCompleteMutation` within a React component and pass it any options that fit your needs. + * When your component renders, `useSetTaskChecklistItemCompleteMutation` returns a tuple that includes: + * - A mutate function that you can call at any time to execute the mutation + * - An object with fields that represent the current status of the mutation's execution + * + * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; + * + * @example + * const [setTaskChecklistItemCompleteMutation, { data, loading, error }] = useSetTaskChecklistItemCompleteMutation({ + * variables: { + * taskChecklistItemID: // value for 'taskChecklistItemID' + * complete: // value for 'complete' + * }, + * }); + */ +export function useSetTaskChecklistItemCompleteMutation(baseOptions?: ApolloReactHooks.MutationHookOptions) { + return ApolloReactHooks.useMutation(SetTaskChecklistItemCompleteDocument, baseOptions); + } +export type SetTaskChecklistItemCompleteMutationHookResult = ReturnType; +export type SetTaskChecklistItemCompleteMutationResult = ApolloReactCommon.MutationResult; +export type SetTaskChecklistItemCompleteMutationOptions = ApolloReactCommon.BaseMutationOptions; +export const SetTaskCompleteDocument = gql` + mutation setTaskComplete($taskID: UUID!, $complete: Boolean!) { + setTaskComplete(input: {taskID: $taskID, complete: $complete}) { + ...TaskFields + } +} + ${TaskFieldsFragmentDoc}`; +export type SetTaskCompleteMutationFn = ApolloReactCommon.MutationFunction; + +/** + * __useSetTaskCompleteMutation__ + * + * To run a mutation, you first call `useSetTaskCompleteMutation` within a React component and pass it any options that fit your needs. + * When your component renders, `useSetTaskCompleteMutation` returns a tuple that includes: + * - A mutate function that you can call at any time to execute the mutation + * - An object with fields that represent the current status of the mutation's execution + * + * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; + * + * @example + * const [setTaskCompleteMutation, { data, loading, error }] = useSetTaskCompleteMutation({ + * variables: { + * taskID: // value for 'taskID' + * complete: // value for 'complete' + * }, + * }); + */ +export function useSetTaskCompleteMutation(baseOptions?: ApolloReactHooks.MutationHookOptions) { + return ApolloReactHooks.useMutation(SetTaskCompleteDocument, baseOptions); + } +export type SetTaskCompleteMutationHookResult = ReturnType; +export type SetTaskCompleteMutationResult = ApolloReactCommon.MutationResult; +export type SetTaskCompleteMutationOptions = ApolloReactCommon.BaseMutationOptions; +export const UpdateTaskChecklistItemNameDocument = gql` + mutation updateTaskChecklistItemName($taskChecklistItemID: UUID!, $name: String!) { + updateTaskChecklistItemName(input: {taskChecklistItemID: $taskChecklistItemID, name: $name}) { + id + name + } +} + `; +export type UpdateTaskChecklistItemNameMutationFn = ApolloReactCommon.MutationFunction; + +/** + * __useUpdateTaskChecklistItemNameMutation__ + * + * To run a mutation, you first call `useUpdateTaskChecklistItemNameMutation` within a React component and pass it any options that fit your needs. + * When your component renders, `useUpdateTaskChecklistItemNameMutation` returns a tuple that includes: + * - A mutate function that you can call at any time to execute the mutation + * - An object with fields that represent the current status of the mutation's execution + * + * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; + * + * @example + * const [updateTaskChecklistItemNameMutation, { data, loading, error }] = useUpdateTaskChecklistItemNameMutation({ + * variables: { + * taskChecklistItemID: // value for 'taskChecklistItemID' + * name: // value for 'name' + * }, + * }); + */ +export function useUpdateTaskChecklistItemNameMutation(baseOptions?: ApolloReactHooks.MutationHookOptions) { + return ApolloReactHooks.useMutation(UpdateTaskChecklistItemNameDocument, baseOptions); + } +export type UpdateTaskChecklistItemNameMutationHookResult = ReturnType; +export type UpdateTaskChecklistItemNameMutationResult = ApolloReactCommon.MutationResult; +export type UpdateTaskChecklistItemNameMutationOptions = ApolloReactCommon.BaseMutationOptions; +export const UpdateTaskGroupNameDocument = gql` + mutation updateTaskGroupName($taskGroupID: UUID!, $name: String!) { + updateTaskGroupName(input: {taskGroupID: $taskGroupID, name: $name}) { + id + name + } +} + `; +export type UpdateTaskGroupNameMutationFn = ApolloReactCommon.MutationFunction; + +/** + * __useUpdateTaskGroupNameMutation__ + * + * To run a mutation, you first call `useUpdateTaskGroupNameMutation` within a React component and pass it any options that fit your needs. + * When your component renders, `useUpdateTaskGroupNameMutation` returns a tuple that includes: + * - A mutate function that you can call at any time to execute the mutation + * - An object with fields that represent the current status of the mutation's execution + * + * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; + * + * @example + * const [updateTaskGroupNameMutation, { data, loading, error }] = useUpdateTaskGroupNameMutation({ + * variables: { + * taskGroupID: // value for 'taskGroupID' + * name: // value for 'name' + * }, + * }); + */ +export function useUpdateTaskGroupNameMutation(baseOptions?: ApolloReactHooks.MutationHookOptions) { + return ApolloReactHooks.useMutation(UpdateTaskGroupNameDocument, baseOptions); + } +export type UpdateTaskGroupNameMutationHookResult = ReturnType; +export type UpdateTaskGroupNameMutationResult = ApolloReactCommon.MutationResult; +export type UpdateTaskGroupNameMutationOptions = ApolloReactCommon.BaseMutationOptions; export const ToggleTaskLabelDocument = gql` mutation toggleTaskLabel($taskID: UUID!, $projectLabelID: UUID!) { toggleTaskLabel(input: {taskID: $taskID, projectLabelID: $projectLabelID}) { diff --git a/web/src/shared/graphql/createTask.graphqls b/web/src/shared/graphql/createTask.graphqls index df600a1..1c51f85 100644 --- a/web/src/shared/graphql/createTask.graphqls +++ b/web/src/shared/graphql/createTask.graphqls @@ -4,6 +4,7 @@ mutation createTask($taskGroupID: String!, $name: String!, $position: Float!) { name position description + dueDate taskGroup { id name diff --git a/web/src/shared/graphql/findProject.graphqls b/web/src/shared/graphql/findProject.graphqls deleted file mode 100644 index f1fe1ac..0000000 --- a/web/src/shared/graphql/findProject.graphqls +++ /dev/null @@ -1,72 +0,0 @@ -query findProject($projectId: String!) { - findProject(input: { projectId: $projectId }) { - name - members { - id - fullName - profileIcon { - url - initials - bgColor - } - } - labels { - id - createdDate - name - labelColor { - id - name - colorHex - position - } - } - taskGroups { - id - name - position - tasks { - id - name - position - description - dueDate - taskGroup { - id - name - position - } - labels { - id - assignedDate - projectLabel { - id - name - createdDate - labelColor { - id - colorHex - position - name - } - } - } - assigned { - id - fullName - profileIcon { - url - initials - bgColor - } - } - } - } - } - labelColors { - id - position - colorHex - name - } -} diff --git a/web/src/shared/graphql/findProject.ts b/web/src/shared/graphql/findProject.ts new file mode 100644 index 0000000..0714ce8 --- /dev/null +++ b/web/src/shared/graphql/findProject.ts @@ -0,0 +1,45 @@ +import gql from 'graphql-tag'; +import TASK_FRAGMENT from './fragments/task'; + +const FIND_PROJECT_QUERY = gql` +query findProject($projectId: String!) { + findProject(input: { projectId: $projectId }) { + name + members { + id + fullName + profileIcon { + url + initials + bgColor + } + } + labels { + id + createdDate + name + labelColor { + id + name + colorHex + position + } + } + taskGroups { + id + name + position + tasks { + ...TaskFields + } + } + } + labelColors { + id + position + colorHex + name + } + ${TASK_FRAGMENT} +} +`; diff --git a/web/src/shared/graphql/findTask.graphqls b/web/src/shared/graphql/findTask.graphqls index 611b6bc..ba056ec 100644 --- a/web/src/shared/graphql/findTask.graphqls +++ b/web/src/shared/graphql/findTask.graphqls @@ -8,6 +8,18 @@ query findTask($taskID: UUID!) { taskGroup { id } + checklists { + id + name + position + items { + id + name + taskChecklistID + complete + position + } + } labels { id assignedDate diff --git a/web/src/shared/graphql/fragments/task.ts b/web/src/shared/graphql/fragments/task.ts new file mode 100644 index 0000000..96f20cd --- /dev/null +++ b/web/src/shared/graphql/fragments/task.ts @@ -0,0 +1,41 @@ +import gql from 'graphql-tag'; + +const TASK_FRAGMENT = gql` + fragment TaskFields on Task { + id + name + description + dueDate + complete + position + taskGroup { + id + } + labels { + id + assignedDate + projectLabel { + id + name + createdDate + labelColor { + id + colorHex + position + name + } + } + } + assigned { + id + fullName + profileIcon { + url + initials + bgColor + } + } + } +`; + +export default TASK_FRAGMENT; diff --git a/web/src/shared/graphql/task/createTaskChecklistItem.ts b/web/src/shared/graphql/task/createTaskChecklistItem.ts new file mode 100644 index 0000000..876c6d5 --- /dev/null +++ b/web/src/shared/graphql/task/createTaskChecklistItem.ts @@ -0,0 +1,13 @@ +import gql from 'graphql-tag'; + +const CREATE_TASK_CHECKLIST_ITEM = gql` + mutation createTaskChecklistItem($taskChecklistID: UUID!, $name: String!, $position: Float!) { + createTaskChecklistItem(input: { taskChecklistID: $taskChecklistID, name: $name, position: $position }) { + id + name + taskChecklistID + position + complete + } + } +`; diff --git a/web/src/shared/graphql/task/deleteTaskChecklistItem.ts b/web/src/shared/graphql/task/deleteTaskChecklistItem.ts new file mode 100644 index 0000000..71ab554 --- /dev/null +++ b/web/src/shared/graphql/task/deleteTaskChecklistItem.ts @@ -0,0 +1,13 @@ +import gql from 'graphql-tag'; + +const DELETE_TASK_CHECKLIST_ITEM = gql` + mutation deleteTaskChecklistItem($taskChecklistItemID: UUID!) { + deleteTaskChecklistItem(input: { taskChecklistItemID: $taskChecklistItemID }) { + ok + taskChecklistItem { + id + taskChecklistID + } + } + } +`; diff --git a/web/src/shared/graphql/task/setTaskChecklistItemComplete.ts b/web/src/shared/graphql/task/setTaskChecklistItemComplete.ts new file mode 100644 index 0000000..8928250 --- /dev/null +++ b/web/src/shared/graphql/task/setTaskChecklistItemComplete.ts @@ -0,0 +1,13 @@ +import gql from 'graphql-tag'; + +const SET_TASK_CHECKLIST_ITEM_COMPLETE = gql` + mutation setTaskChecklistItemComplete($taskChecklistItemID: UUID!, $complete: Boolean!) { + setTaskChecklistItemComplete(input: { taskChecklistItemID: $taskChecklistItemID, complete: $complete }) { + id + name + taskChecklistID + complete + position + } + } +`; diff --git a/web/src/shared/graphql/task/setTaskComplete.ts b/web/src/shared/graphql/task/setTaskComplete.ts new file mode 100644 index 0000000..5571df4 --- /dev/null +++ b/web/src/shared/graphql/task/setTaskComplete.ts @@ -0,0 +1,11 @@ +import gql from 'graphql-tag'; +import TASK_FRAGMENT from '../fragments/task'; + +const UPDATE_TASK_GROUP_NAME_MUTATION = gql` +mutation setTaskComplete($taskID: UUID!, $complete: Boolean!) { + setTaskComplete(input: { taskID: $taskID, complete: $complete }) { + ...TaskFields + } + ${TASK_FRAGMENT} +} +`; diff --git a/web/src/shared/graphql/task/updateTaskChecklistItemName.ts b/web/src/shared/graphql/task/updateTaskChecklistItemName.ts new file mode 100644 index 0000000..db4d952 --- /dev/null +++ b/web/src/shared/graphql/task/updateTaskChecklistItemName.ts @@ -0,0 +1,10 @@ +import gql from 'graphql-tag'; + +const UPDATE_TASK_CHECKLIST_ITEM_NAME = gql` + mutation updateTaskChecklistItemName($taskChecklistItemID: UUID!, $name: String!) { + updateTaskChecklistItemName(input: { taskChecklistItemID: $taskChecklistItemID, name: $name }) { + id + name + } + } +`; diff --git a/web/src/shared/graphql/taskGroup/updateTaskGroupName.ts b/web/src/shared/graphql/taskGroup/updateTaskGroupName.ts new file mode 100644 index 0000000..62064cf --- /dev/null +++ b/web/src/shared/graphql/taskGroup/updateTaskGroupName.ts @@ -0,0 +1,12 @@ +import gql from 'graphql-tag'; +import TASK_FRAGMENT from '../fragments/task'; + +const UPDATE_TASK_GROUP_NAME_MUTATION = gql` +mutation updateTaskGroupName($taskGroupID: UUID!, $name: String!) { + updateTaskGroupName(input:{taskGroupID:$taskGroupID, name:$name}) { + id + name + } + ${TASK_FRAGMENT} +} +`; diff --git a/web/src/shared/icons/AccountPlus.tsx b/web/src/shared/icons/AccountPlus.tsx new file mode 100644 index 0000000..7f57301 --- /dev/null +++ b/web/src/shared/icons/AccountPlus.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import Icon, { IconProps } from './Icon'; + +const AccountPlus: React.FC = ({ width = '16px', height = '16px', className }) => { + return ( + + + + ); +}; + +export default AccountPlus; diff --git a/web/src/shared/icons/CheckCircle.tsx b/web/src/shared/icons/CheckCircle.tsx new file mode 100644 index 0000000..43548b9 --- /dev/null +++ b/web/src/shared/icons/CheckCircle.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import Icon, { IconProps } from './Icon'; + +const CheckCircle: React.FC = ({ width = '16px', height = '16px', className }) => { + return ( + + + + ); +}; + +export default CheckCircle; diff --git a/web/src/shared/icons/CheckSquare.tsx b/web/src/shared/icons/CheckSquare.tsx new file mode 100644 index 0000000..38fa3d0 --- /dev/null +++ b/web/src/shared/icons/CheckSquare.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import Icon, { IconProps } from './Icon'; + +const CheckSquare: React.FC = ({ width = '16px', height = '16px', onClick, className }) => { + return ( + + + + ); +}; + +export default CheckSquare; diff --git a/web/src/shared/icons/CheckSquareOutline.tsx b/web/src/shared/icons/CheckSquareOutline.tsx new file mode 100644 index 0000000..a7cff93 --- /dev/null +++ b/web/src/shared/icons/CheckSquareOutline.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import Icon, { IconProps } from './Icon'; + +const CheckSquareOutline: React.FC = ({ width = '16px', height = '16px', className }) => { + return ( + + + + ); +}; + +export default CheckSquareOutline; diff --git a/web/src/shared/icons/Checkmark.tsx b/web/src/shared/icons/Checkmark.tsx index fe922a5..93344f1 100644 --- a/web/src/shared/icons/Checkmark.tsx +++ b/web/src/shared/icons/Checkmark.tsx @@ -1,21 +1,12 @@ import React from 'react'; +import Icon, { IconProps } from './Icon'; -type Props = { - size: number | string; - color: string; -}; - -const Checkmark = ({ size, color }: Props) => { +const Checkmark: React.FC = ({ width = '16px', height = '16px', className }) => { return ( - + - + ); }; -Checkmark.defaultProps = { - size: 16, - color: '#000', -}; - export default Checkmark; diff --git a/web/src/shared/icons/Clock.tsx b/web/src/shared/icons/Clock.tsx new file mode 100644 index 0000000..eb79b8c --- /dev/null +++ b/web/src/shared/icons/Clock.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import Icon, { IconProps } from './Icon'; + +const Clock: React.FC = ({ width = '16px', height = '16px', className }) => { + return ( + + + + ); +}; + +export default Clock; diff --git a/web/src/shared/icons/Cross.tsx b/web/src/shared/icons/Cross.tsx index 279a975..ca9792f 100644 --- a/web/src/shared/icons/Cross.tsx +++ b/web/src/shared/icons/Cross.tsx @@ -1,21 +1,12 @@ import React from 'react'; +import Icon, { IconProps } from './Icon'; -type Props = { - size: number | string; - color: string; -}; - -const Cross = ({ size, color }: Props) => { +const Cross: React.FC = ({ width = '16px', height = '16px', className, onClick }) => { return ( - + - + ); }; -Cross.defaultProps = { - size: 16, - color: '#000', -}; - export default Cross; diff --git a/web/src/shared/icons/Icon.tsx b/web/src/shared/icons/Icon.tsx index 3d9bf6d..0dd9272 100644 --- a/web/src/shared/icons/Icon.tsx +++ b/web/src/shared/icons/Icon.tsx @@ -4,6 +4,8 @@ import styled from 'styled-components/macro'; export type IconProps = { width: number | string; height: number | string; + className?: string; + onClick?: () => void; }; type Props = { @@ -11,15 +13,27 @@ type Props = { height: number | string; viewBox: string; className?: string; + onClick?: () => void; }; const Svg = styled.svg` fill: rgba(${props => props.theme.colors.text.primary}); `; -const Icon: React.FC = ({ width, height, viewBox, className, children }) => { +const Icon: React.FC = ({ width, height, viewBox, className, onClick, children }) => { return ( - + { + if (onClick) { + onClick(); + } + }} + className={className} + width={width} + height={height} + xmlns="http://www.w3.org/2000/svg" + viewBox={viewBox} + > {children} ); diff --git a/web/src/shared/icons/Square.tsx b/web/src/shared/icons/Square.tsx new file mode 100644 index 0000000..c2c6b46 --- /dev/null +++ b/web/src/shared/icons/Square.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import Icon, { IconProps } from './Icon'; + +const Square: React.FC = ({ width = '16px', height = '16px', className, onClick }) => { + return ( + + + + ); +}; + +export default Square; diff --git a/web/src/shared/icons/Trash.tsx b/web/src/shared/icons/Trash.tsx new file mode 100644 index 0000000..7e67aee --- /dev/null +++ b/web/src/shared/icons/Trash.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import Icon, { IconProps } from './Icon'; + +const Trash: React.FC = ({ width = '16px', height = '16px', className }) => { + return ( + + + + ); +}; + +export default Trash; diff --git a/web/src/shared/icons/index.ts b/web/src/shared/icons/index.ts index de9c3a5..0762cdc 100644 --- a/web/src/shared/icons/index.ts +++ b/web/src/shared/icons/index.ts @@ -1,6 +1,13 @@ import Cross from './Cross'; import Cog from './Cog'; +import Trash from './Trash'; +import CheckCircle from './CheckCircle'; +import Clock from './Clock'; +import AccountPlus from './AccountPlus'; +import CheckSquare from './CheckSquare'; import ArrowLeft from './ArrowLeft'; +import CheckSquareOutline from './CheckSquareOutline'; +import Square from './Square'; import Bolt from './Bolt'; import Plus from './Plus'; import Bell from './Bell'; @@ -42,8 +49,15 @@ export { Citadel, Checkmark, User, + Trash, Users, Lock, ArrowLeft, + CheckCircle, + AccountPlus, + Clock, + CheckSquareOutline, + CheckSquare, + Square, ToggleOn, };