Author: Pedro Lucas Porcellis <porcellis@eletrotupi.com>
tasks: add filters & summary
css/tasks.css | 13 +++++ js/tasks.js | 126 ++++++++++++++++++++++++++++++++++++++++------------ tasks.html | 16 ++++++
diff --git a/css/tasks.css b/css/tasks.css
index 8944165cd221398f23dcd85a1508ad1e6e5a001b..4819d3091e8e5dbe5a11200d95443273089a23cf 100644
--- a/css/tasks.css
+++ b/css/tasks.css
@@ -23,3 +23,16 @@ input:valid, textarea:valid, select:valid {
border-color: green;
}
+.task-filters {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+}
+
+.task-filters select {
+ margin-left: 5px;
+}
+
+#task-summary {
+ margin: 1rem 0px;
+}
diff --git a/js/tasks.js b/js/tasks.js
index eb6db368d62797fb73d7c9233740a67f973298e9..727535098bedc97158250ef05f7fb6ff695f747b 100644
--- a/js/tasks.js
+++ b/js/tasks.js
@@ -1,6 +1,8 @@
document.addEventListener("DOMContentLoaded", () => {
const taskForm = document.getElementById("task-form");
const taskList = document.querySelector("#task-list ul");
+ const priorityFilter = document.getElementById("priority-filter");
+ const taskSummary = document.getElementById("task-summary");
const toggleErrorMessage = (field, condition, message) => {
const errorMessage = field.nextElementSibling; // Mensagem de erro associada ao campo
@@ -53,19 +55,103 @@
return errors.length === 0;
};
- const addTaskToList = (task) => {
- const taskItem = document.createElement("li");
- taskItem.innerHTML = `
- <strong>${task.title}</strong>
- <p>${task.description}</p>
- <p>Prazo: ${task.deadline}</p>
- <p>Prioridade: ${task.priority}</p>
- <button class="remove-task">Remover</button>
+ // Tasks stuff
+ // TODO: Move this shit into somewhere else?
+
+ const loadTasks = () => {
+ const tasks = JSON.parse(localStorage.getItem("tasks")) || [];
+
+ renderTasks(tasks);
+ updateTaskSummary(tasks);
+ };
+
+ const saveTasks = (tasks) => {
+ localStorage.setItem("tasks", JSON.stringify(tasks));
+
+ updateTaskSummary(tasks);
+ };
+
+ const updateTaskSummary = (tasks) => {
+ const summary = tasks.reduce((acc, task) => {
+ acc[task.priority] = (acc[task.priority] || 0) + 1;
+
+ return acc;
+ }, {});
+
+ taskSummary.innerHTML = `
+ <p>Prioridade Alta: ${summary["alta"] || 0}</p>
+ <p>Prioridade Média: ${summary["media"] || 0}</p>
+ <p>Prioridade Baixa: ${summary["baixa"] || 0}</p>
`;
+ };
- taskList.appendChild(taskItem);
+ const renderTasks = (tasks) => {
+ taskList.innerHTML = "";
+
+ tasks.map((task) => {
+ const taskItem = document.createElement("li");
+ taskItem.innerHTML = `
+ <strong>${task.title}</strong>
+ <p>${task.description}</p>
+ <p>Prazo: ${task.deadline}</p>
+ <p>Prioridade: ${task.priority}</p>
+ <button class="remove-task">Remover</button>
+ `;
+ taskList.appendChild(taskItem);
+ });
+ };
+
+ const addTask = (task) => {
+ const tasks = JSON.parse(localStorage.getItem("tasks")) || [];
+ tasks.push(task);
+
+ saveTasks(tasks);
+ renderTasks(tasks);
};
+ const removeTask = (index) => {
+ const tasks = JSON.parse(localStorage.getItem("tasks")) || [];
+ tasks.splice(index, 1);
+
+ saveTasks(tasks);
+ renderTasks(tasks);
+ updateTaskSummary(tasks);
+ };
+
+ const filterTasksByPriority = (priority) => {
+ const tasks = JSON.parse(localStorage.getItem("tasks")) || [];
+ const filteredTasks = priority === "Todas" ? tasks : tasks.filter((task) => task.priority === priority);
+
+ renderTasks(filteredTasks);
+ };
+
+ taskForm.addEventListener("submit", (e) => {
+ e.preventDefault();
+
+ if (validateForm()) {
+ const task = {
+ title: document.getElementById("task-title").value.trim(),
+ description: document.getElementById("task-desc").value.trim(),
+ deadline: document.getElementById("task-deadline").value,
+ priority: document.getElementById("task-priority").value,
+ };
+
+ addTask(task);
+ taskForm.reset();
+ }
+ });
+
+ taskList.addEventListener("click", (e) => {
+ if (e.target.classList.contains("remove-task")) {
+ const index = Array.from(taskList.children).indexOf(e.target.parentElement);
+ removeTask(index);
+ }
+ });
+
+ priorityFilter.addEventListener("change", (e) => {
+ filterTasksByPriority(e.target.value);
+ });
+
const resetForm = () => {
taskForm.reset();
};
@@ -89,26 +175,6 @@ break;
}
});
- taskForm.addEventListener("submit", (e) => {
- e.preventDefault();
-
- if (validateForm()) {
- const task = {
- title: document.getElementById("task-title").value.trim(),
- description: document.getElementById("task-desc").value.trim(),
- deadline: document.getElementById("task-deadline").value,
- priority: document.getElementById("task-priority").value,
- };
-
- addTaskToList(task);
- resetForm();
- }
- });
-
- taskList.addEventListener("click", (e) => {
- if (e.target.classList.contains("remove-task")) {
- e.target.parentElement.remove();
- }
- });
+ loadTasks();
});
diff --git a/tasks.html b/tasks.html
index e9f07959915b3933eb9675486b7927b9c9913839..2acbd1ea9619216265e7f1aa4a445bcc439dbefe 100644
--- a/tasks.html
+++ b/tasks.html
@@ -44,7 +44,7 @@
<label for="task-priority">Prioridade:</label>
<select id="task-priority" name="priority" required>
<option value="alta">Alta</option>
- <option value="média">Média</option>
+ <option value="media">Média</option>
<option value="baixa">Baixa</option>
</select>
<small class="error-message hidden">Por favor, selecione uma prioridade.</small>
@@ -57,6 +57,20 @@
<section id="task-list">
<h2>Lista de Tarefas</h2>
+ <div class="task-filters">
+ <label for="priority-filter">Filtrar por Prioridade:</label>
+ <select id="priority-filter">
+ <option value="Todas">Todas</option>
+ <option value="alta">Alta</option>
+ <option value="media">Média</option>
+ <option value="baixa">Baixa</option>
+ </select>
+ </div>
+
+ <div id="task-summary">
+ Nenhuma tarefa adicionada
+ </div>
+
<ul></ul>
</section>
</main>