(function() {
let todos;
let status = 'all';
const inputTodo = document.getElementById('input-todo');
const todoList = document.getElementById('todo-list');
const completedTodos = document.getElementById('completedTodos');
const leftTodos = document.getElementById('leftTodos');
const filterByStatus = function (){
return todos.filter(( { completed } ) => {
switch (status){
case 'active' : return !completed
case 'completed' : return completed;
default : return true;
}
});
};
const countCompletedTodos = function(){
return (todos.filter(( {completed} ) => completed)).length;
};
const countLeftTodos = function(){
return (todos.filter(( {completed} ) => !completed)).length;
};
const render = function() {
let html = '';
const _todos = filterByStatus();
_todos.forEach(({id, content, completed
}) => {
const checked = completed ? ' checked' : '';
html += `<li class="list-group-item">
<div class="hover-anchor">
<a class="hover-action text-muted">
<span class="glyphicon glyphicon-remove-circle pull-right" data-id="${id}"></span>
</a>
<label class="i-checks" for="${id}">
<input type="checkbox" id="${id}"${checked}><i></i>
<span>${content}</span>
</label>
</div>
</li >`;
});
completedTodos.innerHTML = countCompletedTodos();
leftTodos.innerHTML = countLeftTodos();
todoList.innerHTML = html;
};
const getTodos = function() {
todos = [
{ id: 3, content: 'HTML', completed: false },
{ id: 2, content: 'CSS', completed: true },
{ id: 1, content: 'JavaScript', completed: false }];
render();
console.log('[GET]\n', todos);
};
const lastTodoId = function() {
return todos ? Math.max(...todos.map(({id }) => id)) + 1 : 1;
};
const addTodo = function() {
const content = inputTodo.value;
inputTodo.value = '';
if (!todos || todos.length === 0) {
todos = [{ id: 1, content, completed: false }];
} else {
todos = [{id: lastTodoId(), content, completed: false}].concat(todos);
}
render();
console.log('[ADD]\n', todos);
};
const toggleTodoComplete = function(id) {
todos = todos.map(todo => (
todo.id === (+id) ? Object.assign({}, todo, {
completed: !todo.completed
}) : todo
));
render();
console.log('[TOGGLE-COMP]\n', todos);
};
const toggleTodoAllComplete = function (checked) {
todos = todos.map(({ id, content }) => ({ id, content, completed: checked }));
render();
console.log('[TOGGLE-A-COMP]\n', todos);
};
const removeTodo = function(id) {
todos = todos.filter(todo => todo.id !== (+id));
render();
console.log('[REMOVE]\n', todos);
};
const removeCompletedTodo = function(){
todos = todos.filter(( { completed } ) => !completed );
render();
console.log('[RM-COMP]\n', todos);
};
inputTodo.addEventListener('keyup', (e) => {
if (e.keyCode !== 13 || inputTodo.value.trim() === '') {
return;
}
addTodo();
});
window.addEventListener('load', () => {
getTodos();
});
todoList.addEventListener('change', (e) => {
toggleTodoComplete(e.target.id);
});
todoList.addEventListener('click', ({ target }) => {
if (!target || target.nodeName !== 'SPAN' || target.parentNode.nodeName === 'LABEL') {
return;
}
removeTodo(target.dataset.id);
});
document.querySelector('.nav').addEventListener('click', (e) => {
if(!e.target || e.target.nodeName !== 'A') return;
const lis = e.currentTarget.children;
[...lis].forEach((el)=>{el.classList.remove('active')
});
const targetLi = e.target.parentNode;
targetLi.classList.add('active');
status = targetLi.id;
render();
});
document.getElementById('chk-allComplete').addEventListener('change', (e) => {
toggleTodoAllComplete(e.target.checked);
});
document.getElementById('btn-removeCompletedTodos').addEventListener('click', removeCompletedTodo);
}());