Skip to content
Open

hw5 #35

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 0 additions & 13 deletions index.html

This file was deleted.

Empty file removed src/main.js
Empty file.
128 changes: 128 additions & 0 deletions style/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>To-Do List</title>
<link rel="stylesheet" href="style.css">
</head>
<body>

<div class="app-container">
<header>
<h1>To-Do List</h1>
</header>

<div class="controls-container">
<div class="add-task-form">
<input type="text" id="newTaskInput" placeholder="Add a new task">
<button class="add-btn">Add</button>
</div>
<div class="filter-sort-controls">
<div class="select-wrapper">
<label for="sortBy">Sort by:</label>
<select id="sortBy">
<option value="date">Date</option>
<option value="priority">Priority</option>
</select>
</div>
<div class="select-wrapper">
<label for="filterBy">Filter:</label>
<select id="filterBy">
<option value="all">All</option>
<option value="completed">Completed</option>
<option value="pending">Pending</option>
</select>
</div>
</div>
</div>

<ul class="task-list">
<li class="task-item">
<div class="task-content">
<input type="checkbox" id="task1">
<label for="task1">Complete the project</label>
</div>
<div class="task-details">
<span class="priority medium">Medium</span>
<span class="due-date">May 1, 2024</span>
<div class="task-actions">
<button class="icon-btn edit-btn">✎</button>
<button class="icon-btn delete-btn">🗑</button>
</div>
</div>
</li>
<li class="task-item completed">
<div class="task-content">
<input type="checkbox" id="task2" checked>
<label for="task2">Read the book</label>
</div>
<div class="task-details">
<span class="priority low">Low</span>
<span class="due-date">April 25, 2024</span>
<div class="task-actions">
<button class="icon-btn edit-btn">✎</button>
<button class="icon-btn delete-btn">🗑</button>
</div>
</div>
</li>
<li class="task-item">
<div class="task-content">
<input type="checkbox" id="task3">
<label for="task3">Go to the gym</label>
</div>
<div class="task-details">
<span class="priority high">High</span>
<span class="due-date">April 23, 2024</span>
<div class="task-actions">
<button class="icon-btn edit-btn">✎</button>
<button class="icon-btn delete-btn">🗑</button>
</div>
</div>
</li>
<li class="task-item">
<div class="task-content">
<input type="checkbox" id="task4">
<label for="task4">Make a doctor's appointment</label>
</div>
<div class="task-details">
<span class="priority medium">Medium</span>
<span class="due-date">April 20, 2024</span>
<div class="task-actions">
<button class="icon-btn edit-btn">✎</button>
<button class="icon-btn delete-btn">🗑</button>
</div>
</div>
</li>
</ul>
</div>

<div id="task-modal" class="modal-overlay" style="display: none;"> <div class="modal-content">
<form id="task-form">
<h2 id="modal-title">Add Task</h2>
<div class="form-group">
<label for="task-title-input">Task</label>
<input type="text" id="task-title-input" placeholder="e.g., Read a book" required>
</div>
<div class="form-group">
<label for="task-date-input">Due Date</label>
<input type="date" id="task-date-input" required>
</div>
<div class="form-group">
<label for="task-priority-select">Priority</label>
<select id="task-priority-select">
<option value="high">High</option>
<option value="medium" selected>Medium</option>
<option value="low">Low</option>
</select>
</div>
<div class="form-actions">
<button type="button" class="cancel-btn">Cancel</button>
<button type="submit" class="save-btn">Save Task</button>
</div>
</form>
</div>
</div>
<script src="main.js" defer></script>
</body>
</html>
190 changes: 190 additions & 0 deletions style/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
document.addEventListener('DOMContentLoaded', () => {
const newTaskInput = document.getElementById('newTaskInput');
const addBtn = document.querySelector('.add-btn');
const sortBySelect = document.getElementById('sortBy');
const filterBySelect = document.getElementById('filterBy');
const taskList = document.querySelector('.task-list');

const taskModal = document.getElementById('task-modal');
const modalTitle = document.getElementById('modal-title');
const taskForm = document.getElementById('task-form');
const taskTitleInput = document.getElementById('task-title-input');
const taskDateInput = document.getElementById('task-date-input');
const taskPrioritySelect = document.getElementById('task-priority-select');
const cancelBtn = document.querySelector('.cancel-btn');

let tasks = [];
let editingTaskId = null;

const renderTasks = () => {
taskList.innerHTML = '';

let tasksToRender = [...tasks];

const filterValue = filterBySelect.value;
if (filterValue === 'completed') {
tasksToRender = tasksToRender.filter(task => task.completed);
} else if (filterValue === 'pending') {
tasksToRender = tasksToRender.filter(task => !task.completed);
}

const sortByValue = sortBySelect.value;
const priorityValues = { high: 3, medium: 2, low: 1 };

tasksToRender.sort((a, b) => {
if (a.completed !== b.completed) {
return a.completed ? 1 : -1;
}
if (sortByValue === 'date') {
return new Date(a.dueDate) - new Date(b.dueDate);
} else if (sortByValue === 'priority') {
return priorityValues[b.priority] - priorityValues[a.priority];
}
return 0;
});

tasksToRender.forEach(task => {
const taskItem = document.createElement('li');
taskItem.className = `task-item ${task.completed ? 'completed' : ''}`;
taskItem.dataset.id = task.id;

const priorityClass = task.priority.toLowerCase();
const formattedDate = new Date(task.dueDate).toLocaleDateString('uk-UA', {
day: 'numeric', month: 'long', year: 'numeric'
});

taskItem.innerHTML = `
<div class="task-content">
<input type="checkbox" id="task-${task.id}" ${task.completed ? 'checked' : ''}>
<label for="task-${task.id}">${task.title}</label>
</div>
<div class="task-details">
<span class="priority ${priorityClass}">${task.priority}</span>
<span class="due-date">${formattedDate}</span>
<div class="task-actions">
<button class="icon-btn edit-btn">✎</button>
<button class="icon-btn delete-btn">🗑</button>
</div>
</div>
`;
taskList.appendChild(taskItem);
});
};

const openModal = (mode = 'add', taskId = null) => {
taskForm.reset();
editingTaskId = taskId;

if (mode === 'edit' && taskId) {
const task = tasks.find(t => t.id === taskId);
if (task) {
modalTitle.textContent = 'Редагувати завдання';
taskTitleInput.value = task.title;
taskDateInput.value = task.dueDate;
taskPrioritySelect.value = task.priority;
}
} else {
modalTitle.textContent = 'Додати завдання';
}
taskModal.style.display = 'flex';
};

const closeModal = () => {
taskModal.style.display = 'none';
editingTaskId = null;
};

const loadTasks = async () => {
try {
const response = await fetch('tasks.json');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const initialTasks = await response.json();
tasks = initialTasks.map(task => ({ ...task, id: Date.now() + Math.random() }));
} catch (error) {
console.error("Не вдалося завантажити завдання з tasks.json:", error);
tasks = [];
}
};

addBtn.addEventListener('click', () => {
const title = newTaskInput.value.trim();
openModal('add');
if (title) {
taskTitleInput.value = title;
newTaskInput.value = '';
}
});

taskForm.addEventListener('submit', (e) => {
e.preventDefault();
const title = taskTitleInput.value.trim();
const dueDate = taskDateInput.value;
const priority = taskPrioritySelect.value;

if (!title || !dueDate) {
alert('Заповніть назву завдання та дату.');
return;
}

if (editingTaskId) {
const task = tasks.find(t => t.id === editingTaskId);
if (task) {
task.title = title;
task.dueDate = dueDate;
task.priority = priority;
}
} else {
const newTask = {
id: Date.now(),
title,
dueDate,
priority,
completed: false,
};
tasks.push(newTask);
}

closeModal();
renderTasks();
});

cancelBtn.addEventListener('click', closeModal);
taskModal.addEventListener('click', (e) => {
if (e.target === taskModal) {
closeModal();
}
});

taskList.addEventListener('click', (e) => {
const target = e.target;
const taskItem = target.closest('.task-item');
if (!taskItem) return;

const taskId = Number(taskItem.dataset.id);

if (target.type === 'checkbox') {
const task = tasks.find(t => t.id === taskId);
if (task) {
task.completed = target.checked;
renderTasks();
}
} else if (target.matches('.delete-btn')) {
tasks = tasks.filter(t => t.id !== taskId);
renderTasks();
} else if (target.matches('.edit-btn')) {
openModal('edit', taskId);
}
});

sortBySelect.addEventListener('change', renderTasks);
filterBySelect.addEventListener('change', renderTasks);

const initializeApp = async () => {
await loadTasks();
renderTasks();
};

initializeApp();
});
Loading