This commit is contained in:
2026-02-12 13:42:18 +03:00
parent 188b6ccc0e
commit 7769c0d65d

View File

@@ -24,20 +24,21 @@ class Todo {
constructor() { constructor() {
this.rootElement = document.querySelector(this.selectors.root) this.rootElement = document.querySelector(this.selectors.root)
this.newTaskFormElement = this.rootElement.querySelector.querySelector(this.selectors.newTaskForm) this.newTaskFormElement = this.rootElement.querySelector(this.selectors.newTaskForm)
this.newTaskInputElement = this.rootElement.querySelector.querySelector(this.selectors.newTaskInput) this.newTaskInputElement = this.rootElement.querySelector(this.selectors.newTaskInput)
this.searchTaskFormElement = this.rootElement.querySelector.querySelector(this.selectors.searchTaskForm) this.searchTaskFormElement = this.rootElement.querySelector(this.selectors.searchTaskForm)
this.searchTaskInputElement = this.rootElement.querySelector.querySelector(this.selectors.searchTaskInput) this.searchTaskInputElement = this.rootElement.querySelector(this.selectors.searchTaskInput)
this.totalTasksElement = this.rootElement.querySelector.querySelector(this.selectors.totalTasks) this.totalTasksElement = this.rootElement.querySelector(this.selectors.totalTasks)
this.deleteAllButtonElement = this.rootElement.querySelector.querySelector(this.selectors.deleteAllButton) this.deleteAllButtonElement = this.rootElement.querySelector(this.selectors.deleteAllButton)
this.listElement = this.rootElement.querySelector.querySelector(this.selectors.list) this.listElement = this.rootElement.querySelector(this.selectors.list)
this.emptyMessageElement = this.rootElement.querySelector.querySelector(this.selectors.emptyMessage) this.emptyMessageElement = this.rootElement.querySelector(this.selectors.emptyMessage)
this.state = { this.state = {
items: this.getItemsFromLocalStorage(), items: this.getItemsFromLocalStorage(),
filteredItems: null, filteredItems: null,
searchQuery: "", searchQuery: "",
} }
this.render() this.render()
this.bindEvents()
} }
getItemsFromLocalStorage() { getItemsFromLocalStorage() {
@@ -70,7 +71,7 @@ class Todo {
this.deleteAllButtonElement.classList.toggle( this.deleteAllButtonElement.classList.toggle(
this.stateClasses.isVisible, this.stateClasses.isVisible,
rhis.state.items.length > 0 this.state.items.length > 0
) )
const items = this.state.filteredItems ?? this.state.items const items = this.state.filteredItems ?? this.state.items
@@ -90,7 +91,7 @@ class Todo {
`).join('') `).join('')
const isEmptyFilteredItems = this.state.filteredItems?.length === 0 const isEmptyFilteredItems = this.state.filteredItems?.length === 0
const isEmptyItems = this.state.items.lenght === 0 const isEmptyItems = this.state.items.length === 0
this.emptyMessageElement.textContent = this.emptyMessageElement.textContent =
isEmptyFilteredItems ? 'Tasks not found' isEmptyFilteredItems ? 'Tasks not found'
@@ -115,7 +116,7 @@ class Todo {
} }
toggleCheckedState(id) { toggleCheckedState(id) {
this.state.items = this.state.map((item) => { this.state.items = this.state.items.map((item) => {
if (item.id === id) { if (item.id === id) {
return { return {
...item, ...item,
@@ -146,8 +147,77 @@ class Todo {
this.render() this.render()
} }
bindEvents() { onNewTaskFormSubmit(event) {
event.preventDefault()
const newTodoItemTitle = this.newTaskInputElement.value
if (newTodoItemTitle.trim().length > 0) {
this.addItem(newTodoItemTitle)
this.resetFilter()
this.newTaskInputElement.value = ''
this.newTaskInputElement.focus()
}
}
onSearchTaskFormSubmit(event) {
event.preventDefault()
}
onSearchTaskInputChange({ target }) {
const value = target.value.trim()
if (value.length > 0) {
this.state.searchQuery = value
this.filter()
} else {
this.resetFilter()
}
}
onDeleteAllButtonClick() {
const isConfirmed = confirm('Are you sure you want to delete all?')
if (isConfirmed) {
this.state.items = []
this.saveItemsToLocalStorage()
this.render()
}
}
onClick({ target }) {
if (target.matches(this.selectors.itemDeleteButton)) {
const itemElement = target.closest(this.selectors.item)
const itemCheckboxElement = itemElement.querySelector(this.selectors.itemCheckbox)
itemElement.classList.add(this.stateClasses.isDisappearing)
setTimeout (() => {
this.deleteItem(itemCheckboxElement.id)
}, 400)
}
}
onChange({ target }) {
if (target.matches(this.selectors.itemCheckbox)) {
this.toggleCheckedState(target.id)
}
}
bindEvents() {
this.onNewTaskFormSubmit = this.onNewTaskFormSubmit.bind(this)
this.onSearchTaskFormSubmit = this.onSearchTaskFormSubmit.bind(this)
this.onSearchTaskInputChange = this.onSearchTaskInputChange.bind(this)
this.onDeleteAllButtonClick = this.onDeleteAllButtonClick.bind(this)
this.onClick = this.onClick.bind(this)
this.onChange = this.onChange.bind(this)
this.newTaskFormElement.addEventListener('submit', this.onNewTaskFormSubmit)
this.searchTaskFormElement.addEventListener('submit', this.onSearchTaskFormSubmit)
this.searchTaskInputElement.addEventListener('input', this.onSearchTaskInputChange)
this.deleteAllButtonElement.addEventListener('click', this.onDeleteAllButtonClick)
this.listElement.addEventListener('click', this.onClick)
this.listElement.addEventListener('change', this.onChange)
} }
} }