Spaces:
Running
Running
Jetzt funktioniert kein einziger Knopf mehr, egal, wo ich drauf drücke, es passiert nichts
Browse files- components/task-item.js +16 -3
- index.html +5 -5
- script.js +24 -12
components/task-item.js
CHANGED
|
@@ -270,7 +270,6 @@ class TaskItem extends HTMLElement {
|
|
| 270 |
icon.outerHTML = feather.icons[iconName].toSvg({ width: 16, height: 16 });
|
| 271 |
});
|
| 272 |
}
|
| 273 |
-
|
| 274 |
setupEventListeners() {
|
| 275 |
this.shadowRoot.addEventListener('click', (e) => {
|
| 276 |
const target = e.target.closest('button');
|
|
@@ -291,9 +290,23 @@ class TaskItem extends HTMLElement {
|
|
| 291 |
this.handleToggleComplete(e);
|
| 292 |
}
|
| 293 |
});
|
| 294 |
-
}
|
| 295 |
|
| 296 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 297 |
const completed = e.target.checked;
|
| 298 |
this.dispatchEvent(new CustomEvent('toggle-complete', {
|
| 299 |
detail: { taskId: this.getAttribute('task-id'), completed },
|
|
|
|
| 270 |
icon.outerHTML = feather.icons[iconName].toSvg({ width: 16, height: 16 });
|
| 271 |
});
|
| 272 |
}
|
|
|
|
| 273 |
setupEventListeners() {
|
| 274 |
this.shadowRoot.addEventListener('click', (e) => {
|
| 275 |
const target = e.target.closest('button');
|
|
|
|
| 290 |
this.handleToggleComplete(e);
|
| 291 |
}
|
| 292 |
});
|
|
|
|
| 293 |
|
| 294 |
+
// Direct event listeners for buttons
|
| 295 |
+
const focusBtn = this.shadowRoot.querySelector('.focus-btn');
|
| 296 |
+
const editBtn = this.shadowRoot.querySelector('.task-action[title="Bearbeiten"]');
|
| 297 |
+
const deleteBtn = this.shadowRoot.querySelector('.task-action[title="Löschen"]');
|
| 298 |
+
|
| 299 |
+
if (focusBtn) {
|
| 300 |
+
focusBtn.addEventListener('click', (e) => this.handleFocus(e));
|
| 301 |
+
}
|
| 302 |
+
if (editBtn) {
|
| 303 |
+
editBtn.addEventListener('click', (e) => this.handleEdit(e));
|
| 304 |
+
}
|
| 305 |
+
if (deleteBtn) {
|
| 306 |
+
deleteBtn.addEventListener('click', (e) => this.handleDelete(e));
|
| 307 |
+
}
|
| 308 |
+
}
|
| 309 |
+
handleToggleComplete(e) {
|
| 310 |
const completed = e.target.checked;
|
| 311 |
this.dispatchEvent(new CustomEvent('toggle-complete', {
|
| 312 |
detail: { taskId: this.getAttribute('task-id'), completed },
|
index.html
CHANGED
|
@@ -16,14 +16,14 @@
|
|
| 16 |
<div class="flex items-center justify-between">
|
| 17 |
<h1 class="text-2xl font-bold text-orange-500">TaskForge Pro</h1>
|
| 18 |
<nav class="flex items-center space-x-4">
|
| 19 |
-
<
|
| 20 |
<i data-feather="home"></i> Übersicht
|
| 21 |
-
</
|
| 22 |
-
<
|
| 23 |
<i data-feather="settings"></i> Einstellungen
|
| 24 |
-
</
|
| 25 |
</nav>
|
| 26 |
-
|
| 27 |
</div>
|
| 28 |
</header>
|
| 29 |
<!-- Main Content -->
|
|
|
|
| 16 |
<div class="flex items-center justify-between">
|
| 17 |
<h1 class="text-2xl font-bold text-orange-500">TaskForge Pro</h1>
|
| 18 |
<nav class="flex items-center space-x-4">
|
| 19 |
+
<a href="#" id="view-home" class="nav-btn active" data-view="home">
|
| 20 |
<i data-feather="home"></i> Übersicht
|
| 21 |
+
</a>
|
| 22 |
+
<a href="#" id="view-settings" class="nav-btn" data-view="settings">
|
| 23 |
<i data-feather="settings"></i> Einstellungen
|
| 24 |
+
</a>
|
| 25 |
</nav>
|
| 26 |
+
</div>
|
| 27 |
</div>
|
| 28 |
</header>
|
| 29 |
<!-- Main Content -->
|
script.js
CHANGED
|
@@ -82,22 +82,20 @@ function updateCurrentTime() {
|
|
| 82 |
document.getElementById('current-time').textContent = timeString;
|
| 83 |
}
|
| 84 |
function setupEventListeners() {
|
| 85 |
-
|
| 86 |
document.querySelectorAll('.nav-btn').forEach(btn => {
|
| 87 |
btn.addEventListener('click', (e) => {
|
|
|
|
| 88 |
const view = e.currentTarget.dataset.view;
|
| 89 |
switchView(view);
|
| 90 |
});
|
| 91 |
});
|
| 92 |
-
|
| 93 |
-
// FAB buttons
|
| 94 |
document.getElementById('add-task-fab').addEventListener('click', openAddTaskModal);
|
| 95 |
document.getElementById('focus-fab').addEventListener('click', enterFocusMode);
|
| 96 |
-
|
| 97 |
// Add task modal
|
| 98 |
document.getElementById('add-task-form').addEventListener('submit', handleAddTask);
|
| 99 |
document.getElementById('cancel-task').addEventListener('click', closeAddTaskModal);
|
| 100 |
-
|
| 101 |
// Settings
|
| 102 |
document.getElementById('import-btn').addEventListener('click', handleImport);
|
| 103 |
document.getElementById('export-btn').addEventListener('click', handleExport);
|
|
@@ -105,13 +103,11 @@ function setupEventListeners() {
|
|
| 105 |
|
| 106 |
document.getElementById('pomodoro-work').addEventListener('change', savePomodoroSettings);
|
| 107 |
document.getElementById('pomodoro-break').addEventListener('change', savePomodoroSettings);
|
| 108 |
-
|
| 109 |
// Focus mode
|
| 110 |
document.getElementById('focus-pause').addEventListener('click', pausePomodoro);
|
| 111 |
document.getElementById('focus-play').addEventListener('click', resumePomodoro);
|
| 112 |
document.getElementById('focus-stop').addEventListener('click', stopPomodoro);
|
| 113 |
-
|
| 114 |
-
// Event delegation for task item events
|
| 115 |
document.addEventListener('delete-task', (e) => {
|
| 116 |
deleteTask(e.detail.taskId);
|
| 117 |
});
|
|
@@ -127,8 +123,7 @@ function setupEventListeners() {
|
|
| 127 |
document.addEventListener('add-time', (e) => {
|
| 128 |
addTimeToTask(e.detail.taskId, e.detail.minutes);
|
| 129 |
});
|
| 130 |
-
|
| 131 |
-
// Timeline sidebar events
|
| 132 |
const timelineSidebar = document.getElementById('timeline-sidebar');
|
| 133 |
if (timelineSidebar) {
|
| 134 |
timelineSidebar.addEventListener('task-dropped', (e) => {
|
|
@@ -394,12 +389,14 @@ function renderTasks() {
|
|
| 394 |
|
| 395 |
document.getElementById('open-count').textContent = openTasks.length;
|
| 396 |
document.getElementById('completed-count').textContent = completedTasks.length;
|
| 397 |
-
|
| 398 |
// Setup drag and drop for task items
|
| 399 |
setupTaskDragAndDrop();
|
| 400 |
|
| 401 |
// Replace feather icons
|
| 402 |
feather.replace();
|
|
|
|
|
|
|
|
|
|
| 403 |
}
|
| 404 |
function renderProgressBars() {
|
| 405 |
// Overall progress
|
|
@@ -729,7 +726,6 @@ function addTimeToTask(taskId, minutes) {
|
|
| 729 |
render();
|
| 730 |
}
|
| 731 |
}
|
| 732 |
-
|
| 733 |
function setupTaskDragAndDrop() {
|
| 734 |
const openContainer = document.getElementById('open-tasks');
|
| 735 |
const completedContainer = document.getElementById('completed-tasks');
|
|
@@ -752,6 +748,22 @@ function setupTaskDragAndDrop() {
|
|
| 752 |
});
|
| 753 |
}
|
| 754 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 755 |
function getDragAfterElement(container, y) {
|
| 756 |
const draggableElements = [...container.querySelectorAll('task-item:not(.dragging)'));
|
| 757 |
|
|
|
|
| 82 |
document.getElementById('current-time').textContent = timeString;
|
| 83 |
}
|
| 84 |
function setupEventListeners() {
|
| 85 |
+
// Navigation
|
| 86 |
document.querySelectorAll('.nav-btn').forEach(btn => {
|
| 87 |
btn.addEventListener('click', (e) => {
|
| 88 |
+
e.preventDefault();
|
| 89 |
const view = e.currentTarget.dataset.view;
|
| 90 |
switchView(view);
|
| 91 |
});
|
| 92 |
});
|
| 93 |
+
// FAB buttons
|
|
|
|
| 94 |
document.getElementById('add-task-fab').addEventListener('click', openAddTaskModal);
|
| 95 |
document.getElementById('focus-fab').addEventListener('click', enterFocusMode);
|
|
|
|
| 96 |
// Add task modal
|
| 97 |
document.getElementById('add-task-form').addEventListener('submit', handleAddTask);
|
| 98 |
document.getElementById('cancel-task').addEventListener('click', closeAddTaskModal);
|
|
|
|
| 99 |
// Settings
|
| 100 |
document.getElementById('import-btn').addEventListener('click', handleImport);
|
| 101 |
document.getElementById('export-btn').addEventListener('click', handleExport);
|
|
|
|
| 103 |
|
| 104 |
document.getElementById('pomodoro-work').addEventListener('change', savePomodoroSettings);
|
| 105 |
document.getElementById('pomodoro-break').addEventListener('change', savePomodoroSettings);
|
|
|
|
| 106 |
// Focus mode
|
| 107 |
document.getElementById('focus-pause').addEventListener('click', pausePomodoro);
|
| 108 |
document.getElementById('focus-play').addEventListener('click', resumePomodoro);
|
| 109 |
document.getElementById('focus-stop').addEventListener('click', stopPomodoro);
|
| 110 |
+
// Event delegation for task item events
|
|
|
|
| 111 |
document.addEventListener('delete-task', (e) => {
|
| 112 |
deleteTask(e.detail.taskId);
|
| 113 |
});
|
|
|
|
| 123 |
document.addEventListener('add-time', (e) => {
|
| 124 |
addTimeToTask(e.detail.taskId, e.detail.minutes);
|
| 125 |
});
|
| 126 |
+
// Timeline sidebar events
|
|
|
|
| 127 |
const timelineSidebar = document.getElementById('timeline-sidebar');
|
| 128 |
if (timelineSidebar) {
|
| 129 |
timelineSidebar.addEventListener('task-dropped', (e) => {
|
|
|
|
| 389 |
|
| 390 |
document.getElementById('open-count').textContent = openTasks.length;
|
| 391 |
document.getElementById('completed-count').textContent = completedTasks.length;
|
|
|
|
| 392 |
// Setup drag and drop for task items
|
| 393 |
setupTaskDragAndDrop();
|
| 394 |
|
| 395 |
// Replace feather icons
|
| 396 |
feather.replace();
|
| 397 |
+
|
| 398 |
+
// Re-attach event listeners to task items after render
|
| 399 |
+
reattachTaskEventListeners();
|
| 400 |
}
|
| 401 |
function renderProgressBars() {
|
| 402 |
// Overall progress
|
|
|
|
| 726 |
render();
|
| 727 |
}
|
| 728 |
}
|
|
|
|
| 729 |
function setupTaskDragAndDrop() {
|
| 730 |
const openContainer = document.getElementById('open-tasks');
|
| 731 |
const completedContainer = document.getElementById('completed-tasks');
|
|
|
|
| 748 |
});
|
| 749 |
}
|
| 750 |
|
| 751 |
+
function reattachTaskEventListeners() {
|
| 752 |
+
document.querySelectorAll('task-item').forEach(taskEl => {
|
| 753 |
+
// Remove existing listeners and re-add
|
| 754 |
+
const taskId = taskEl.getAttribute('task-id');
|
| 755 |
+
|
| 756 |
+
// Add event listeners for checkbox toggle
|
| 757 |
+
const checkbox = taskEl.shadowRoot?.querySelector('.task-checkbox');
|
| 758 |
+
if (checkbox) {
|
| 759 |
+
checkbox.addEventListener('change', (e) => {
|
| 760 |
+
const completed = e.target.checked;
|
| 761 |
+
toggleTaskComplete(taskId, completed);
|
| 762 |
+
});
|
| 763 |
+
|
| 764 |
+
}
|
| 765 |
+
});
|
| 766 |
+
}
|
| 767 |
function getDragAfterElement(container, y) {
|
| 768 |
const draggableElements = [...container.querySelectorAll('task-item:not(.dragging)'));
|
| 769 |
|