-
Notifications
You must be signed in to change notification settings - Fork 191
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
To do feature added #258
base: master
Are you sure you want to change the base?
To do feature added #258
Changes from 4 commits
8c73322
2ebf4c2
abe2b8f
9e65147
5db66af
527a05b
52eeb8c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<meta charset="UTF-8"> | ||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||
<!-- <title>Todo App JavaScript--> | ||
<link rel="stylesheet" href="./css/todo-style.css"> | ||
harikesh409 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css"/> | ||
</head> | ||
<body> | ||
<div class="wrapper"> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use bootstrap container instead of writing whole new styles for the wrapper. |
||
<header>Todo App</header> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add the navbar that is present on the home page. |
||
<div class="inputField"> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use bootstrap form styles. |
||
<input type="text" placeholder="Add your new todo"> | ||
<button><i class="fas fa-plus"></i></button> | ||
</div> | ||
<ul class="todoList"> | ||
<!-- data are comes from local storage --> | ||
</ul> | ||
<div class="footer"> | ||
<span>You have <span class="pendingTasks"></span> pending tasks</span> | ||
<button>Clear All</button> | ||
</div> | ||
</div> | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Keep the footer that is present on the home page. |
||
<script src="./js/todo.js"></script> | ||
|
||
</body> | ||
</html> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,131 @@ | ||
@import url("https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,300;0,400;0,500;0,700;0,900;1,900&display=swap"); | ||
/*To do list style */ | ||
*{ | ||
margin: 0; | ||
padding: 0; | ||
box-sizing: border-box; | ||
font-family: 'Poppins', sans-serif; | ||
} | ||
::selection{ | ||
color: #ffff; | ||
background: rgb(142, 73, 232); | ||
} | ||
body{ | ||
width: 100%; | ||
height: 100vh; | ||
/* overflow: hidden; */ | ||
padding: 10px; | ||
background: linear-gradient(to bottom, #68EACC 0%, #497BE8 100%); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Pick colours from the existing scheme, this gradient looks far off. |
||
} | ||
.wrapper{ | ||
background: #fff; | ||
max-width: 400px; | ||
width: 100%; | ||
margin: 120px auto; | ||
padding: 25px; | ||
border-radius: 5px; | ||
box-shadow: 0px 10px 15px rgba(0,0,0,0.1); | ||
} | ||
.wrapper header{ | ||
font-size: 30px; | ||
font-weight: 600; | ||
} | ||
.wrapper .inputField{ | ||
margin: 20px 0; | ||
width: 100%; | ||
display: flex; | ||
height: 45px; | ||
} | ||
.inputField input{ | ||
width: 85%; | ||
height: 100%; | ||
outline: none; | ||
border-radius: 3px; | ||
border: 1px solid #ccc; | ||
font-size: 17px; | ||
padding-left: 15px; | ||
transition: all 0.3s ease; | ||
} | ||
.inputField input:focus{ | ||
border-color: #8E49E8; | ||
} | ||
.inputField button{ | ||
width: 50px; | ||
height: 100%; | ||
border: none; | ||
color: #fff; | ||
margin-left: 5px; | ||
font-size: 21px; | ||
outline: none; | ||
background: #8E49E8; | ||
cursor: pointer; | ||
border-radius: 3px; | ||
opacity: 0.6; | ||
pointer-events: none; | ||
transition: all 0.3s ease; | ||
} | ||
.inputField button:hover, | ||
.footer button:hover{ | ||
background: #721ce3; | ||
} | ||
.inputField button.active{ | ||
opacity: 1; | ||
pointer-events: auto; | ||
} | ||
.wrapper .todoList{ | ||
max-height: 250px; | ||
overflow-y: auto; | ||
} | ||
.todoList li{ | ||
position: relative; | ||
list-style: none; | ||
height: 45px; | ||
line-height: 45px; | ||
margin-bottom: 8px; | ||
background: #f2f2f2; | ||
border-radius: 3px; | ||
padding: 0 15px; | ||
cursor: default; | ||
overflow: hidden; | ||
} | ||
.todoList li .icon{ | ||
position: absolute; | ||
right: -45px; | ||
background: #e74c3c; | ||
width: 45px; | ||
text-align: center; | ||
color: #fff; | ||
border-radius: 0 3px 3px 0; | ||
cursor: pointer; | ||
transition: all 0.2s ease; | ||
} | ||
.todoList li:hover .icon{ | ||
right: 0px; | ||
} | ||
.wrapper .footer{ | ||
display: flex; | ||
width: 100%; | ||
margin-top: 20px; | ||
align-items: center; | ||
justify-content: space-between; | ||
} | ||
.footer button{ | ||
padding: 6px 10px; | ||
border-radius: 3px; | ||
border: none; | ||
outline: none; | ||
color: #fff; | ||
font-weight: 400; | ||
font-size: 16px; | ||
margin-left: 5px; | ||
background: #8E49E8; | ||
cursor: pointer; | ||
user-select: none; | ||
opacity: 0.6; | ||
pointer-events: none; | ||
transition: all 0.3s ease; | ||
} | ||
.footer button.active{ | ||
opacity: 1; | ||
pointer-events: auto; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
//to-do | ||
|
||
// getting all required elements | ||
const inputBox = document.querySelector(".inputField input"); | ||
const addBtn = document.querySelector(".inputField button"); | ||
const todoList = document.querySelector(".todoList"); | ||
const deleteAllBtn = document.querySelector(".footer button"); | ||
|
||
// onkeyup event | ||
inputBox.onkeyup = () => { | ||
let userEnteredValue = inputBox.value; //getting user entered value | ||
if (userEnteredValue.trim() != 0) { | ||
//if the user value isn't only spaces | ||
addBtn.classList.add("active"); //active the add button | ||
} else { | ||
addBtn.classList.remove("active"); //unactive the add button | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Try adding the disabled bootstrap class so the cursor also gets changed. |
||
} | ||
}; | ||
|
||
showTasks(); //calling showTask function | ||
|
||
addBtn.onclick = () => { | ||
//when user click on plus icon button | ||
let userEnteredValue = inputBox.value; //getting input field value | ||
let getLocalStorageData = localStorage.getItem("New Todo"); //getting localstorage | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Make the key more unique something like |
||
if (getLocalStorageData == null) { | ||
//if localstorage has no data | ||
listArray = []; //create a blank array | ||
} else { | ||
listArray = JSON.parse(getLocalStorageData); //transforming json string into a js object | ||
} | ||
listArray.push(userEnteredValue); //pushing or adding new value in array | ||
localStorage.setItem("New Todo", JSON.stringify(listArray)); //transforming js object into a json string | ||
showTasks(); //calling showTask function | ||
addBtn.classList.remove("active"); //unactive the add button once the task added | ||
}; | ||
|
||
function showTasks() { | ||
let getLocalStorageData = localStorage.getItem("New Todo"); | ||
if (getLocalStorageData == null) { | ||
listArray = []; | ||
} else { | ||
listArray = JSON.parse(getLocalStorageData); | ||
} | ||
const pendingTasksNumb = document.querySelector(".pendingTasks"); | ||
pendingTasksNumb.textContent = listArray.length; //passing the array length in pendingtask | ||
if (listArray.length > 0) { | ||
//if array length is greater than 0 | ||
deleteAllBtn.classList.add("active"); //active the delete button | ||
} else { | ||
deleteAllBtn.classList.remove("active"); //unactive the delete button | ||
} | ||
let newLiTag = ""; | ||
listArray.forEach((element, index) => { | ||
newLiTag += `<li>${element}<span class="icon" onclick="deleteTask(${index})"><i class="fas fa-trash"></i></span></li>`; | ||
}); | ||
todoList.innerHTML = newLiTag; //adding new li tag inside ul tag | ||
inputBox.value = ""; //once task added leave the input field blank | ||
} | ||
|
||
// delete task function | ||
function deleteTask(index) { | ||
let getLocalStorageData = localStorage.getItem("New Todo"); | ||
listArray = JSON.parse(getLocalStorageData); | ||
listArray.splice(index, 1); //delete or remove the li | ||
localStorage.setItem("New Todo", JSON.stringify(listArray)); | ||
showTasks(); //call the showTasks function | ||
} | ||
|
||
// delete all tasks function | ||
deleteAllBtn.onclick = () => { | ||
listArray = []; //empty the array | ||
localStorage.setItem("New Todo", JSON.stringify(listArray)); //set the item in localstorage | ||
showTasks(); //call the showTasks function | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Keep the header as TODO List