//index.html
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<h2>Login</h2>
<input id="email" placeholder="Email" required><br>
<input id="password" type="password" placeholder="Password" required><br>
<button onclick="login()">Login</button>
<p>No account? <a href="register.html">Register here</a></p>
<script>
const API = 'http://localhost:5000/api/auth';
async function login() {
const email = document.getElementById('email').value;
const password = document.getElementById('password').value;
if (!email || !password) {
alert("Please fill in all fields");
return;
}
try {
const res = await fetch(`${API}/login`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, password })
});
const data = await res.json();
if (res.ok) {
localStorage.setItem('token', data.token);
alert('Login successful!');
window.location.href = 'tasks.html';
} else {
alert(data.message || 'Login failed');
}
} catch (err) {
console.error('Login error:', err);
alert('Something went wrong. Please try again.');
}
}
</script>
</body>
</html>
//register.html
<!DOCTYPE html>
<html>
<head>
<title>Register</title>
</head>
<body>
<h2>Register</h2>
<input id="name" placeholder="Full Name" required><br>
<input id="email" placeholder="Email" required><br>
<input id="password" type="password" placeholder="Password" required><br>
<button id="registerBtn">Register</button>
<p>Already have an account? <a href="index.html">Login here</a></p>
<script>
const API = 'http://localhost:5000/api/auth';
document.getElementById('registerBtn').addEventListener('click', async () => {
const name = document.getElementById('name').value;
const email = document.getElementById('email').value;
const password = document.getElementById('password').value;
if (!name || !email || !password) {
return alert('All fields are required.');
}
try {
const res = await fetch(`${API}/register`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name, email, password })
});
const data = await res.json();
if (res.ok) {
alert(data.message);
window.location.href = 'index.html';
} else {
alert(data.message || 'Registration failed');
}
} catch (err) {
console.error('Register error:', err);
alert('Something went wrong. Try again.');
}
});
</script>
</body>
</html>
//tasks.html
<!DOCTYPE html>
<html>
<head>
<title>Task Management</title>
</head>
<body>
<h2>Manage Your Tasks</h2>
<div>
<input id="taskTitle" placeholder="Enter Task Title"><br>
<input id="taskDescription" placeholder="Enter Description"><br>
<input id="taskDueDate" type="date"><br>
<select id="taskStatus">
<option value="pending">Pending</option>
<option value="in-progress">In Progress</option>
<option value="completed">Completed</option>
</select><br><br>
<button onclick="addNewTask()">Add New Task</button>
</div>
<h3>Task List</h3>
<ul id="taskList"></ul>
<script>
const API_URL = 'http://localhost:5000/api/tasks';
const userToken = localStorage.getItem('token');
if (!userToken) {
alert("You need to log in first.");
window.location.href = "login.html"; // Redirect to login page if no token found
}
// Fetch and display all tasks
async function getAllTasks() {
try {
const response = await fetch(API_URL + '/all', {
headers: { Authorization: 'Bearer ' + userToken }
});
const tasks = await response.json();
const taskListElement = document.getElementById('taskList');
taskListElement.innerHTML = '';
if (tasks.length === 0) {
taskListElement.innerHTML = '<li>No tasks found.</li>';
} else {
tasks.forEach(task => {
const taskItem = document.createElement('li');
taskItem.innerHTML = `
<b>${task.title}</b> - ${task.status}
<button onclick="deleteTask('${task._id}')">Delete</button>
`;
taskListElement.appendChild(taskItem);
});
}
} catch (err) {
console.error("Fetching tasks failed:", err);
alert("Error fetching tasks. Please try again.");
}
}
// Add a new task
async function addNewTask() {
const title = document.getElementById('taskTitle').value.trim();
const description = document.getElementById('taskDescription').value.trim();
const dueDate = document.getElementById('taskDueDate').value;
const status = document.getElementById('taskStatus').value;
if (!title) {
return alert("Title is required.");
}
try {
const response = await fetch(API_URL + '/create', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: 'Bearer ' + userToken
},
body: JSON.stringify({ title, description, dueDate, status })
});
const responseData = await response.json();
alert('Task added successfully!');
getAllTasks();
} catch (err) {
console.error("Adding task failed:", err);
alert("Could not add task.");
}
}
// Delete a task by ID
async function deleteTask(taskId) {
if (!confirm("Are you sure you want to delete this task?")) return;
try {
const response = await fetch(`${API_URL}/delete/${taskId}`, {
method: 'DELETE',
headers: { Authorization: 'Bearer ' + userToken }
});
const responseData = await response.json();
alert(responseData.message);
getAllTasks();
} catch (err) {
console.error("Deleting task failed:", err);
alert("Could not delete task.");
}
}
// Load tasks when the page loads
getAllTasks();
</script>
</body>
</html>
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter