tasks
This commit is contained in:
@@ -16,12 +16,15 @@
|
||||
<!-- Tasks for current activity -->
|
||||
{% if tasks %}
|
||||
<div style="margin: 1rem 0; padding: 1rem; background: rgba(255,255,255,0.7); border-radius: 5px;">
|
||||
<h4>Tasks related to {{ current_entry.activity_name }}:</h4>
|
||||
<h4>Active Tasks:</h4>
|
||||
{% for task in tasks %}
|
||||
<div style="margin-bottom: 5px;">
|
||||
<div style="margin-bottom: 5px; display: flex; align-items: center;">
|
||||
<input type="checkbox" id="task_{{ task._id }}"
|
||||
onchange="completeTask('{{ task.name }}', '{{ current_entry._id }}', this)">
|
||||
<label for="task_{{ task._id }}">{{ task.name }}</label>
|
||||
{% if task.status == 'completed' %}checked{% endif %}
|
||||
onchange="toggleTask('{{ task._id }}', this)">
|
||||
<label for="task_{{ task._id }}" style="margin-left: 10px; flex-grow: 1; {% if task.status == 'completed' %}text-decoration: line-through;{% endif %}">
|
||||
<a href="{{ url_for('task_detail', task_id=task._id) }}">{{ task.name }}</a>
|
||||
</label>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
@@ -52,18 +55,20 @@
|
||||
updateTimer(); // run immediately
|
||||
|
||||
// AJAX for Tasks
|
||||
function completeTask(name, entryId, checkbox) {
|
||||
if(!checkbox.checked) return; // Only track completion for now
|
||||
|
||||
function toggleTask(taskId, checkbox) {
|
||||
const formData = new FormData();
|
||||
formData.append('task_name', name);
|
||||
formData.append('entry_id', entryId);
|
||||
formData.append('task_id', taskId);
|
||||
formData.append('is_checked', checkbox.checked);
|
||||
|
||||
fetch('/complete_task', { method: 'POST', body: formData })
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
checkbox.disabled = true; // Prevent double logging
|
||||
checkbox.parentElement.style.textDecoration = "line-through";
|
||||
const label = checkbox.nextElementSibling;
|
||||
if(checkbox.checked) {
|
||||
label.style.textDecoration = "line-through";
|
||||
} else {
|
||||
label.style.textDecoration = "none";
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
<div>
|
||||
{% if session.user_id %}
|
||||
<a href="{{ url_for('index') }}">Tracker</a>
|
||||
<a href="{{ url_for('tasks') }}">Tasks</a> <!-- Added -->
|
||||
<a href="{{ url_for('logbook') }}">Logbook</a>
|
||||
<a href="{{ url_for('logout') }}">Logout</a>
|
||||
{% else %}
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
<strong>Tasks Completed:</strong>
|
||||
<ul style="margin: 5px 0; padding-left: 20px;">
|
||||
{% for task in entry.tasks %}
|
||||
<li>{{ task.task_name }} <small>({{ task.completed_at.strftime('%H:%M') }})</small></li>
|
||||
<li>{{ task.name }} <small>({{ task.completed_at.strftime('%H:%M') if task.completed_at else 'Done' }})</small></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
39
templates/task_detail.html
Normal file
39
templates/task_detail.html
Normal file
@@ -0,0 +1,39 @@
|
||||
{% extends "layout.html" %}
|
||||
{% block content %}
|
||||
<div class="card">
|
||||
<div style="display: flex; justify-content: space-between; align-items: start;">
|
||||
<div>
|
||||
<h2>{{ task.name }}</h2>
|
||||
<p>
|
||||
<strong>Status:</strong> {{ task.status|upper }}<br>
|
||||
{% if task.is_template %}
|
||||
<span style="background: #f39c12; color: white; padding: 3px 8px; border-radius: 5px;">Template (Auto-Add)</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
<a href="{{ url_for('tasks') }}" class="btn" style="background: #95a5a6;">Back to Tasks</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h3>Comments</h3>
|
||||
|
||||
<div style="background: #f9f9f9; padding: 1rem; border-radius: 5px; margin-bottom: 2rem;">
|
||||
{% if task.comments %}
|
||||
{% for comment in task.comments %}
|
||||
<div style="border-bottom: 1px solid #ddd; padding: 10px 0;">
|
||||
<p style="margin: 0;">{{ comment.text }}</p>
|
||||
<small style="color: #999;">{{ comment.created_at.strftime('%Y-%m-%d %H:%M') }}</small>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<p style="color: #ccc;">No comments yet.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<form method="POST">
|
||||
<textarea name="comment" rows="3" style="width: 100%; border: 1px solid #ddd; border-radius: 5px; padding: 0.5rem;" placeholder="Write a comment..." required></textarea>
|
||||
<button type="submit" class="btn" style="margin-top: 10px;">Add Comment</button>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
79
templates/tasks.html
Normal file
79
templates/tasks.html
Normal file
@@ -0,0 +1,79 @@
|
||||
{% extends "layout.html" %}
|
||||
{% block content %}
|
||||
<div style="display: flex; gap: 2rem; flex-wrap: wrap;">
|
||||
<!-- Create Task Form -->
|
||||
<div class="card" style="flex: 1; min-width: 300px;">
|
||||
<h3>Create New Task</h3>
|
||||
<form action="{{ url_for('create_task') }}" method="POST">
|
||||
<label>Task Name</label>
|
||||
<input type="text" name="name" required placeholder="e.g. Write Report">
|
||||
|
||||
<label>Associate with Activity (Optional)</label>
|
||||
<select name="activity_id" style="width: 100%; padding: 0.5rem; margin-bottom: 1rem;">
|
||||
<option value="">-- None --</option>
|
||||
{% for act in activities %}
|
||||
<option value="{{ act._id }}">{{ act.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
|
||||
<label>Due Date & Time (Optional)</label>
|
||||
<input type="datetime-local" name="due_date" style="width: 100%; padding: 0.5rem; margin-bottom: 1rem;">
|
||||
|
||||
<div style="margin-bottom: 1rem;">
|
||||
<input type="checkbox" id="is_template" name="is_template" value="1">
|
||||
<label for="is_template"><strong>Auto-add on Start?</strong> (If checked, this task is added every time the selected activity starts)</label>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn">Create Task</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Task Lists -->
|
||||
<div style="flex: 2; min-width: 300px;">
|
||||
<!-- Regular Tasks -->
|
||||
<div class="card">
|
||||
<h3>Pending Tasks</h3>
|
||||
{% if not tasks %}
|
||||
<p>No open tasks.</p>
|
||||
{% else %}
|
||||
<ul style="list-style: none; padding: 0;">
|
||||
{% for task in tasks %}
|
||||
<li style="border-bottom: 1px solid #eee; padding: 10px 0;">
|
||||
<div style="display: flex; justify-content: space-between;">
|
||||
<a href="{{ url_for('task_detail', task_id=task._id) }}" style="font-weight: bold;">{{ task.name }}</a>
|
||||
{% if task.activity_name %}
|
||||
<span style="background: {{ task.activity_color }}; color: white; padding: 2px 8px; border-radius: 10px; font-size: 0.8rem;">
|
||||
{{ task.activity_name }}
|
||||
</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% if task.due_date %}
|
||||
<small style="color: #e74c3c;">Due: {{ task.due_date.strftime('%Y-%m-%d %H:%M') }}</small>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Templates -->
|
||||
<div class="card" style="background: #fdfdfd;">
|
||||
<h3>Auto-Added Templates</h3>
|
||||
<small>These tasks are automatically created when you start the associated activity.</small>
|
||||
{% if not templates %}
|
||||
<p>No templates defined.</p>
|
||||
{% else %}
|
||||
<ul style="padding-left: 20px;">
|
||||
{% for t in templates %}
|
||||
<li>
|
||||
<strong>{{ t.name }}</strong>
|
||||
<span style="color: #666;">(on {{ t.activity_name|default('Unknown Activity') }})</span>
|
||||
<a href="{{ url_for('task_detail', task_id=t._id) }}" style="font-size: 0.8rem;">[Edit]</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user