{{ template "base" . }} {{ define "content" }} <form action="javascript:void(0);"> <div class="container text-center"> <div class="row"> <div class="col"> <input type="text" class="form-control" id="new-todo-text" placeholder="TODO text"> </div> <div class="col"> <button id="new-todo-submit" class="btn btn-primary">Add</button> <button class="btn btn-secondary" id="show-done">Show Done</button> </div> </div> </div> </form> <div class="container text-center" style="margin-top: 4ch;"> <table id="todos" class="table table-hover" style="word-wrap: break-word;"></table> </div> <script> async function displayTodos(showDone) { let username = getUsername(); let password = getUserPassword(); // Fetch and display TODOs response = await getTodos(username, password); let todosJson = await response.json(); let todosDisplayed = []; if (response.ok && todosJson != null) { let todosDiv = document.getElementById("todos"); // Clear what we've had before todosDiv.innerHTML = ""; todosJson.forEach((item) => { if (showDone === true && item.isDone == true) { // An already done Todo let todoDeleteBtnID = "btn-delete-" + String(item.id); // Display let timeCreated = new Date(item.timeCreatedUnix * 1000); if (item.completionTimeUnix != 0) { let timeDone = new Date(item.completionTimeUnix * 1000); todosDiv.innerHTML += "<tr><td>" + item.text + "</td>" + "<td>" + " " + timeCreated.getDate() + "/" + (timeCreated.getMonth() + 1) + "/" + timeCreated.getFullYear() + "</td>" + "<td>" + " " + timeDone.getDate() + "/" + (timeDone.getMonth() + 1) + "/" + timeDone.getFullYear() + "</td>" + "<td>" + "<button class='btn btn-danger' id='" + todoDeleteBtnID + "'><img src='/static/images/trash3-fill.svg'></button></td></tr>"; } else { todosDiv.innerHTML += "<tr><td>" + item.text + "</td>" + "<td>" + " " + timeCreated.getDate() + "/" + (timeCreated.getMonth() + 1) + "/" + timeCreated.getFullYear() + "</td>" + "<td></td>" + "<td>" + "<button class='btn btn-danger' id='" + todoDeleteBtnID + "'><img src='/static/images/trash3-fill.svg'></button></td></tr>"; } todosDisplayed.push({item: item, buttonDel: todoDeleteBtnID}); } else if (showDone === false && item.isDone == false) { // A yet to be done Todo let todoCompleteBtnID = "btn-complete-" + String(item.id); let todoDeleteBtnID = "btn-delete-" + String(item.id); let todoEditBtnID = "btn-edit-" + String(item.id); // Display let timeCreated = new Date(item.timeCreatedUnix * 1000); todosDiv.innerHTML += "<tr><td>" + item.text + "</td>" + "<td>" + " " + timeCreated.getDate() + "/" + (timeCreated.getMonth() + 1) + "/" + timeCreated.getFullYear() + "</td>" + "<td><button class='btn btn-success' id='" + todoCompleteBtnID + "'>" + "<img src='/static/images/check.svg'></button><button class='btn btn-danger' id='" + todoDeleteBtnID + "'><img src='/static/images/trash3-fill.svg'></button></td></tr>"; todosDisplayed.push({item: item, buttonDel: todoDeleteBtnID, buttonComplete: todoCompleteBtnID}); } }); } // Loop over all buttons (doesn't matter which ones because the amounts are equal) for (let i = 0; i < todosDisplayed.length; i++) { let elem = todosDisplayed[i]; if (showDone === false && elem.item.isDone === false) { // Done button document.getElementById(elem.buttonComplete).addEventListener("click", async (event) => { // Mark as done elem.item.isDone = true; // Set completion time elem.item.completionTimeUnix = Math.floor(Date.now() / 1000); // Update response = await updateTodo(username, password, elem.item.id, elem.item); if (response.ok) { location.reload(); } }); // Delete button document.getElementById(elem.buttonDel).addEventListener("click", async (event) => { response = await deleteTodo(username, password, elem.item.id); if (response.ok) { location.reload(); } }); } else { // Delete button document.getElementById(elem.buttonDel).addEventListener("click", async (event) => { response = await deleteTodo(username, password, elem.item.id); if (response.ok) { location.reload(); } }); } } } document.addEventListener('DOMContentLoaded', async function() { let username = getUsername(); let password = getUserPassword(); document.getElementById("new-todo-text").focus(); let showDoneButton = document.getElementById("show-done"); showDoneButton.addEventListener("click", (event) => { displayTodos(true); // Re-display without reloading // Rename the button showDoneButton.innerText = "Show To Do"; showDoneButton.className = "btn btn-success"; // Make it "reset to default" showDoneButton.addEventListener("click", (event) => { location.reload(); }); }); // "Add" button document.getElementById("new-todo-submit").addEventListener("click", async (event) => { let newTodoTextInput = document.getElementById("new-todo-text"); let newTodoText = newTodoTextInput.value; if (newTodoText.length < 1) { newTodoTextInput.setCustomValidity("At least one character is needed!"); return; } else { newTodoTextInput.setCustomValidity(""); } newTodoTextInput.value = ""; // Make a request let response = await postNewTodo(username, password, {text: newTodoText}); if (response.ok) { location.reload(); } }); // Fetch and display TODOs await displayTodos(false); }, false) </script> {{ end }}