Web-based Task Prioritization JavaScript, HTML, CSS

👤 Sharing: AI
```javascript
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Task Prioritization</title>
  <style>
    body {
      font-family: sans-serif;
      margin: 20px;
    }

    h1 {
      text-align: center;
    }

    #task-form {
      margin-bottom: 20px;
      padding: 10px;
      border: 1px solid #ccc;
      border-radius: 5px;
      background-color: #f9f9f9;
    }

    #task-form label {
      display: block;
      margin-bottom: 5px;
    }

    #task-form input,
    #task-form select,
    #task-form textarea {
      width: 100%;
      padding: 8px;
      margin-bottom: 10px;
      border: 1px solid #ccc;
      border-radius: 4px;
      box-sizing: border-box; /* Ensures padding doesn't increase width */
    }

    #task-form button {
      background-color: #4CAF50;
      color: white;
      padding: 10px 15px;
      border: none;
      border-radius: 4px;
      cursor: pointer;
      font-size: 16px;
    }

    #task-form button:hover {
      background-color: #3e8e41;
    }

    #task-list {
      list-style: none;
      padding: 0;
    }

    .task-item {
      border: 1px solid #ddd;
      margin-bottom: 10px;
      padding: 10px;
      border-radius: 5px;
      background-color: #fff;
      display: flex;
      justify-content: space-between;
      align-items: center;
    }

    .task-item:hover {
      background-color: #f0f0f0;
    }

    .task-item p {
      margin: 0;
    }

    .task-item .priority {
      font-weight: bold;
    }

    .task-item .buttons {
      display: flex;
      gap: 5px;
    }

    .task-item button {
      padding: 5px 10px;
      border: none;
      border-radius: 4px;
      cursor: pointer;
      font-size: 14px;
    }

    .task-item .delete-button {
      background-color: #f44336;
      color: white;
    }

    .task-item .delete-button:hover {
      background-color: #d32f2f;
    }

    .task-item .complete-button {
      background-color: #2196F3;
      color: white;
    }

    .task-item .complete-button:hover {
      background-color: #1976D2;
    }

    .completed {
      text-decoration: line-through;
      color: #888;
    }

    /* Media query for smaller screens */
    @media (max-width: 600px) {
      .task-item {
        flex-direction: column;
        align-items: flex-start;
      }

      .task-item .buttons {
        margin-top: 10px;
      }
    }

  </style>
</head>
<body>
  <h1>Task Prioritization</h1>

  <div id="task-form">
    <label for="task-name">Task Name:</label>
    <input type="text" id="task-name" name="task-name" required>

    <label for="task-description">Description:</label>
    <textarea id="task-description" name="task-description" rows="3"></textarea>

    <label for="task-priority">Priority:</label>
    <select id="task-priority" name="task-priority">
      <option value="high">High</option>
      <option value="medium">Medium</option>
      <option value="low">Low</option>
    </select>

    <button id="add-task-button">Add Task</button>
  </div>

  <ul id="task-list">
    <!-- Tasks will be added here -->
  </ul>

  <script>
    document.addEventListener('DOMContentLoaded', () => {
      const taskForm = document.getElementById('task-form');
      const taskNameInput = document.getElementById('task-name');
      const taskDescriptionInput = document.getElementById('task-description');
      const taskPrioritySelect = document.getElementById('task-priority');
      const addTaskButton = document.getElementById('add-task-button');
      const taskList = document.getElementById('task-list');

      let tasks = [];

      // Load tasks from localStorage
      if (localStorage.getItem('tasks')) {
        tasks = JSON.parse(localStorage.getItem('tasks'));
        renderTasks();
      }

      addTaskButton.addEventListener('click', () => {
        const taskName = taskNameInput.value.trim();
        const taskDescription = taskDescriptionInput.value.trim();
        const taskPriority = taskPrioritySelect.value;

        if (taskName !== '') {
          const newTask = {
            id: Date.now(),
            name: taskName,
            description: taskDescription,
            priority: taskPriority,
            completed: false,
          };

          tasks.push(newTask);
          saveTasks();
          renderTasks();

          // Clear the form
          taskNameInput.value = '';
          taskDescriptionInput.value = '';
          taskPrioritySelect.value = 'medium'; // Reset to default
        } else {
          alert('Task name cannot be empty.');
        }
      });

      function renderTasks() {
        taskList.innerHTML = ''; // Clear the existing list

        // Sort tasks by priority (High > Medium > Low) and then by completion status
        tasks.sort((a, b) => {
          if (a.completed === b.completed) {
            const priorityOrder = { 'high': 0, 'medium': 1, 'low': 2 };
            return priorityOrder[a.priority] - priorityOrder[b.priority];
          } else {
            return a.completed ? 1 : -1; // Completed tasks go to the end
          }
        });

        tasks.forEach(task => {
          const listItem = document.createElement('li');
          listItem.classList.add('task-item');

          listItem.innerHTML = `
            <div class="task-details">
              <p class="${task.completed ? 'completed' : ''}">
                <strong>${task.name}</strong>
                <br>
                ${task.description ? task.description + '<br>' : ''}
                <span class="priority">Priority: ${task.priority}</span>
              </p>
            </div>
            <div class="buttons">
              <button class="complete-button" data-id="${task.id}">${task.completed ? 'Undo' : 'Complete'}</button>
              <button class="delete-button" data-id="${task.id}">Delete</button>
            </div>
          `;

          taskList.appendChild(listItem);
        });

        // Add event listeners to the buttons after rendering
        const deleteButtons = document.querySelectorAll('.delete-button');
        deleteButtons.forEach(button => {
          button.addEventListener('click', () => {
            const taskId = parseInt(button.dataset.id);
            deleteTask(taskId);
          });
        });

        const completeButtons = document.querySelectorAll('.complete-button');
        completeButtons.forEach(button => {
          button.addEventListener('click', () => {
            const taskId = parseInt(button.dataset.id);
            completeTask(taskId);
          });
        });
      }

      function deleteTask(taskId) {
        tasks = tasks.filter(task => task.id !== taskId);
        saveTasks();
        renderTasks();
      }

      function completeTask(taskId) {
        tasks = tasks.map(task => {
          if (task.id === taskId) {
            return { ...task, completed: !task.completed };
          }
          return task;
        });
        saveTasks();
        renderTasks();
      }

      function saveTasks() {
        localStorage.setItem('tasks', JSON.stringify(tasks));
      }
    });
  </script>
</body>
</html>
```
👁️ Viewed: 10

Comments