Js Todo list help plz
у меня проблема с списком дел.
при нажатии на редактировать че-то не то происходит.
и при нажатии на сохранить.
я только учусь подскажите пожалуйста что я упускаю.?
https://codepen.io/ernauzer-the-styleful/pen/dyowKJB
```
Ответы (1 шт):
Автор решения: Alex Krass
→ Ссылка
Вы забыли передать в функцию сам элемент, который собираетесь редактировать и берете всегда первый из списка. Поэтому и редактируется всегда только первый. Ну и еще трижды это пытаетесь сделать из-за цикла.
case 'edit':
value = taskList.find(task => task.id === currentId).value;
editTask(element.closest('.note-list__item'));
break;
И в самой функции не забудьте:
function editTask(editTaskObject) {
const taskItem = editTaskObject //document.querySelector('.note-list__item');
... весь остальной код ...
const input = document.querySelector('input');
const form = document.querySelector('form');
const noteList = document.querySelector('ul');
let value = '';
function renderTask(taskObject) {
// Создание елементов \\
const taskItem = document.createElement('li');
const taskItemContent = document.createElement('span');
const taskItemBtnComplete = document.createElement('button');
const taskItemBtnRemove = document.createElement('button');
const taskItemBtnEdit = document.createElement('button');
// Добавили класс \\
taskItem.classList.add('note-list__item');
taskItemContent.classList.add('notes');
taskItemBtnComplete.classList.add('complete');
taskItemBtnRemove.classList.add('remove');
taskItemBtnEdit.classList.add('edit');
// Добавили текст \\
taskItemContent.innerText = taskObject.value;
// Добавили к родителю \\
taskItem.prepend(taskItemContent);
taskItem.append(taskItemBtnComplete);
taskItem.append(taskItemBtnRemove);
taskItem.append(taskItemBtnEdit);
// Добавили атрибут taskItem(li) \\
taskItem.setAttribute('data-id',taskObject.id);
// Проверка \\
if (taskObject.completed) {
taskItem.classList.add('note-list__item--completed');
}
return taskItem;
}
function editTask(editTaskObject) {
const taskItem = editTaskObject;
const taskItemEditSave = document.createElement('button');
const taskItemEditCancel = document.createElement('button');
taskItem.innerHTML = '<input type = text class = text_edit>';
const textEdit = document.querySelector('.text_edit');
taskItem.classList.add('note-list__item');
taskItemEditSave.classList.add('save');
taskItemEditCancel.classList.add('cancel');
// Добавили к родителю \\
taskItem.append(taskItemEditSave);
taskItem.append(taskItemEditCancel);
//\\
textEdit.value = value;
// Ф-кция удаления потомков при нажатии на Edit \\
function delChild (child) {
for (let i = 0; i < child.length; i++) {
switch (child[i].className) {
case 'complete':
case 'remove':
case 'edit':
case 'notes':
child[i].style.display = 'none';
break;
}
}
}
delChild(taskItem.children);
return taskItem;
}
// Массив обьектов списка дел \\
let taskList = [];
// Событие клик на форму \\
form.addEventListener('submit', e => {
e.preventDefault();
if (input.value.trim()) {
const task = {
value: input.value,
completed: false,
id: String(new Date).slice(16,24).replace(/:/g,''),
};
// Добавили обьект(ы) в массив \\
taskList.unshift(task);
// Добавили ul вызов функции с агрументом обьекта \\
noteList.prepend(renderTask(task));
input.value = '';
}
});
// Событие клик на кнопки \\
noteList.addEventListener('click', e => {
const element = e.target;
const targetClassName = e.target.className;
let currentId;
let inpEdit = noteList.querySelector('.text_edit');
switch (targetClassName) {
case 'remove':
case 'complete':
case 'edit':
case 'save':
currentId = element.closest('.note-list__item').getAttribute('data-id');
break;
}
switch (targetClassName) {
case 'remove':
noteList.innerHTML = '';
//Перезаписали масив = останутся те что не совпадают currentId \\
taskList = taskList.filter(task => task.id !== currentId);
// Добавили вызов ф-кции с обьектом заметки \\
taskList.forEach(task => {
noteList.append(renderTask(task));
});
break;
case 'complete':
// Если id совпадает то completed = true (выполнено) \\
taskList.find(task => task.id === currentId).completed = true;
noteList.innerHTML = '';
// Добавили вызов ф-кции с обьектом заметки \\
taskList.forEach(task => {
noteList.append(renderTask(task));
});
break;
case 'edit':
value = taskList.find(task => task.id === currentId).value;
editTask(element.closest('.note-list__item'));
break;
case 'save':
taskList.forEach(task => {
noteList.innerHTML = '';
if (task.id === currentId) {
task.value = inpEdit.value;
}
noteList.append(renderTask(task));
})
case 'cancel':
noteList.innerHTML = '';
taskList.forEach(task => {
noteList.append(renderTask(task));
});
}
});
body {
display: flex;
flex-direction: column;
align-items: center;
padding-top: 48px;
height:100vh;
margin: 0;
font-family: sans-serif;
background: linear-gradient(332deg, rgba(2,0,36,1) 0%, rgba(10,130,28,1) 43%, rgba(0,212,255,1) 100%);
}
input, button {
font-size: 24px;
border-radius: 10px;
padding: 5px;
border: none;
outline: none;
}
.note-list__item span {
margin: 0 10px;
}
.note-list {
padding-left: 0;
margin-top: 48px;
font-size: 20px;
list-style: none;
}
.note-list__item.note-list__item--completed {
color: grey;
text-decoration: line-through;
}
.notes {
flex: 1;
}
.note-list__item {
font-size: 28px;
display: flex;
align-items: center;
border: 1px solid rgb(71, 46, 46);
background: rgb(118, 235, 107);
padding: 15px;
margin: 5px 0;
border-radius: 20px;
}
.input_text {
padding-right: 10px;
padding-left: 10px;
}
.complete {
background: url(https://image.flaticon.com/icons/svg/2/2020.svg) no-repeat center;
padding: 0;
width: 30px;
height: 30px;
}
.remove {
background: url(https://image.flaticon.com/icons/svg/446/446046.svg) no-repeat center;
padding: 0;
width: 38px;
height: 30px;
}
.edit {
background: url(https://image.flaticon.com/icons/svg/149/149307.svg) no-repeat center;
padding: 0;
width: 38px;
height: 30px;
}
.text_edit {
max-width: 180px;
}
.save {
background: url(https://image.flaticon.com/icons/svg/446/446044.svg) no-repeat center;
width: 38px;
height: 30px;
padding: 0;
margin: 0 0 0 5px;
}
.cancel {
background: url(https://image.flaticon.com/icons/svg/748/748122.svg) no-repeat center;
width: 38px;
height: 30px;
padding: 0;
margin: 0 0 0 5px;
}
<h1 class="title">My Notes</h1>
<form>
<input class="input_text" type="text" value="Task" placeholder="Enter your note">
<button type="submit">Add note</button>
</form>
<ul class="note-list"></ul>