Skip to content

Postwires

Primary Menu
  • Home
  • CSS
  • Documentation
  • HTML
  • Java
  • Javascript
  • Questions
  • React js
  • React Native
Watch Video
  • Home
  • Uncategorized
  • Reusable Component
  • Uncategorized

Reusable Component

john August 25, 2025

Let’s build a Task Management Dashboard in JavaScript (HTML + CSS + JS).
I’ll give you a complete project with CRUD, status management, search, and sorting.

Here’s a production-ready project 👇


📂 Project Structure

task-dashboard/
│── index.html
│── style.css
│── script.js

🖼 index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Task Management Dashboard</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <div class="container">
    <h1>Task Management Dashboard</h1>

    <!-- Task Form -->
    <form id="taskForm">
      <input type="hidden" id="taskId">
      <input type="text" id="title" placeholder="Task Title" required>
      <textarea id="description" placeholder="Task Description"></textarea>
      <input type="date" id="dueDate" required>
      <select id="priority">
        <option value="Low">Low</option>
        <option value="Medium" selected>Medium</option>
        <option value="High">High</option>
      </select>
      <button type="submit">Save Task</button>
    </form>

    <!-- Search & Sort -->
    <div class="controls">
      <input type="text" id="search" placeholder="Search by title...">
      <select id="sortBy">
        <option value="">Sort By</option>
        <option value="dueDate">Due Date</option>
        <option value="priority">Priority</option>
      </select>
      <select id="statusFilter">
        <option value="">All Status</option>
        <option value="Pending">Pending</option>
        <option value="In Progress">In Progress</option>
        <option value="Completed">Completed</option>
      </select>
    </div>

    <!-- Task List -->
    <div id="taskList" class="task-list"></div>
  </div>

  <script src="script.js"></script>
</body>
</html>

🎨 style.css

body {
  font-family: Arial, sans-serif;
  background: #f4f6f9;
  margin: 0;
  padding: 0;
}
.container {
  max-width: 900px;
  margin: 20px auto;
  padding: 20px;
  background: white;
  border-radius: 10px;
  box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}
h1 { text-align: center; }

form {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
  margin-bottom: 20px;
}
form input, form textarea, form select, form button {
  padding: 10px;
  border: 1px solid #ddd;
  border-radius: 5px;
}
form textarea { grid-column: span 2; }
form button {
  grid-column: span 2;
  background: #007bff;
  color: white;
  border: none;
  cursor: pointer;
}
form button:hover { background: #0056b3; }

.controls {
  display: flex;
  justify-content: space-between;
  margin-bottom: 20px;
}
.controls input, .controls select {
  padding: 8px;
  border-radius: 5px;
  border: 1px solid #ddd;
}

.task-list {
  display: grid;
  gap: 15px;
}
.task {
  padding: 15px;
  border-radius: 10px;
  border: 1px solid #ddd;
  background: #fafafa;
}
.task h3 {
  margin: 0 0 5px;
}
.task p {
  margin: 5px 0;
}
.task .meta {
  font-size: 14px;
  color: #555;
}
.task .actions {
  margin-top: 10px;
}
.task button {
  margin-right: 5px;
  padding: 5px 10px;
  border: none;
  border-radius: 5px;
  cursor: pointer;
}
.task .edit { background: #ffc107; }
.task .delete { background: #dc3545; color: white; }
.task .status { background: #28a745; color: white; }

⚡ script.js

let tasks = JSON.parse(localStorage.getItem("tasks")) || [];

const taskForm = document.getElementById("taskForm");
const taskList = document.getElementById("taskList");
const searchInput = document.getElementById("search");
const sortBy = document.getElementById("sortBy");
const statusFilter = document.getElementById("statusFilter");

// Save task
taskForm.addEventListener("submit", function (e) {
  e.preventDefault();
  const id = document.getElementById("taskId").value;
  const title = document.getElementById("title").value;
  const description = document.getElementById("description").value;
  const dueDate = document.getElementById("dueDate").value;
  const priority = document.getElementById("priority").value;

  if (id) {
    // Update
    tasks = tasks.map(t =>
      t.id == id ? { ...t, title, description, dueDate, priority } : t
    );
  } else {
    // Create
    tasks.push({
      id: Date.now(),
      title,
      description,
      dueDate,
      priority,
      status: "Pending"
    });
  }

  localStorage.setItem("tasks", JSON.stringify(tasks));
  taskForm.reset();
  document.getElementById("taskId").value = "";
  renderTasks();
});

// Render tasks
function renderTasks() {
  let filtered = [...tasks];

  // Search
  const search = searchInput.value.toLowerCase();
  if (search) {
    filtered = filtered.filter(t => t.title.toLowerCase().includes(search));
  }

  // Status filter
  if (statusFilter.value) {
    filtered = filtered.filter(t => t.status === statusFilter.value);
  }

  // Sort
  if (sortBy.value === "dueDate") {
    filtered.sort((a, b) => new Date(a.dueDate) - new Date(b.dueDate));
  }
  if (sortBy.value === "priority") {
    const order = { High: 1, Medium: 2, Low: 3 };
    filtered.sort((a, b) => order[a.priority] - order[b.priority]);
  }

  taskList.innerHTML = "";
  filtered.forEach(task => {
    const div = document.createElement("div");
    div.className = "task";
    div.innerHTML = `
      <h3>${task.title}</h3>
      <p>${task.description}</p>
      <p class="meta">📅 ${task.dueDate} | 🔥 ${task.priority} | 📌 ${task.status}</p>
      <div class="actions">
        <button class="edit">Edit</button>
        <button class="delete">Delete</button>
        <button class="status">Change Status</button>
      </div>
    `;

    // Edit
    div.querySelector(".edit").addEventListener("click", () => {
      document.getElementById("taskId").value = task.id;
      document.getElementById("title").value = task.title;
      document.getElementById("description").value = task.description;
      document.getElementById("dueDate").value = task.dueDate;
      document.getElementById("priority").value = task.priority;
    });

    // Delete
    div.querySelector(".delete").addEventListener("click", () => {
      tasks = tasks.filter(t => t.id !== task.id);
      localStorage.setItem("tasks", JSON.stringify(tasks));
      renderTasks();
    });

    // Change Status
    div.querySelector(".status").addEventListener("click", () => {
      const next = { Pending: "In Progress", "In Progress": "Completed", Completed: "Pending" };
      task.status = next[task.status];
      localStorage.setItem("tasks", JSON.stringify(tasks));
      renderTasks();
    });

    taskList.appendChild(div);
  });
}

// Events
searchInput.addEventListener("input", renderTasks);
sortBy.addEventListener("change", renderTasks);
statusFilter.addEventListener("change", renderTasks);

// Initial render
renderTasks();

✅ Features Covered:

  • CRUD: Add, Edit, Delete tasks.
  • Status Change: Pending → In Progress → Completed.
  • Search & Sort: Search by title, sort by date/priority.
  • Filter: Filter by status.
  • LocalStorage: Data persists after refresh.

About the Author

john

Administrator

Visit Website View All Posts

Continue Reading

Previous: MERN Backend Roadmap
Next: ionic component

Related Stories

  • Uncategorized
  • React Native

How To Fix Gradle Error In React Native

john November 2, 2025
  • Uncategorized

jdagj

john October 31, 2025
  • Uncategorized

global map system

john October 31, 2025

Recent Posts

  • splash.jsx
  • home.jsx
  • How To Fix Gradle Error In React Native
  • jdagj
  • global map system

Categories

  • CSS
  • Documentation
  • HTML
  • Java
  • Javascript
  • Questions
  • React js
  • React Native
  • Uncategorized

You may have missed

  • React Native

splash.jsx

john November 28, 2025
  • React Native

home.jsx

john November 28, 2025
  • Uncategorized
  • React Native

How To Fix Gradle Error In React Native

john November 2, 2025
  • Uncategorized

jdagj

john October 31, 2025
  • About Author
  • About Us
  • Contact Us
  • Disclaimer
  • Privacy Policy
Copyright © All rights reserved. | MoreNews by AF themes.