From 33f050085c55a9dfa07dcef9040b95b69298402e Mon Sep 17 00:00:00 2001 From: kjuulh Date: Sun, 21 Nov 2021 20:40:41 +0100 Subject: [PATCH] Adding priority --- .../Todo.Api/Controllers/TodosController.cs | 6 ++- .../Commands/Todo/CreateTodoCommand.cs | 4 +- .../Commands/Todo/ReplaceTodoCommand.cs | 6 ++- .../server/src/Todo.Core/Entities/Todo.cs | 3 +- .../Interfaces/Persistence/ITodoRepository.cs | 1 + .../Mongo/Repositories/Dtos/MongoTodo.cs | 4 +- .../todos/add/addPriorityButton.tsx | 54 +++++++++++++++++++ .../src/components/todos/add/addTodoForm.tsx | 13 ++++- src/client/src/components/todos/addTodo.tsx | 5 +- .../todos/collapsed/todoShortForm.tsx | 35 +++++++----- src/client/src/core/entities/todo.tsx | 1 + src/client/src/pages/index.tsx | 2 +- .../src/presentation/hooks/socketHooks.tsx | 8 ++- 13 files changed, 116 insertions(+), 26 deletions(-) create mode 100644 src/client/src/components/todos/add/addPriorityButton.tsx diff --git a/src/backend/server/src/Todo.Api/Controllers/TodosController.cs b/src/backend/server/src/Todo.Api/Controllers/TodosController.cs index f2f4ed9..81c7276 100644 --- a/src/backend/server/src/Todo.Api/Controllers/TodosController.cs +++ b/src/backend/server/src/Todo.Api/Controllers/TodosController.cs @@ -80,6 +80,9 @@ public class TodosController : ApiController [JsonPropertyName("created")] public long Created { get; init; } = 0; + + [JsonPropertyName("priority")] + public string? Priority { get; init; } internal ReplaceTodoCommand To(string id) => new( id, @@ -87,6 +90,7 @@ public class TodosController : ApiController Project, Description, Status, - Created); + Created, + Priority); } } \ No newline at end of file diff --git a/src/backend/server/src/Todo.Core/Application/Commands/Todo/CreateTodoCommand.cs b/src/backend/server/src/Todo.Core/Application/Commands/Todo/CreateTodoCommand.cs index 5025828..43cc640 100644 --- a/src/backend/server/src/Todo.Core/Application/Commands/Todo/CreateTodoCommand.cs +++ b/src/backend/server/src/Todo.Core/Application/Commands/Todo/CreateTodoCommand.cs @@ -11,7 +11,8 @@ namespace Todo.Core.Application.Commands.Todo; public record CreateTodoCommand( [Required] string TodoTitle, string? TodoProject, - string? TodoDescription) : IRequest + string? TodoDescription, + string? Priority) : IRequest { internal class Handler : IRequestHandler { @@ -41,6 +42,7 @@ public record CreateTodoCommand( request.TodoTitle, request.TodoProject, request.TodoDescription, + request.Priority userId, DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()); diff --git a/src/backend/server/src/Todo.Core/Application/Commands/Todo/ReplaceTodoCommand.cs b/src/backend/server/src/Todo.Core/Application/Commands/Todo/ReplaceTodoCommand.cs index 065b709..577f3ec 100644 --- a/src/backend/server/src/Todo.Core/Application/Commands/Todo/ReplaceTodoCommand.cs +++ b/src/backend/server/src/Todo.Core/Application/Commands/Todo/ReplaceTodoCommand.cs @@ -12,7 +12,8 @@ public record ReplaceTodoCommand( string? Project, string? Description, bool Status, - long Created) : IRequest + long Created, + string? Priority) : IRequest { internal class Handler : IRequestHandler { @@ -51,5 +52,6 @@ public record ReplaceTodoCommand( Project, authorId, Description, - Created); + Created, + Priority); } \ No newline at end of file diff --git a/src/backend/server/src/Todo.Core/Entities/Todo.cs b/src/backend/server/src/Todo.Core/Entities/Todo.cs index 5d44882..6875ae3 100644 --- a/src/backend/server/src/Todo.Core/Entities/Todo.cs +++ b/src/backend/server/src/Todo.Core/Entities/Todo.cs @@ -7,4 +7,5 @@ public record Todo( string? Project, string AuthorId, string? Description, - long Created); \ No newline at end of file + long Created, + string? Priority); \ No newline at end of file diff --git a/src/backend/server/src/Todo.Core/Interfaces/Persistence/ITodoRepository.cs b/src/backend/server/src/Todo.Core/Interfaces/Persistence/ITodoRepository.cs index 8af3ba2..0cb6587 100644 --- a/src/backend/server/src/Todo.Core/Interfaces/Persistence/ITodoRepository.cs +++ b/src/backend/server/src/Todo.Core/Interfaces/Persistence/ITodoRepository.cs @@ -8,6 +8,7 @@ public interface ITodoRepository string title, string? projectName, string? description, + string? priority, string userId, long created); diff --git a/src/backend/server/src/Todo.Persistence/Mongo/Repositories/Dtos/MongoTodo.cs b/src/backend/server/src/Todo.Persistence/Mongo/Repositories/Dtos/MongoTodo.cs index 49325bc..b6fab0e 100644 --- a/src/backend/server/src/Todo.Persistence/Mongo/Repositories/Dtos/MongoTodo.cs +++ b/src/backend/server/src/Todo.Persistence/Mongo/Repositories/Dtos/MongoTodo.cs @@ -20,6 +20,7 @@ public record MongoTodo public string? ProjectName { get; set; } = string.Empty; public string AuthorId { get; set; } public long Created { get; set; } = 0; + public string? Priority { get; set; } = string.Empty; public Core.Entities.Todo To() => new( Id, @@ -28,5 +29,6 @@ public record MongoTodo ProjectName, AuthorId, Description, - Created); + Created, + Priority); } \ No newline at end of file diff --git a/src/client/src/components/todos/add/addPriorityButton.tsx b/src/client/src/components/todos/add/addPriorityButton.tsx new file mode 100644 index 0000000..2befe53 --- /dev/null +++ b/src/client/src/components/todos/add/addPriorityButton.tsx @@ -0,0 +1,54 @@ +import { ButtonHTMLAttributes, FC, useState } from "react"; +import { OutlinedButton } from "@src/components/common/buttons/outlinedButton"; +import Tippy from "@tippyjs/react"; + +interface AddPriorityButtonProps + extends ButtonHTMLAttributes { + initialPriority?: string; + onPriorityChanged: (project: string) => void; +} + +export const AddPriorityButton: FC = (props) => { + const [menuIsOpen, setMenuIsOpen] = useState(false); + return ( + { + setMenuIsOpen(false); + }} + delay={0} + interactive={true} + duration={0} + content={ +
+
+ {["p1", "p2", "p3"].map((p) => ( +
+ +
+ ))} +
+
+ } + > + + setMenuIsOpen(true)} + > + {props.children || "Add Priority"} + + +
+ ); +}; diff --git a/src/client/src/components/todos/add/addTodoForm.tsx b/src/client/src/components/todos/add/addTodoForm.tsx index c0efcec..a393957 100644 --- a/src/client/src/components/todos/add/addTodoForm.tsx +++ b/src/client/src/components/todos/add/addTodoForm.tsx @@ -4,19 +4,26 @@ import { PrimaryButton } from "@src/components/common/buttons/primaryButton"; import { TodoShortForm } from "@src/components/todos/collapsed/todoShortForm"; export const AddTodoForm: FC<{ - onAdd: (todoName: string, project: string, description: string) => void; + onAdd: ( + todoName: string, + project: string, + description: string, + priority: string + ) => void; onClose: () => void; project: string; + priority: string; }> = ({ onAdd, onClose, ...props }) => { const [todoName, setTodoName] = useState(""); const [todoDescription, setTodoDescription] = useState(""); const [project, setProject] = useState(props.project); + const [priority, setPriority] = useState(props.priority); return (
{ e.preventDefault(); - onAdd(todoName, project, todoDescription); + onAdd(todoName, project, todoDescription, priority); setTodoName(""); setTodoDescription(""); }} @@ -25,6 +32,8 @@ export const AddTodoForm: FC<{ setProject(p)} + priority={priority} + onPriorityChanged={setPriority} name={todoName} onNameChange={(e) => setTodoName(e.target.value)} description={todoDescription} diff --git a/src/client/src/components/todos/addTodo.tsx b/src/client/src/components/todos/addTodo.tsx index 1f465a6..808551d 100644 --- a/src/client/src/components/todos/addTodo.tsx +++ b/src/client/src/components/todos/addTodo.tsx @@ -22,8 +22,9 @@ export function AddTodo(props: { project: string }) { return ( { - createTodo(todoName, project, description); + priority={""} + onAdd={(todoName, project, description, priority) => { + createTodo(todoName, description, project, priority); }} onClose={() => setCollapsed(CollapsedState.collapsed)} /> diff --git a/src/client/src/components/todos/collapsed/todoShortForm.tsx b/src/client/src/components/todos/collapsed/todoShortForm.tsx index 00d3f0d..b53981c 100644 --- a/src/client/src/components/todos/collapsed/todoShortForm.tsx +++ b/src/client/src/components/todos/collapsed/todoShortForm.tsx @@ -1,9 +1,12 @@ import TextareaAutosize from "react-textarea-autosize"; import { AddProjectButton } from "@src/components/todos/add/addProjectButton"; +import { AddPriorityButton } from "@src/components/todos/add/addPriorityButton"; export const TodoShortForm = (props: { project: string; onProjectChanged: (project: string) => void; + priority: string; + onPriorityChanged: (project: string) => void; name: string; onNameChange: (e) => void; description: string; @@ -34,20 +37,24 @@ export const TodoShortForm = (props: { minRows={3} /> -
- - {props.project} - - - {props.project} - -
+
+
+ + {props.project} + +
+ +
+ + {props.priority} + +
diff --git a/src/client/src/core/entities/todo.tsx b/src/client/src/core/entities/todo.tsx index a046d49..ac1d9f9 100644 --- a/src/client/src/core/entities/todo.tsx +++ b/src/client/src/core/entities/todo.tsx @@ -14,6 +14,7 @@ export interface Todo { project?: string; authorId?: string; created: number; + priority?: string; } export const asTodo = (item: Todo): Todo => { diff --git a/src/client/src/pages/index.tsx b/src/client/src/pages/index.tsx index d52a749..01199c7 100644 --- a/src/client/src/pages/index.tsx +++ b/src/client/src/pages/index.tsx @@ -55,7 +55,7 @@ const HomePage = () => { /> ))} - {data && data.length === 0 && ( + {onlyActiveTodos && onlyActiveTodos.length === 0 && (
diff --git a/src/client/src/presentation/hooks/socketHooks.tsx b/src/client/src/presentation/hooks/socketHooks.tsx index d6cb010..49f6d2d 100644 --- a/src/client/src/presentation/hooks/socketHooks.tsx +++ b/src/client/src/presentation/hooks/socketHooks.tsx @@ -18,7 +18,12 @@ export const useCreateTodo = () => { const [createTodo, { isLoading }] = todosApi.useCreateTodoMutation(); return { - createTodo: (todoName: string, project: string, description: string) => { + createTodo: ( + todoName: string, + description: string, + project?: string, + priority?: string + ) => { createTodo({ id: nanoid(), created: 0, @@ -26,6 +31,7 @@ export const useCreateTodo = () => { title: todoName, project, description, + priority, }); }, };