From fc1c75ca3b75b5aae44868bb6473cb1dab884376 Mon Sep 17 00:00:00 2001 From: Kye Date: Mon, 27 May 2024 15:35:45 +0100 Subject: [PATCH 01/10] add TodoListItem class --- Todo-Challenge/Todo-Challenge/TodoListItem.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Todo-Challenge/Todo-Challenge/TodoListItem.cs diff --git a/Todo-Challenge/Todo-Challenge/TodoListItem.cs b/Todo-Challenge/Todo-Challenge/TodoListItem.cs new file mode 100644 index 0000000..a099599 --- /dev/null +++ b/Todo-Challenge/Todo-Challenge/TodoListItem.cs @@ -0,0 +1,17 @@ +namespace Todo_Challenge +{ + internal class TodoListItem + { + public string Name { get; set; } + public bool Completed { get; set; } + public TodoListItem(string name, bool completed) + { + Name = name; + Completed = completed; + } + + public TodoListItem(string name) : this(name, false) + { + } + } +} From 0abad53adcceecc787727a5f399fbb67a3fda301 Mon Sep 17 00:00:00 2001 From: Kye Date: Mon, 27 May 2024 16:25:36 +0100 Subject: [PATCH 02/10] add id property and update TodoListItem constructor --- Todo-Challenge/Todo-Challenge/TodoListItem.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Todo-Challenge/Todo-Challenge/TodoListItem.cs b/Todo-Challenge/Todo-Challenge/TodoListItem.cs index a099599..13df4f8 100644 --- a/Todo-Challenge/Todo-Challenge/TodoListItem.cs +++ b/Todo-Challenge/Todo-Challenge/TodoListItem.cs @@ -2,15 +2,18 @@ { internal class TodoListItem { + public int Id { get; set; } public string Name { get; set; } public bool Completed { get; set; } - public TodoListItem(string name, bool completed) + + public TodoListItem(int id, string name, bool completed) { + Id = id; Name = name; Completed = completed; } - public TodoListItem(string name) : this(name, false) + public TodoListItem(int id, string name) : this(id, name, false) { } } From 186e04f0d99fcc54f0c745e57448c171ab8fa14c Mon Sep 17 00:00:00 2001 From: Kye Date: Mon, 27 May 2024 17:52:08 +0100 Subject: [PATCH 03/10] add exit command and view TodoList command --- Todo-Challenge/Todo-Challenge/Program.cs | 47 +++++++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/Todo-Challenge/Todo-Challenge/Program.cs b/Todo-Challenge/Todo-Challenge/Program.cs index 3751555..a44706a 100644 --- a/Todo-Challenge/Todo-Challenge/Program.cs +++ b/Todo-Challenge/Todo-Challenge/Program.cs @@ -1,2 +1,45 @@ -// See https://aka.ms/new-console-template for more information -Console.WriteLine("Hello, World!"); +using Todo_Challenge; + +class Program +{ + static void Main() + { + Console.WriteLine("Todo List v0.1\n"); + + List todoList = [new(0, "Water the plants")]; + + Console.WriteLine("Type 'help' to see the list of commands.\n"); + + while (true) + { + string? userInput = Console.ReadLine(); + + switch (userInput) + { + case "help": + Console.WriteLine("\nThe following commands are available:\n"); + Console.WriteLine("0 - Exit.\n1 - View Todo List.\n2 - Create a Todo Item.\n3 - Remove a Todo Item.\n4 - Mark Todo Item as complete.\n\n"); + break; + case "0": + Console.WriteLine("\nExiting..."); + Environment.Exit(0); + break; + case "1": + if (todoList.Count < 1) + { + Console.WriteLine("Todo List is empty.\n"); + break; + } + + foreach (var todo in todoList) + { + Console.WriteLine($"\nID: {todo.Id} \nTodo: {todo.Name} \nCompleted: {todo.Completed}\n"); + } + break; + default: + Console.WriteLine("Unknown command. Type 'help' to see the list of commands."); + break; + } + } + } +} \ No newline at end of file From 9ad4eb7c14c615abbe7637b670ef63f8b9bab224 Mon Sep 17 00:00:00 2001 From: Kye Date: Mon, 27 May 2024 18:28:18 +0100 Subject: [PATCH 04/10] update TodoListItem class to autoincrement id --- Todo-Challenge/Todo-Challenge/TodoListItem.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Todo-Challenge/Todo-Challenge/TodoListItem.cs b/Todo-Challenge/Todo-Challenge/TodoListItem.cs index 13df4f8..f07c3e5 100644 --- a/Todo-Challenge/Todo-Challenge/TodoListItem.cs +++ b/Todo-Challenge/Todo-Challenge/TodoListItem.cs @@ -2,18 +2,20 @@ { internal class TodoListItem { - public int Id { get; set; } + private static int lastId = -1; + + public int Id { get; private set; } public string Name { get; set; } public bool Completed { get; set; } - public TodoListItem(int id, string name, bool completed) + public TodoListItem(string name, bool completed) { - Id = id; + Id = ++lastId; Name = name; Completed = completed; } - public TodoListItem(int id, string name) : this(id, name, false) + public TodoListItem(string name) : this( name, false) { } } From 63ba65b98face88e8a695a1a3372d52912c0a5a1 Mon Sep 17 00:00:00 2001 From: Kye Date: Mon, 27 May 2024 18:31:26 +0100 Subject: [PATCH 05/10] add create Todo command --- Todo-Challenge/Todo-Challenge/Program.cs | 42 ++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/Todo-Challenge/Todo-Challenge/Program.cs b/Todo-Challenge/Todo-Challenge/Program.cs index a44706a..43098cc 100644 --- a/Todo-Challenge/Todo-Challenge/Program.cs +++ b/Todo-Challenge/Todo-Challenge/Program.cs @@ -6,7 +6,7 @@ static void Main() { Console.WriteLine("Todo List v0.1\n"); - List todoList = [new(0, "Water the plants")]; + List todoList = [new("Water the plants")]; Console.WriteLine("Type 'help' to see the list of commands.\n"); @@ -20,11 +20,11 @@ static void Main() Console.WriteLine("\nThe following commands are available:\n"); Console.WriteLine("0 - Exit.\n1 - View Todo List.\n2 - Create a Todo Item.\n3 - Remove a Todo Item.\n4 - Mark Todo Item as complete.\n\n"); break; - case "0": + case "0": // Exit Console.WriteLine("\nExiting..."); Environment.Exit(0); break; - case "1": + case "1": // View TodoList if (todoList.Count < 1) { Console.WriteLine("Todo List is empty.\n"); @@ -36,6 +36,42 @@ static void Main() Console.WriteLine($"\nID: {todo.Id} \nTodo: {todo.Name} \nCompleted: {todo.Completed}\n"); } break; + case "2": // Create Todo + string? name; + while (true) + { + Console.Write("\nEnter Name: "); + name = Console.ReadLine()?.Trim(); + if (!string.IsNullOrEmpty(name)) + { + break; + } + Console.WriteLine("Name cannot be empty. Please enter a valid name."); + } + + bool completed = false; + while (true) + { + Console.Write("Is it completed? (y/n): "); + string? completedInput = Console.ReadLine()?.Trim().ToLower(); + if (completedInput == "y") + { + completed = true; + break; + } + else if (completedInput == "n") + { + completed = false; + break; + } + Console.WriteLine("Invalid input. Please enter 'y' or 'n'."); + } + + TodoListItem newTodo = new(name, completed); + todoList.Add(newTodo); + + Console.WriteLine($"\nCreated New Todo: \nID: {newTodo.Id} \nTodo:{newTodo.Name} \nCompleted: {newTodo.Completed}\n"); + break; default: Console.WriteLine("Unknown command. Type 'help' to see the list of commands."); break; From 491256ac4a01fdc94b4cabd5933b830e4971705f Mon Sep 17 00:00:00 2001 From: Kye Date: Mon, 27 May 2024 19:11:41 +0100 Subject: [PATCH 06/10] add remove Todo command --- Todo-Challenge/Todo-Challenge/Program.cs | 31 ++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/Todo-Challenge/Todo-Challenge/Program.cs b/Todo-Challenge/Todo-Challenge/Program.cs index 43098cc..6270c2a 100644 --- a/Todo-Challenge/Todo-Challenge/Program.cs +++ b/Todo-Challenge/Todo-Challenge/Program.cs @@ -18,13 +18,14 @@ static void Main() { case "help": Console.WriteLine("\nThe following commands are available:\n"); - Console.WriteLine("0 - Exit.\n1 - View Todo List.\n2 - Create a Todo Item.\n3 - Remove a Todo Item.\n4 - Mark Todo Item as complete.\n\n"); + Console.WriteLine("0 - Exit.\n1 - View Todo List.\n2 - Create a Todo Item.\n3 - Remove a Todo Item.\n4 - Mark Todo Item as complete.\n"); break; case "0": // Exit Console.WriteLine("\nExiting..."); Environment.Exit(0); break; case "1": // View TodoList + Console.WriteLine("\nTodo List:"); if (todoList.Count < 1) { Console.WriteLine("Todo List is empty.\n"); @@ -42,6 +43,7 @@ static void Main() { Console.Write("\nEnter Name: "); name = Console.ReadLine()?.Trim(); + if (!string.IsNullOrEmpty(name)) { break; @@ -54,6 +56,7 @@ static void Main() { Console.Write("Is it completed? (y/n): "); string? completedInput = Console.ReadLine()?.Trim().ToLower(); + if (completedInput == "y") { completed = true; @@ -64,13 +67,37 @@ static void Main() completed = false; break; } + Console.WriteLine("Invalid input. Please enter 'y' or 'n'."); } TodoListItem newTodo = new(name, completed); todoList.Add(newTodo); - Console.WriteLine($"\nCreated New Todo: \nID: {newTodo.Id} \nTodo:{newTodo.Name} \nCompleted: {newTodo.Completed}\n"); + Console.WriteLine($"\nCreated New Todo: \n\nID: {newTodo.Id} \nTodo: {newTodo.Name} \nCompleted: {newTodo.Completed}\n"); + break; + case "3": // Remove Todo + Console.Write("\nEnter ID: "); + string? idInput = Console.ReadLine()?.Trim(); + + if (int.TryParse(idInput, out int id)) + { + TodoListItem? itemToRemove = todoList.Find(todo => todo.Id == id); + + if (itemToRemove != null) + { + todoList.Remove(itemToRemove); + Console.WriteLine($"Removed Todo with ID: {id}\n"); + } + else + { + Console.WriteLine($"Todo Item with ID: {id} not found.\n"); + } + } + else + { + Console.WriteLine("Invalid ID. Please enter a valid integer.\n"); + } break; default: Console.WriteLine("Unknown command. Type 'help' to see the list of commands."); From 683a97a177535dc5ded5821a3a1cdf7cb86a8979 Mon Sep 17 00:00:00 2001 From: Kye Date: Tue, 28 May 2024 17:08:45 +0100 Subject: [PATCH 07/10] add complete Todo command --- Todo-Challenge/Todo-Challenge/Program.cs | 46 ++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/Todo-Challenge/Todo-Challenge/Program.cs b/Todo-Challenge/Todo-Challenge/Program.cs index 6270c2a..24e763c 100644 --- a/Todo-Challenge/Todo-Challenge/Program.cs +++ b/Todo-Challenge/Todo-Challenge/Program.cs @@ -41,7 +41,7 @@ static void Main() string? name; while (true) { - Console.Write("\nEnter Name: "); + Console.Write("\nEnter name of Todo to create: "); name = Console.ReadLine()?.Trim(); if (!string.IsNullOrEmpty(name)) @@ -77,7 +77,7 @@ static void Main() Console.WriteLine($"\nCreated New Todo: \n\nID: {newTodo.Id} \nTodo: {newTodo.Name} \nCompleted: {newTodo.Completed}\n"); break; case "3": // Remove Todo - Console.Write("\nEnter ID: "); + Console.Write("\nEnter ID of Todo to remove: "); string? idInput = Console.ReadLine()?.Trim(); if (int.TryParse(idInput, out int id)) @@ -99,8 +99,48 @@ static void Main() Console.WriteLine("Invalid ID. Please enter a valid integer.\n"); } break; + case "4": // Complete Todo + Console.Write("\nEnter ID of Todo to complete: "); + string? idInput2 = Console.ReadLine()?.Trim(); + + if (int.TryParse(idInput2, out int id2)) + { + TodoListItem? todoToUpdate = todoList.Find(todo => todo.Id == id2); + + if (todoToUpdate == null) + { + Console.WriteLine($"Todo Item with ID: {id2} not found.\n"); + break; + } + + while (true) + { + Console.Write("Mark as completed? (y/n): "); + string? completedInput = Console.ReadLine()?.Trim().ToLower(); + + if (completedInput == "y") + { + todoToUpdate.Completed = true; + break; + } + else if (completedInput == "n") + { + todoToUpdate.Completed = false; + break; + } + + Console.WriteLine("Invalid input. Please enter 'y' or 'n'."); + } + + Console.WriteLine($"\nUpdated Todo: \n\nID: {todoToUpdate.Id} \nTodo: {todoToUpdate.Name} \nCompleted: {todoToUpdate.Completed}\n"); + } + else + { + Console.WriteLine("Invalid ID. Please enter a valid integer.\n"); + } + break; default: - Console.WriteLine("Unknown command. Type 'help' to see the list of commands."); + Console.WriteLine("\nUnknown command. Type 'help' to see the list of commands.\n"); break; } } From c1ea23010e418a860722989884b0c1aa29cc63fa Mon Sep 17 00:00:00 2001 From: Kye Date: Tue, 28 May 2024 17:53:39 +0100 Subject: [PATCH 08/10] add Menu class for handling command logic --- Todo-Challenge/Todo-Challenge/Menu.cs | 178 ++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 Todo-Challenge/Todo-Challenge/Menu.cs diff --git a/Todo-Challenge/Todo-Challenge/Menu.cs b/Todo-Challenge/Todo-Challenge/Menu.cs new file mode 100644 index 0000000..fc570af --- /dev/null +++ b/Todo-Challenge/Todo-Challenge/Menu.cs @@ -0,0 +1,178 @@ +using System; +using System.Collections.Generic; + +namespace Todo_Challenge +{ + internal class Menu + { + private List todoList = new List(); + + private void ShowCommands() + { + Console.WriteLine("\nThe following commands are available:\n"); + Console.WriteLine("0 - Exit.\n1 - View Todo List.\n2 - Create a Todo Item.\n3 - Remove a Todo Item.\n4 - Mark Todo Item as complete.\n"); + } + + private void ViewTodoList() + { + Console.WriteLine("\nTodo List:"); + if (todoList.Count < 1) + { + Console.WriteLine("\nTodo List is empty.\n"); + } + + foreach (var todo in todoList) + { + Console.WriteLine($"\nID: {todo.Id} \nTodo: {todo.Name} \nCompleted: {todo.Completed}\n"); + } + } + + private void CreateTodoItem() + { + string? name; + while (true) + { + Console.Write("\nEnter name of Todo to create: "); + name = Console.ReadLine()?.Trim(); + + if (!string.IsNullOrEmpty(name)) + { + break; + } + Console.WriteLine("Name cannot be empty. Please enter a valid name."); + } + + bool completed; + while (true) + { + Console.Write("Is it completed? (y/n): "); + string? completedInput = Console.ReadLine()?.Trim().ToLower(); + + if (completedInput == "y") + { + completed = true; + break; + } + else if (completedInput == "n") + { + completed = false; + break; + } + + Console.WriteLine("Invalid input. Please enter 'y' or 'n'."); + } + + TodoListItem newTodo = new(name, completed); + todoList.Add(newTodo); + + Console.WriteLine($"\nCreated New Todo: \n\nID: {newTodo.Id} \nTodo: {newTodo.Name} \nCompleted: {newTodo.Completed}\n"); + } + + private void RemoveTodoItem() + { + Console.Write("\nEnter ID of Todo to remove: "); + string? idInput = Console.ReadLine()?.Trim(); + + if (int.TryParse(idInput, out int id)) + { + TodoListItem? itemToRemove = todoList.Find(todo => todo.Id == id); + + if (itemToRemove != null) + { + todoList.Remove(itemToRemove); + Console.WriteLine($"Removed Todo with ID: {id}\n"); + } + else + { + Console.WriteLine($"Todo Item with ID: {id} not found.\n"); + } + } + else + { + Console.WriteLine("Invalid ID. Please enter a valid integer.\n"); + } + } + + private void MarkTodoItemAsComplete() + { + int id; + while (true) + { + Console.Write("Enter ID of the Todo to complete: "); + string? idInput = Console.ReadLine()?.Trim(); + if (int.TryParse(idInput, out id)) + { + break; + } + Console.WriteLine("Invalid ID. Please enter a valid integer."); + } + + TodoListItem? todoToUpdate = todoList.Find(todo => todo.Id == id); + + if (todoToUpdate == null) + { + Console.WriteLine($"Todo Item with ID: {id} not found.\n"); + return; + } + + while (true) + { + Console.Write("Mark as completed? (y/n): "); + string? completedInput = Console.ReadLine()?.Trim().ToLower(); + + if (completedInput == "y") + { + todoToUpdate.Completed = true; + break; + } + else if (completedInput == "n") + { + todoToUpdate.Completed = false; + break; + } + Console.WriteLine("Invalid input. Please enter 'yes' or 'no'."); + } + + Console.WriteLine($"\nUpdated Todo: \n\nID: {todoToUpdate.Id} \nTodo: {todoToUpdate.Name} \nCompleted: {todoToUpdate.Completed}\n"); + } + + public void HandleResponse() + { + while (true) + { + string? command = Console.ReadLine()?.Trim(); + + switch (command) + { + case "help": + ShowCommands(); + break; + + case "0": + Environment.Exit(0); + break; + + case "1": + ViewTodoList(); + break; + + case "2": + CreateTodoItem(); + break; + + case "3": + RemoveTodoItem(); + break; + + case "4": + MarkTodoItemAsComplete(); + break; + + default: + Console.WriteLine("Unknown command. Type 'help' to see the list of commands.\n"); + break; + } + } + } + } +} From a5f1a73c859911e6fde8cb6f4eaabe920899a982 Mon Sep 17 00:00:00 2001 From: Kye Date: Tue, 28 May 2024 18:01:28 +0100 Subject: [PATCH 09/10] refactor Program to utilise Menu class --- Todo-Challenge/Todo-Challenge/Program.cs | 139 +---------------------- 1 file changed, 5 insertions(+), 134 deletions(-) diff --git a/Todo-Challenge/Todo-Challenge/Program.cs b/Todo-Challenge/Todo-Challenge/Program.cs index 24e763c..c9345e3 100644 --- a/Todo-Challenge/Todo-Challenge/Program.cs +++ b/Todo-Challenge/Todo-Challenge/Program.cs @@ -1,148 +1,19 @@ -using Todo_Challenge; +using System; +using Todo_Challenge; class Program { static void Main() { Console.WriteLine("Todo List v0.1\n"); - - List todoList = [new("Water the plants")]; - Console.WriteLine("Type 'help' to see the list of commands.\n"); while (true) { - string? userInput = Console.ReadLine(); - - switch (userInput) - { - case "help": - Console.WriteLine("\nThe following commands are available:\n"); - Console.WriteLine("0 - Exit.\n1 - View Todo List.\n2 - Create a Todo Item.\n3 - Remove a Todo Item.\n4 - Mark Todo Item as complete.\n"); - break; - case "0": // Exit - Console.WriteLine("\nExiting..."); - Environment.Exit(0); - break; - case "1": // View TodoList - Console.WriteLine("\nTodo List:"); - if (todoList.Count < 1) - { - Console.WriteLine("Todo List is empty.\n"); - break; - } - - foreach (var todo in todoList) - { - Console.WriteLine($"\nID: {todo.Id} \nTodo: {todo.Name} \nCompleted: {todo.Completed}\n"); - } - break; - case "2": // Create Todo - string? name; - while (true) - { - Console.Write("\nEnter name of Todo to create: "); - name = Console.ReadLine()?.Trim(); - - if (!string.IsNullOrEmpty(name)) - { - break; - } - Console.WriteLine("Name cannot be empty. Please enter a valid name."); - } - - bool completed = false; - while (true) - { - Console.Write("Is it completed? (y/n): "); - string? completedInput = Console.ReadLine()?.Trim().ToLower(); - - if (completedInput == "y") - { - completed = true; - break; - } - else if (completedInput == "n") - { - completed = false; - break; - } - - Console.WriteLine("Invalid input. Please enter 'y' or 'n'."); - } - - TodoListItem newTodo = new(name, completed); - todoList.Add(newTodo); + var todoList = new Menu(); - Console.WriteLine($"\nCreated New Todo: \n\nID: {newTodo.Id} \nTodo: {newTodo.Name} \nCompleted: {newTodo.Completed}\n"); - break; - case "3": // Remove Todo - Console.Write("\nEnter ID of Todo to remove: "); - string? idInput = Console.ReadLine()?.Trim(); - - if (int.TryParse(idInput, out int id)) - { - TodoListItem? itemToRemove = todoList.Find(todo => todo.Id == id); - - if (itemToRemove != null) - { - todoList.Remove(itemToRemove); - Console.WriteLine($"Removed Todo with ID: {id}\n"); - } - else - { - Console.WriteLine($"Todo Item with ID: {id} not found.\n"); - } - } - else - { - Console.WriteLine("Invalid ID. Please enter a valid integer.\n"); - } - break; - case "4": // Complete Todo - Console.Write("\nEnter ID of Todo to complete: "); - string? idInput2 = Console.ReadLine()?.Trim(); - - if (int.TryParse(idInput2, out int id2)) - { - TodoListItem? todoToUpdate = todoList.Find(todo => todo.Id == id2); - - if (todoToUpdate == null) - { - Console.WriteLine($"Todo Item with ID: {id2} not found.\n"); - break; - } - - while (true) - { - Console.Write("Mark as completed? (y/n): "); - string? completedInput = Console.ReadLine()?.Trim().ToLower(); - - if (completedInput == "y") - { - todoToUpdate.Completed = true; - break; - } - else if (completedInput == "n") - { - todoToUpdate.Completed = false; - break; - } - - Console.WriteLine("Invalid input. Please enter 'y' or 'n'."); - } - - Console.WriteLine($"\nUpdated Todo: \n\nID: {todoToUpdate.Id} \nTodo: {todoToUpdate.Name} \nCompleted: {todoToUpdate.Completed}\n"); - } - else - { - Console.WriteLine("Invalid ID. Please enter a valid integer.\n"); - } - break; - default: - Console.WriteLine("\nUnknown command. Type 'help' to see the list of commands.\n"); - break; - } + todoList.HandleResponse(); } + } } \ No newline at end of file From a0c9e7b5adde9a2cafaca25cfe2df909cc42f95d Mon Sep 17 00:00:00 2001 From: Kye Date: Tue, 28 May 2024 18:09:12 +0100 Subject: [PATCH 10/10] update ShowCommands() method and todoList initialisation --- Todo-Challenge/Todo-Challenge/Menu.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Todo-Challenge/Todo-Challenge/Menu.cs b/Todo-Challenge/Todo-Challenge/Menu.cs index fc570af..080e302 100644 --- a/Todo-Challenge/Todo-Challenge/Menu.cs +++ b/Todo-Challenge/Todo-Challenge/Menu.cs @@ -5,9 +5,9 @@ namespace Todo_Challenge { internal class Menu { - private List todoList = new List(); + private readonly List todoList = new(); - private void ShowCommands() + private static void ShowCommands() { Console.WriteLine("\nThe following commands are available:\n"); Console.WriteLine("0 - Exit.\n1 - View Todo List.\n2 - Create a Todo Item.\n3 - Remove a Todo Item.\n4 - Mark Todo Item as complete.\n");