-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
105 lines (94 loc) · 3.33 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
const todoForm = document.querySelector('form')
const todoInput = document.getElementById('todo-input')
const todoListUL = document.getElementById('todo-list')
const importTodoFiles = document.getElementById('import')
let allTodos = getTodos()
updateTodos()
todoForm.addEventListener('submit', (event) => {
event.preventDefault()
addTodo()
})
importTodoFiles.addEventListener('change', (event) => {
event.preventDefault()
importTodos()
})
function addTodo () {
const todoText = todoInput.value.trim()
if (todoText !== '') {
const todo = {
text: todoText,
completed: false
}
allTodos.push(todo)
todoInput.value = ''
updateTodos()
saveTodos()
}
}
function updateTodos () {
todoListUL.innerHTML = ''
allTodos.forEach((todo, todoIndex) => {
const element = createTodoElement(todo, todoIndex)
todoListUL.append(element)
})
readyToDoExport()
}
function createTodoElement (todo, todoIndex) {
const li = document.createElement('li')
li.className = 'todo'
li.innerHTML = `<input type="checkbox" name="todo${todoIndex}" id="todo${todoIndex}">
<div class="custom-checkbox">
<label for="todo${todoIndex}" class="custom-checkbox"><svg fill="var(--secondary-colour)" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24">
<path d="M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z" />
</svg></label></div>
<label class="todo-text" for="todo${todoIndex}">${todo.text}</label>
<button class="delete-button"><svg xmlns="http://www.w3.org/2000/svg" fill="var(--secondary-text-colour)" height="24" viewBox="0 -960 960 960" width="24">
<path d="M280-120q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM360-280h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z" />
</svg></button>`
const deleteButton = li.querySelector('.delete-button')
deleteButton.addEventListener('click', () => {
deleteTodo(todoIndex)
})
const checkbox = li.querySelector('input')
checkbox.addEventListener('change', () => {
allTodos[todoIndex].completed = checkbox.checked
saveTodos()
})
checkbox.checked = todo.completed
return li
}
function deleteTodo (todoIndex) {
allTodos = allTodos.filter((_, i) => i !== todoIndex)
saveTodos()
updateTodos()
}
function saveTodos () {
const todosJson = JSON.stringify(allTodos)
localStorage.setItem('todos', todosJson)
}
function getTodos () {
const todos = localStorage.getItem('todos') || '[]'
return JSON.parse(todos)
}
function readyToDoExport () {
const todosJson = JSON.stringify(allTodos)
const downloadNode = document.getElementById('export')
const dataStr = 'data:text/json;charset=utf-8,' + encodeURIComponent(todosJson)
downloadNode.setAttribute('href', dataStr)
downloadNode.setAttribute('download', 'todo-list.json')
}
function importTodos () {
const file = importTodoFiles.files[0]
const reader = new FileReader()
reader.onload = function (event) {
const jsonData = JSON.parse(event.target.result)
jsonData.forEach(function (data) {
console.log(data)
allTodos.push(data)
})
updateTodos()
saveTodos()
importTodoFiles.value = null
}
reader.readAsText(file)
}