Spaces:
Running
Running
Weiterhin steht in "offene Aufgaben" nur für jeden Eintrag einmal "Lädt…". Dort sollen die Aufgaben dynamisch aufgelistet werden, bearbeitet werden können und im Pomodoro gestartet werden können. Auch im Pomodoro Modus will ich die ausgewählte Aufgabe auswählen können. Stelle sicher, dass alles wie beschrieben funktioniert!
Browse files- components/task-item.js +6 -7
- script.js +50 -22
components/task-item.js
CHANGED
|
@@ -291,15 +291,14 @@ const { title, estimatedTime, spentTime, tags } = this.task;
|
|
| 291 |
this.classList.remove('completed');
|
| 292 |
}
|
| 293 |
}
|
| 294 |
-
|
| 295 |
handleFocus(e) {
|
| 296 |
-
this.
|
| 297 |
-
|
| 298 |
-
|
| 299 |
-
|
|
|
|
| 300 |
}
|
| 301 |
-
|
| 302 |
-
handleEdit(e) {
|
| 303 |
const editForm = this.shadowRoot.querySelector('.edit-form');
|
| 304 |
editForm.classList.add('active');
|
| 305 |
}
|
|
|
|
| 291 |
this.classList.remove('completed');
|
| 292 |
}
|
| 293 |
}
|
|
|
|
| 294 |
handleFocus(e) {
|
| 295 |
+
const taskId = this.getAttribute('task-id');
|
| 296 |
+
const task = state.tasks.find(t => t.id === taskId);
|
| 297 |
+
if (task) {
|
| 298 |
+
startFocusMode(task);
|
| 299 |
+
}
|
| 300 |
}
|
| 301 |
+
handleEdit(e) {
|
|
|
|
| 302 |
const editForm = this.shadowRoot.querySelector('.edit-form');
|
| 303 |
editForm.classList.add('active');
|
| 304 |
}
|
script.js
CHANGED
|
@@ -347,7 +347,6 @@ function render() {
|
|
| 347 |
renderTags();
|
| 348 |
renderTimeline();
|
| 349 |
}
|
| 350 |
-
|
| 351 |
function renderTasks() {
|
| 352 |
const openContainer = document.getElementById('open-tasks');
|
| 353 |
const completedContainer = document.getElementById('completed-tasks');
|
|
@@ -359,34 +358,36 @@ function renderTasks() {
|
|
| 359 |
if (openTasks.length === 0) {
|
| 360 |
openContainer.innerHTML = '<div class="empty-state"><i data-feather="inbox"></i><p>Keine offenen Aufgaben</p></div>';
|
| 361 |
} else {
|
| 362 |
-
openContainer.innerHTML = openTasks.map(task =>
|
| 363 |
-
|
| 364 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 365 |
}
|
| 366 |
|
| 367 |
// Render completed tasks
|
| 368 |
if (completedTasks.length === 0) {
|
| 369 |
completedContainer.innerHTML = '<div class="empty-state"><i data-feather="check-circle"></i><p>Keine erledigten Aufgaben</p></div>';
|
| 370 |
} else {
|
| 371 |
-
completedContainer.innerHTML = completedTasks.map(task =>
|
| 372 |
-
|
| 373 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 374 |
}
|
| 375 |
|
| 376 |
document.getElementById('open-count').textContent = openTasks.length;
|
| 377 |
document.getElementById('completed-count').textContent = completedTasks.length;
|
| 378 |
|
| 379 |
-
//
|
| 380 |
-
|
| 381 |
-
const taskId = el.getAttribute('task-id');
|
| 382 |
-
const task = state.tasks.find(t => t.id === taskId);
|
| 383 |
-
if (task) {
|
| 384 |
-
el.task = task;
|
| 385 |
-
el.tags = state.tags;
|
| 386 |
-
}
|
| 387 |
-
});
|
| 388 |
}
|
| 389 |
-
|
| 390 |
function renderProgressBars() {
|
| 391 |
// Overall progress
|
| 392 |
const totalEstimated = state.tasks.reduce((sum, t) => sum + t.estimatedTime, 0) || 1;
|
|
@@ -558,16 +559,43 @@ function scrollToCurrentTime() {
|
|
| 558 |
|
| 559 |
// Focus Mode & Pomodoro
|
| 560 |
function enterFocusMode() {
|
| 561 |
-
|
| 562 |
-
|
|
|
|
| 563 |
alert('Keine offenen Aufgaben für den Fokus-Modus!');
|
| 564 |
return;
|
| 565 |
}
|
| 566 |
-
|
| 567 |
-
const
|
| 568 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 569 |
}
|
| 570 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 571 |
function startFocusMode(task) {
|
| 572 |
state.focusTask = task;
|
| 573 |
document.getElementById('focus-task-title').textContent = task.title;
|
|
|
|
| 347 |
renderTags();
|
| 348 |
renderTimeline();
|
| 349 |
}
|
|
|
|
| 350 |
function renderTasks() {
|
| 351 |
const openContainer = document.getElementById('open-tasks');
|
| 352 |
const completedContainer = document.getElementById('completed-tasks');
|
|
|
|
| 358 |
if (openTasks.length === 0) {
|
| 359 |
openContainer.innerHTML = '<div class="empty-state"><i data-feather="inbox"></i><p>Keine offenen Aufgaben</p></div>';
|
| 360 |
} else {
|
| 361 |
+
openContainer.innerHTML = openTasks.map(task => {
|
| 362 |
+
const taskElement = document.createElement('task-item');
|
| 363 |
+
taskElement.setAttribute('task-id', task.id);
|
| 364 |
+
taskElement.setAttribute('completed', 'false');
|
| 365 |
+
taskElement.task = task;
|
| 366 |
+
taskElement.tags = state.tags;
|
| 367 |
+
return taskElement.outerHTML;
|
| 368 |
+
}).join('');
|
| 369 |
}
|
| 370 |
|
| 371 |
// Render completed tasks
|
| 372 |
if (completedTasks.length === 0) {
|
| 373 |
completedContainer.innerHTML = '<div class="empty-state"><i data-feather="check-circle"></i><p>Keine erledigten Aufgaben</p></div>';
|
| 374 |
} else {
|
| 375 |
+
completedContainer.innerHTML = completedTasks.map(task => {
|
| 376 |
+
const taskElement = document.createElement('task-item');
|
| 377 |
+
taskElement.setAttribute('task-id', task.id);
|
| 378 |
+
taskElement.setAttribute('completed', 'true');
|
| 379 |
+
taskElement.task = task;
|
| 380 |
+
taskElement.tags = state.tags;
|
| 381 |
+
return taskElement.outerHTML;
|
| 382 |
+
}).join('');
|
| 383 |
}
|
| 384 |
|
| 385 |
document.getElementById('open-count').textContent = openTasks.length;
|
| 386 |
document.getElementById('completed-count').textContent = completedTasks.length;
|
| 387 |
|
| 388 |
+
// Replace feather icons
|
| 389 |
+
feather.replace();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 390 |
}
|
|
|
|
| 391 |
function renderProgressBars() {
|
| 392 |
// Overall progress
|
| 393 |
const totalEstimated = state.tasks.reduce((sum, t) => sum + t.estimatedTime, 0) || 1;
|
|
|
|
| 559 |
|
| 560 |
// Focus Mode & Pomodoro
|
| 561 |
function enterFocusMode() {
|
| 562 |
+
// Open a task selection modal
|
| 563 |
+
const openTasks = state.tasks.filter(t => !t.completed);
|
| 564 |
+
if (openTasks.length === 0) {
|
| 565 |
alert('Keine offenen Aufgaben für den Fokus-Modus!');
|
| 566 |
return;
|
| 567 |
}
|
| 568 |
+
|
| 569 |
+
const modal = document.createElement('div');
|
| 570 |
+
modal.className = 'fixed inset-0 bg-black bg-opacity-50 z-50 flex items-center justify-center p-4';
|
| 571 |
+
modal.innerHTML = `
|
| 572 |
+
<div class="bg-gray-800 rounded-xl p-6 max-w-md w-full max-h-[80vh] overflow-y-auto">
|
| 573 |
+
<h3 class="text-xl font-semibold mb-4">Aufgabe für Fokus-Modus auswählen</h3>
|
| 574 |
+
<div class="space-y-2">
|
| 575 |
+
${openTasks.map(task => `
|
| 576 |
+
<div class="bg-gray-700 p-3 rounded-lg cursor-pointer hover:bg-gray-600 transition"
|
| 577 |
+
onclick="startFocusModeWithId('${task.id}')">
|
| 578 |
+
<div class="font-medium">${task.title}</div>
|
| 579 |
+
<div class="text-sm text-gray-400">${formatTime(task.estimatedTime)}</div>
|
| 580 |
+
</div>
|
| 581 |
+
`).join('')}
|
| 582 |
+
</div>
|
| 583 |
+
<button onclick="this.closest('div[class*=\"fixed\"]').remove()"
|
| 584 |
+
class="mt-4 px-4 py-2 bg-gray-700 hover:bg-gray-600 rounded-lg transition w-full">
|
| 585 |
+
Abbrechen
|
| 586 |
+
</button>
|
| 587 |
+
</div>
|
| 588 |
+
`;
|
| 589 |
+
document.body.appendChild(modal);
|
| 590 |
}
|
| 591 |
|
| 592 |
+
function startFocusModeWithId(taskId) {
|
| 593 |
+
const task = state.tasks.find(t => t.id === taskId);
|
| 594 |
+
if (task) {
|
| 595 |
+
document.querySelector('div[class*="fixed"]')?.remove();
|
| 596 |
+
startFocusMode(task);
|
| 597 |
+
}
|
| 598 |
+
}
|
| 599 |
function startFocusMode(task) {
|
| 600 |
state.focusTask = task;
|
| 601 |
document.getElementById('focus-task-title').textContent = task.title;
|