diff --git a/README.md b/README.md index e7670232..461263d2 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,4 @@ -# To-Do-List Using JavaScript -In this tutorial, a JavaScript beginner can be able to create a beautiful and functional to do list using JavaScript. -I will talk about the logic behind every line of code, before opening my text editor and start typing the code. -it's a step by step tutorial, you won't get lost at any stage of this tutorial. +### 2019.12 +Based on the preview job, I have added two functions. The first one when double click the item you can edit the content of to-do-list and the changes will auto save when the content lose the focus. The second one is that you can see the lists sorted by their completion. -to follow the tutorial step by step, when we get to the second part (when we type the code), you'll need to download the starter template from here. - -The tutorial video link : https://youtu.be/b8sUhU_eq3g - -When you open the folder, you'll find all the files needed to get started, the CSS code, is already typed (see style.css file), as we're not going to talk about CSS in our tutorial. we're going just to talk about HTML and JavaScript. - -the to-do list we're going to create has a beautiful UI, the user can add a to-do by filling the input and hit ENTER, after that he can rather check the to-do when it's done, or remove it using the delete button. - -The user's to-do list is stored in the local storage, so when he refreshes the page, he can always find the list there. - -There is the possibility for the user, to clear the list, by clicking the button clear, at the top right corner of our app. - -The to do list app, shows the today's date to the user, for that we're using a method called toLocaleDateString, which you can read about here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString - -///// Here you can find some other tutorial, that you might like to see ///// - -Ping Pong Game Using JavaScript -https://youtu.be/nl0KXCa5pJk - -Create a Multiple Choice Quiz Using JavaScript -https://youtu.be/49pYIMygIcU - -Tetris Game Using JavaScript -https://youtu.be/HEsAr2Yt2do - -Snake Game Using JavaScript -https://youtu.be/9TcU2C1AACw - -Flappy Bird Game Using JavaScript -https://youtu.be/L07i4g-zhDA +You can see the result in https://kkkinlibrary.github.io/To-Do-List/ diff --git a/_config.yml b/_config.yml new file mode 100644 index 00000000..ddeb671b --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-time-machine \ No newline at end of file diff --git a/css/style.css b/css/style.css index ba131516..c482e376 100644 --- a/css/style.css +++ b/css/style.css @@ -1,130 +1,197 @@ -/* ------------ youtube.com/CodeExplained ------------ */ body{ padding: 0; margin: 0; - background-color: rgba(0,0,0,0.1); + background-color:rgba(0,0,0, 0.1); font-family: 'Titillium Web', sans-serif; } - -/* ------------ container ------------ */ +/* -----container----- */ .container{ - padding:10px; - width:380px; - margin:0 auto; + padding: 10px; + width: 380px; + margin: 0 auto; } - -/* ------------ header ------------ */ +/* -----header----- */ .header{ width: 380px; - height:200px; - background-image: url('../img/bg2.jpg'); + height: 200px; + background-image: url('../img/bg1.jpg'); background-size: 100% 200%; background-repeat: no-repeat; border-radius: 15px 15px 0 0; position: relative; } + .clear{ - width : 30px; + width: 30px; height: 30px; position: absolute; - right:20px; top: 20px; + right: 20px; } + .clear i{ font-size: 30px; - color: #FFF; + color: #fff; } + .clear i:hover{ cursor: pointer; text-shadow: 1px 3px 5px #000; transform: rotate(45deg); } + #date{ position: absolute; bottom: 10px; left: 10px; color: #FFF; font-size: 25px; - font-family: 'Titillium Web', sans-serif; + font-family: 'Titillium Web' sans-serif; +} + +.display{ + position: absolute; + height: 45px; + width: 380px; + top: 160px; +} + +.display i.All{ + position: absolute; + right: 60px; + font-size: 25px; + color: #fff; + bottom: 13px; +} +.display i.All:hover{ + cursor: pointer; } -/* ------------ content ------------ */ +.display i.fulfill{ + position: absolute; + right: 35px; + font-size: 25px; + color: #fff; + bottom: 13px; +} +.display i.fulfill:hover{ + cursor: pointer; +} + +.display i.unfinished{ + position: absolute; + right: 10px; + font-size: 25px; + color: #fff; + bottom: 13px; +} +.display i.unfinished:hover{ + cursor: pointer; +} +/* -----content----- */ .content{ - width:380px; + width: 380px; height: 350px; - max-height:350px; - background-color: #FFF; + max-height: 350px; + background-color: #FFF; + border-radius: 0 0 0 0; overflow: auto; } -.content::-webkit-scrollbar { - display: none; -} + .content ul{ - padding:0; - margin:0; + padding: 0; + margin: 0; } + +.fa-check-circle{ + color: #6eb200; +} + .item{ - width:380px; + font-size: 15px; + color: #000; + width: 380px; height: 45px; min-height: 45px; - position: relative; - border-bottom: 1px solid rgba(0,0,0,0.1); + border-bottom: 1px solid rgba(0,0,0, 0.1); list-style: none; + position: relative; padding: 0; margin: 0; } + .item i.co{ position: absolute; font-size: 25px; - padding-left:5px; - left:15px; - top:10px; + padding-left: 5px; + left: 15px; + top: 10px; } + .item i.co:hover{ cursor: pointer; } -.fa-check-circle{ - color:#6eb200; -} -.item p.text{ + +.item input.text{ position: absolute; - padding:0; - margin:0; + padding: 0; + margin: 0; font-size: 20px; - left:50px; - top:5px; - background-color: #FFF; - max-width:285px; + left: 50px; + top: 10px; + background-color: #fff; + width: 285px; + overflow: hidden; + border: none; } -.lineThrough{ - text-decoration: line-through; - color : #ccc; + +.item input:disabled{ + color: #000; + font-size: 20px; } + .item i.de{ position: absolute; font-size: 25px; - right:15px; - top:10px; + right: 15px; + top: 10px; } + .item i.de:hover{ - color:#af0000; + color: red; cursor: pointer; } -/* ------------ add item ------------ */ + +.lineThrough{ + text-decoration: line-through; + color: #ccc !important; +} + +::-webkit-scrollbar{ + display: none; +} + +/* ------ add item ------*/ .add-to-do{ position: relative; - width: 360px; - height:40px; - background-color: #FFF; + width: auto; + height: 40px; + background-color: #fff; padding: 10px; - border-top: 1px solid rgba(0,0,0,0.1); + border-top: 1px solid rgba(0,0,0, 0.1); } + .add-to-do i{ position: absolute; font-size: 40px; color: #4162f6; } +.add-to-do i:hover{ + cursor: pointer; + text-shadow: 1px 2px 3px blue; +} + .add-to-do input{ position: absolute; left: 50px; @@ -133,53 +200,11 @@ body{ background-color: transparent; border: none; font-size: 20px; - padding-left:10px; + padding-left: 10px; } -.add-to-do input::-webkit-input-placeholder { /* Chrome/Opera/Safari */ - color: #4162f6; - font-family: 'Titillium Web', sans-serif; - font-size: 20px; -} -.add-to-do input::-moz-placeholder { /* Firefox 19+ */ - color: #4162f6; - font-family: 'Titillium Web', sans-serif; - font-size: 20px; -} -.add-to-do input:-ms-input-placeholder { /* IE 10+ */ - color: #4162f6; - font-family: 'Titillium Web', sans-serif; - font-size: 20px; -} -.add-to-do input:-moz-placeholder { /* Firefox 18- */ + +.add-to-do input::placeholder{ color: #4162f6; font-family: 'Titillium Web', sans-serif; font-size: 20px; } - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/index.html b/index.html index 3bf3ada8..a9291c91 100644 --- a/index.html +++ b/index.html @@ -1 +1,44 @@ - + + + + + + + Too many lists to do + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+ +
+
+ + +
+
+ + + + diff --git a/js/app.js b/js/app.js index 74cbc288..c9e5d991 100644 --- a/js/app.js +++ b/js/app.js @@ -1 +1,203 @@ -// CODE EXPLAINED channel \ No newline at end of file +const dateElement = document.getElementById('date'); +const clear = document.querySelector('.clear'); +const list = document.getElementById('list'); +const input = document.querySelector('input'); +const addButton = document.querySelector('.fa-plus-circle'); +const show_all = document.querySelector('.All'); +const show_finished = document.querySelector('.fulfill'); +const show_unfinished = document.querySelector('.unfinished'); + +const CHECK = "fa-check-circle"; +const UNCHECK = "fa-circle-thin"; +const LINE_THROUGH = "lineThrough"; +const CHANGE = "editable"; + +var status = "all", timer = null, delay = 260, click = 0;//double click + +clear.addEventListener("click", function () { + localStorage.clear(); + location.reload(); +}); +/* show time */ +const options = { weekday: 'long', month: 'short', day: 'numeric' }; +const today = new Date(); +dateElement.innerHTML = today.toLocaleDateString("en-US", options); + +let LIST, id; +let data = localStorage.getItem("TODO"); +//get historical data from localstorage +if (data) { + LIST = JSON.parse(data); + id = LIST.length; + loadList(LIST); +} +else { + LIST = [] + id = 0; +} + +function loadList(array) { + array.forEach(element => { + add_to_do(element.name, element.id, element.done, element.trash); + }); +} + +function add_to_do(toDo, id, done, trash) { + if (trash) + return; + const DONE = done ? CHECK : UNCHECK; + const LINE = done ? LINE_THROUGH : ""; + + const item = `
  • + + + +
  • + `; + const position = "beforeend"; + list.insertAdjacentHTML(position, item);//可以使用appendchild直接插入dom,效率会更高 +} + +function defReload(array, status){ + if(status === "all"){ + array.forEach(element=>{ + add_to_do(element.name, element.id, element.done, element.trash) + }); + } + else if(status === "completed"){ + array.forEach(element => { + if (element.done) { + add_to_do(element.name, element.id, element.done, element.trash); + } + }); + } + else{ + array.forEach(element => { + if (!element.done) { + add_to_do(element.name, element.id, element.done, element.trash); + } + }); + } +} + +show_all.addEventListener("click", function () { + var i, list_length = list.childNodes.length; + status = "all"; + for (i = 0; i < list_length; i++) { + list.removeChild(list.lastChild); + } + defReload(LIST,"all"); +}); + +show_finished.addEventListener("click", function () { + var i, list_length = list.childNodes.length; + status = "completed"; + for (i = 0; i < list_length; i++) { + list.removeChild(list.lastChild); + } + defReload(LIST,"completed"); +}); + +show_unfinished.addEventListener("click", function () { + var i, list_length = list.childNodes.length; + status = "active"; + for (i = 0; i < list_length; i++) { + list.removeChild(list.lastChild); + } + defReload(LIST,"active"); +}); + +input.addEventListener("keypress", function (even) { + if (event.keyCode === 13) { + const toDo = input.value; + if (toDo) { + add_to_do(toDo, id, false, false); + + LIST.push({ name: toDo, id: id, done: false, trash: false }); + + localStorage.setItem("TODO", JSON.stringify(LIST)); + id++; + input.value = ""; + } + } +}); + +addButton.addEventListener('click', function () { + const toDo = input.value; + if (toDo) { + add_to_do(toDo, id, false, false); + + LIST.push({ name: toDo, id: id, done: false, trash: false }); + + localStorage.setItem("TODO", JSON.stringify(LIST)); + id++; + input.value = ""; + } +}); + +list.addEventListener("click", function (event) { + const element = event.target; + const elementJob = element.attributes.job.value; + + if (elementJob === 'complete') { + completeToDo(element); + } else if (elementJob === 'delete') { + removeToDo(element); + } + else if (elementJob === 'edit') { + editTodo(element); + } + + localStorage.setItem("TODO", JSON.stringify(LIST)); + +}, false); + +function completeToDo(element) { + element.classList.toggle(UNCHECK); + element.classList.toggle(CHECK); + element.parentNode.querySelector(".text").classList.toggle(LINE_THROUGH); + + LIST[element.id].done = LIST[element.id].done ? false : true; + if(status === "active" && LIST[element.id].done){ + element.parentNode.parentNode.removeChild(element.parentNode); + } + else if(status === "completed" && !LIST[element.id].done){ + element.parentNode.parentNode.removeChild(element.parentNode); + } + else if(LIST[element.id].done){ + var temp = element.parentNode, realParent = element.parentNode.parentNode; + element.parentNode.parentNode.removeChild(element.parentNode); + realParent.appendChild(temp); + } +} + +function removeToDo(element) { + element.parentNode.parentNode.removeChild(element.parentNode); + LIST[element.id].trash = true; +} + +function editTodo(element) { + var newTodo, content = element.parentNode.querySelector(".text"), preText; + click++; + if (click === 1) { + timer = setTimeout(function () { + click = 0; + }, (delay)); + } else { + click = 0; + clearTimeout(timer); + preText = content.value; + content.disabled = false; + content.focus(); + content.onblur = () => { + newTodo = content.value; + if (preText !== newTodo) { + LIST[element.id].name = newTodo; + localStorage.setItem("TODO", JSON.stringify(LIST)); + } + content.disabled = true; + }; + } + +} +