|
<template> |
|
<div id="app"> |
|
<div class="container"> |
|
<h1>My Todos</h1> |
|
<form @submit.prevent> |
|
<input type="text" placeholder="Create a new to-do..." autofocus v-model.trim="newtodo"/> |
|
<button @click="addtodo()" class="add">Add</button> |
|
</form> |
|
<ul class="todo"> |
|
<li v-for="(todo,i) in todos"> |
|
<span v-if="!todo.edit" class="todo-name" @click="todo.finish = 1 - todo.finish":class="{'finish':todo.finish}"> {{todo.name}}</span> |
|
<input v-else autofocus class="edit-input" type="text" v-model="todos[i].name"/> |
|
<div class="icons"> |
|
<button class="edit" @click="todo.edit=!todo.edit"><i class="fa fa-edit"></i></button> |
|
<button class="delete" @click="deletetoto(todo)"><i class="fas fa-trash"></i></button> |
|
</div> |
|
</li> |
|
</ul> |
|
<div class="footer"> |
|
<span>All Todos : {{ todos.length == 0 ? "No Todos" : todos.length }}</span> |
|
<button v-show="todos.length > 1" class="delete-all" @click="deleteAll">Delete All</button> |
|
</div> |
|
<h4 class='made'>Made With <i class="fa fa-heart"></i> By Alaa Sufi © 2020</i></h4> |
|
</div> |
|
</div> |
|
</template> |
|
<script> |
|
export default { |
|
data() { |
|
return { |
|
todos: [], |
|
newtodo: "" |
|
}; |
|
}, |
|
methods: { |
|
addtodo() { |
|
var newtodosave=this.newtodo; |
|
this.todos.length<1 |
|
? this.todos.push({ name: this.newtodo,edit:0,finish:0 }) |
|
: this.todos.some(function(x){return x.name==newtodosave}) || this.newtodo.length == 0 |
|
? this.todos |
|
: this.todos.push({ name: this.newtodo,edit:0,finish:0 }); |
|
this.newtodo = ""; |
|
}, |
|
deletetoto(todo) { |
|
this.todos.splice(this.todos.indexOf(todo), 1); |
|
}, |
|
deleteAll() { |
|
this.todos.splice(0); |
|
} |
|
}, |
|
mounted() { |
|
if (localStorage.todosSave) { |
|
this.todos = JSON.parse(localStorage.todosSave); |
|
} |
|
}, |
|
watch: { |
|
todos(newName) { |
|
localStorage.todosSave = JSON.stringify(newName); |
|
} |
|
} |
|
}; |
|
</script> |
|
<style lang="scss"> |
|
* { |
|
box-sizing: border-box; |
|
} |
|
#app { |
|
font-family: Lato, sans-serif; |
|
color: #2c3e50; |
|
} |
|
.container { |
|
width: 800px; |
|
margin: auto; |
|
margin-top: 1rem; |
|
@media (max-width: 800px) { |
|
& { |
|
width:100%; |
|
} |
|
} |
|
|
|
} |
|
h1 { |
|
margin-top: 2rem; |
|
margin-bottom: 2rem; |
|
} |
|
form { |
|
display: flex; |
|
|
|
input { |
|
padding: 10px; |
|
border: 1px solid #bbb; |
|
border-radius: 5px 0px 0px 5px; |
|
font-size: 20px; |
|
width: 90%; |
|
} |
|
.add { |
|
background-color: #0cca8c; |
|
padding: 5px 10px; |
|
color: white; |
|
outline: none; |
|
border: none; |
|
width: 10%; |
|
border-radius: 0px 5px 5px 0px; |
|
cursor: pointer; |
|
} |
|
} |
|
|
|
ul.todo { |
|
border: 1px solid #bbb; |
|
border-radius: 5px; |
|
padding: 0; |
|
list-style: none; |
|
margin-bottom: 0; |
|
li { |
|
display: flex; |
|
justify-content: space-between; |
|
padding: 1rem 2rem; |
|
user-select: none; |
|
cursor: pointer; |
|
.todo-name { |
|
&.finish { |
|
text-decoration: line-through; |
|
} |
|
} |
|
&:not(:last-child) { |
|
border-bottom: 1px solid #bbb; |
|
} |
|
& > span { |
|
font-size: 20px; |
|
padding: 0; |
|
line-height: 1.5; |
|
} |
|
} |
|
} |
|
.edit-input { |
|
font-size: 20px; |
|
padding: 0; |
|
color: #2c3e50; |
|
} |
|
.icons { |
|
.edit, |
|
.delete { |
|
all: unset; |
|
cursor: pointer; |
|
width: 35px; |
|
text-align: center; |
|
height: 35px; |
|
border-radius: 5px; |
|
} |
|
.edit { |
|
color: #007bff; |
|
background-color: #fff; |
|
&:hover { |
|
background-color: #007bff; |
|
color: #fff; |
|
} |
|
} |
|
.delete { |
|
color: #dc3545; |
|
background-color: #fff; |
|
&:hover { |
|
background-color: #dc3545; |
|
color: #fff; |
|
} |
|
} |
|
} |
|
.footer { |
|
display: flex; |
|
justify-content: space-between; |
|
span { |
|
padding: 15px; |
|
border: 1px solid #bbb; |
|
border-radius: 5px; |
|
} |
|
.delete-all { |
|
background-color: #dc3545; |
|
padding: 15px; |
|
color: white; |
|
outline: none; |
|
border: none; |
|
border-radius: 5px; |
|
display: block; |
|
cursor: pointer; |
|
} |
|
} |
|
.made{ |
|
text-align: center; |
|
i{ |
|
color:#dc3545; |
|
|
|
} |
|
} |
|
</style> |
todo