Skip to content

Commit 28d2033

Browse files
committed
feat: add localStorage
1 parent 2e1a6c8 commit 28d2033

2 files changed

Lines changed: 48 additions & 23 deletions

File tree

src/scripts/Modules/TodoApp.js

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,41 @@ import TodoItem from './TodoItem';
44
class TodoApp {
55
constructor() {
66
this.projects = [];
7-
// Add a default project and default todo for testing
8-
this.addProject("Default");
9-
let todo = new TodoItem();
10-
todo.title = "default Todo";
11-
todo.description = "default desc";
12-
todo.dueDate = new Date().toJSON().slice(0,10);
13-
todo.priority = "low";
14-
todo.completed = true;
15-
this.addTodoToProject("Default",todo);
7+
this.loadFromLocalStorage();
8+
if (this.projects.length === 0) {
9+
this.addProject("Default");
10+
}
11+
}
12+
13+
saveToLocalStorage() {
14+
localStorage.setItem('todoApp', JSON.stringify(this.projects));
15+
}
16+
17+
loadFromLocalStorage() {
18+
const data = localStorage.getItem('todoApp');
19+
if (data) {
20+
const parsedData = JSON.parse(data);
21+
this.projects = parsedData.map(projectData => {
22+
const project = new Project(projectData.name);
23+
project.todos = projectData.todos.map(todoData => {
24+
const todo = new TodoItem(todoData.title, todoData.description, todoData.dueDate, todoData.priority);
25+
todo.completed = todoData.completed;
26+
return todo;
27+
});
28+
return project;
29+
});
30+
}
1631
}
1732

1833
addProject(name) {
1934
const project = new Project(name);
2035
this.projects.push(project);
36+
this.saveToLocalStorage();
2137
}
2238

2339
removeProject(name) {
2440
this.projects = this.projects.filter(project => project.name !== name);
41+
this.saveToLocalStorage();
2542
}
2643

2744
getProject(name) {
@@ -36,6 +53,7 @@ class TodoApp {
3653
const project = this.getProject(projectName);
3754
if (project) {
3855
project.addTodo(todo);
56+
this.saveToLocalStorage();
3957
} else {
4058
console.log(`Project ${projectName} does not exist.`);
4159
}
@@ -45,6 +63,7 @@ class TodoApp {
4563
const project = this.getProject(projectName);
4664
if (project) {
4765
project.removeTodo(todoIndex);
66+
this.saveToLocalStorage();
4867
} else {
4968
console.log(`Project ${projectName} does not exist.`);
5069
}
@@ -60,16 +79,20 @@ class TodoApp {
6079
return todos;
6180
} else {
6281
console.log(`Project ${projectName} does not exist.`);
82+
return[];
6383
}
6484
}
6585

66-
updateTodoCompletion(todotitle, projectName){
86+
updateTodoCompletion(todotitle, projectName) {
6787
const project = this.getProject(projectName);
68-
project.getTodos().forEach((item)=>{
69-
if(item.title===todotitle){
70-
item.toggleComplete();
71-
}
72-
});
88+
if (project) {
89+
project.getTodos().forEach((item) => {
90+
if (item.title === todotitle) {
91+
item.toggleComplete();
92+
}
93+
});
94+
this.saveToLocalStorage();
95+
}
7396
}
7497
}
7598

src/scripts/Modules/UI.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@ import TodoItem from './TodoItem';
44
export default class UI {
55
constructor() {
66
this.app = new TodoApp(); // Store the TodoApp instance in the UI class
7-
this.selectedProject = 'Default';
7+
this.selectedProject = this.app.listProjects()[0] || 'Default';
88
this.newProjectPopup = document.querySelector(".add-project-popup");
99
this.newProjectPopupAddBtn = document.querySelector(".button-add-project-popup");
1010
this.newProjectNameInput = document.querySelector(".input-add-project-popup");
1111
this.newProjectPopupCancelBtn = document.querySelector(".button-cancel-project-popup");
12-
1312
//adding global event listeners
1413
this.newProjectPopupAddBtn.addEventListener('click', (event) => this.handleAddNewProject(event));
1514
this.newProjectPopupCancelBtn.addEventListener('click', ()=> this.newProjectPopup.classList.remove("active"));
1615
}
1716

1817
loadHomepage() {
1918
this.loadProjects();
19+
this.OpenProject(this.selectedProject);
2020
}
2121

2222
loadProjects() {
@@ -72,16 +72,15 @@ export default class UI {
7272

7373
handleAddNewProject(event) {
7474
const newProjectName = this.newProjectNameInput.value;
75-
const exisitingProjects = this.app.listProjects();
76-
const selectedprojectItem = document.querySelector('.selected-project');
77-
if(newProjectName && !exisitingProjects.includes(newProjectName)){
75+
const existingProjects = this.app.listProjects();
76+
if(newProjectName && !existingProjects.includes(newProjectName)){
7877
this.app.addProject(newProjectName);
7978
this.selectedProject = newProjectName; // Set the new project as selected and opens it
8079
this.loadProjects();
8180
this.OpenProject(newProjectName);
8281
}
8382
else{
84-
alert("Project Name cannot be duplicate or null!")
83+
alert("Project Name cannot be duplicate or null!");
8584
}
8685
this.newProjectPopup.classList.remove("active");
8786
}
@@ -119,8 +118,11 @@ export default class UI {
119118

120119
// Add event listener for checkbox
121120
const checkbox = todoElement.querySelector('.todo-checkbox');
122-
// checkbox.addEventListener('change', (event) => this.handleTodoCompletion(event, todoItem.title, projectName));
123-
checkbox.addEventListener('change', (event) => this.app.updateTodoCompletion(todoItem.title, projectName));
121+
checkbox.addEventListener('change', () => {
122+
this.app.updateTodoCompletion(todoItem.title, projectName);
123+
this.OpenProject(projectName); // Refresh the project view
124+
});
125+
124126
});
125127
}
126128

0 commit comments

Comments
 (0)