mc0de
JavaScript · Lesson 17 of 17 · Capstone Project

Build Your Final Project

Put your JavaScript skills to work! Create an interactive student dashboard with task management, learning progress, persistent storage, and dynamic content.

DOM & Events Arrays & Objects JSON & Fetch localStorage Final Challenge
● ● ●   student-dashboard.js
🎓 Student Dashboard Preview
3Total Tasks
1Completed Tasks
1 of 3 tasks completed
01 / Your Capstone

Meet the mC0de Student Dashboard

Your final project is a small, interactive learning application. Instead of practicing JavaScript features separately, you’ll combine them into one experience.

The dashboard will manage tasks, calculate completion progress, filter information, remember settings, and optionally retrieve data from a public API.

Project goal: Build something that a student could actually use while studying. Functionality matters more than writing the most code.
02 / Planning the Data

Organize Information With Arrays and Objects

Start by representing each task as an object. Store those objects inside an array.

Task data model
let tasks = [
  {
    id: 1,
    title: "Review JavaScript arrays",
    completed: false
  },
  {
    id: 2,
    title: "Practice DOM events",
    completed: true
  }
];

Each object has an identifier, a title, and a completion status. This structure makes adding, editing, filtering, and deleting tasks much easier.

03 / Building the Interface

Use DOM Methods to Display Your Data

Rather than manually adding a new HTML element for every task, JavaScript can generate the interface from your array.

Rendering task elements
function renderTasks() {
  const container = document.getElementById("tasks");
  container.replaceChildren();

  tasks.forEach(function(task) {
    const item = document.createElement("p");
    item.textContent = task.title;
    container.appendChild(item);
  });
}

Using textContent also prevents task titles from being interpreted as HTML.

04 / Making It Interactive

Connect Buttons, Forms, and Events

Use addEventListener() to respond when visitors add a task or mark one complete. Validate the input before changing your data.

Adding a task
function addTask(title) {
  const cleanTitle = title.trim();

  if (!cleanTitle) {
    return;
  }

  tasks.push({
    id: Date.now(),
    title: cleanTitle,
    completed: false
  });

  renderTasks();
}

In a larger application, use a more robust unique identifier. For this beginner project, the completed solution uses an identifier combining time and randomness.

05 / Calculating Progress

Turn Task Data Into Useful Statistics

Use array methods to calculate how much work is complete.

Progress calculation
const completed = tasks.filter(function(task) {
  return task.completed;
}).length;

const percentage = tasks.length
  ? Math.round(completed / tasks.length * 100)
  : 0;

console.log(percentage + "% complete");

Update a progress bar whenever a task changes. This combines arrays, conditionals, arithmetic, functions, and DOM manipulation.

06 / Remembering & Retrieving

Add Persistence and Optional API Data

Use the JSON and localStorage skills from Lessons 14 and 16 to remember task information between visits.

Saving and loading task data
// Save:
localStorage.setItem(
  "studentTasks",
  JSON.stringify(tasks)
);

// Load:
const saved = localStorage.getItem("studentTasks");

if (saved) {
  tasks = JSON.parse(saved);
}

The finished project also includes an optional Fetch API button for retrieving a suggested activity. Handle unavailable networks gracefully with a built-in suggestion.

Sandbox detail: The editor preview is isolated for safety. Its storage is handled through a restricted parent-page bridge, rather than direct localStorage access from the iframe.
07 / Testing & Finishing

Test Your Dashboard Like a Developer

A project isn’t finished just because it looks correct. Verify that its interactions work, including unusual situations.

  • Add a task and confirm it appears immediately.
  • Try submitting an empty title and verify that it is rejected.
  • Mark tasks complete and incomplete; confirm the percentage changes.
  • Edit and delete tasks, then verify the task count.
  • Search for a task and try filters with no matches.
  • Reload the preview and confirm saved tasks return.
  • Test the API feature with and without network access.
  • Check the dashboard on a narrow mobile screen.
Developer habit: Test each feature immediately after implementing it. Small problems are much easier to find before they become part of a larger application.
🏆 Final mC0de Challenge

Build Your Complete Student Dashboard

This is your opportunity to bring together the entire JavaScript learning path.

Required Features

  1. A form to add new study tasks.
  2. Task completion and deletion controls.
  3. A live task counter and completion percentage.
  4. A progress bar that updates automatically.
  5. Saved tasks using JSON and localStorage.
  6. Input validation and useful status messages.
  7. A responsive layout suitable for mobile and desktop.

Bonus Features

  • Edit existing tasks.
  • Search and filter by completion status.
  • Switch between light and dark themes.
  • Load an activity suggestion using Fetch API.
Completion goal: Your project should remain functional after a preview reload, including saved tasks and preferences when browser storage is available.
💻 Final Project Coding Sandbox

Build the mC0de Student Dashboard

Start with the working task manager, then add your own improvements. Select Load Solution to explore a complete dashboard with editing, search, filters, saved preferences, and API integration.

Live Result

The isolated preview saves only this final project’s data through a restricted storage bridge. Reset restores the starter code without deleting saved tasks. Use the dashboard’s Clear Saved Tasks button to erase its data.

Lesson 17 Recap

What You’ve Learned

You’ve Completed the JavaScript Curriculum!

Across 17 lessons, you’ve progressed from writing your first JavaScript statement to building an interactive application.

Your final project brings together the language fundamentals, arrays, objects, DOM, events, JSON, asynchronous requests, and persistent storage.

Once you’ve tested your dashboard, use the completion card below to mark the final lesson complete.

Your Learning Journey

0 / 17 Completed

Lesson 17 of 17 — your final milestone!

🏆

You've Reached the JavaScript Finish Line!

From your first variable to your very own interactive dashboard, you've explored the essential building blocks of JavaScript. Congratulations on completing your final project!

🎓 Congratulations, JavaScript Graduate!

You've completed all 17 lessons of the mC0de JavaScript Learning Path. You've earned this milestone through learning, practicing, and building. Keep experimenting — your coding journey is just getting started!