// Constant variables
const FORM = document.querySelector('#addForm');
const TASKLIST = document.querySelector('.list-group');
const FILTER = document.querySelector('#filter');
// Event listeners
FORM.addEventListener('submit', add_task, false);
TASKLIST.addEventListener('click', remove_task, false);
FILTER.addEventListener('keyup', filter_tasks, false);
function get_existing_tasks(){
let tasks;
// Check if tasks are already stored
if(localStorage.getItem('tasks') === null){
tasks = [];
}
else{
// Set tasks with what's already there
tasks = JSON.parse(localStorage.getItem('tasks'));
}
return tasks;
}
// domcontentloaded event not firing, hence an IIFE function
document.addEventListener('DOMContentLoaded', function () {
// Fires each time page is refreshed
tasks = get_existing_tasks();
// Loop to create the DOM elements to display
tasks.forEach(function(task) {
// Get input value
let newTask = document.createTextNode(task);
// Create new li element
let liElement = document.createElement('li');
// Create delete button element
let deleteBTN = document.createElement('button');
// Add classes
liElement.className = 'list-group-item';
deleteBTN.className = 'btn btn-danger btn-lg float-right delete';
deleteBTN.innerHTML = '';
// Add to DOM Tree from outside in
TASKLIST.append(liElement);
liElement.append(newTask);
liElement.append(deleteBTN);
})
}());
function add_task(event){
event.preventDefault();
// Get input value
let newTask = document.querySelector('#task').value;
// Create new li element
let liElement = document.createElement('li');
// Create delete button element
let deleteBTN = document.createElement('button');
// Add classes
liElement.className = 'list-group-item';
deleteBTN.className = 'btn btn-danger btn-lg float-right delete';
deleteBTN.innerHTML = '';
// Add to DOM Tree from outside in
TASKLIST.append(liElement);
liElement.append(newTask);
liElement.append(deleteBTN);
// Call function add task to local storage
store_in_local_storage(newTask);
// Clear input filed(s) on form submit
FORM.reset();
}
function store_in_local_storage(task){
tasks = get_existing_tasks();
// Add task to tasks array
tasks.push(task);
/* You can only store string values in localStorage.
You'll need to serialize the array object and
then store it in localStorage.
*/
localStorage.setItem('tasks', JSON.stringify(tasks))
}
function remove_task(event) {
if(event.target.classList.contains('delete')){
if(confirm("Are you sure?")){
let delLiTask = event.target.parentElement;
TASKLIST.removeChild(delLiTask);
// Remove from Local Storage
remove_task_from_local_storage(delLiTask);
}
}
}
function remove_task_from_local_storage(delLiTask){
tasks = get_existing_tasks();
// Go through each task in localStorage
tasks.forEach(function(task, index){
// Determine if selected task matches one in the array
if(delLiTask.textContent === task){
// Remove selected task from the tasks array
tasks.splice(index, 1);
}
});
// Add the remaining tasks to localStorage
localStorage.setItem('tasks', JSON.stringify(tasks));
}
function filter_tasks(event) {
// Grab and convert to lowercase the users search term
let text = event.target.value.toLowerCase();
// Select all the li tasks
let tasks = TASKLIST.querySelectorAll('li');
// Create an array of the tasks and traverse them
let tasksArray = Array.from(tasks);
for (let i = 0; i < tasksArray.length; i++) {
let taskName = tasksArray[i].firstChild.textContent;
// Check if it's a match
if(taskName.toLowerCase().indexOf(text) != -1){
// Display task
tasksArray[i].style.display = 'block';
}
else{
// Don't display task
tasksArray[i].style.display = 'none';
}
}
}