diff --git a/static/js/offline-tasks.js b/static/js/offline-tasks.js
index fb4a9ad..916741b 100644
--- a/static/js/offline-tasks.js
+++ b/static/js/offline-tasks.js
@@ -114,9 +114,16 @@ function escapeHtml(str) {
return div.innerHTML;
}
+function isTaskOverdue(task) {
+ // Mirrors Task.is_overdue in tasks/models.py.
+ if (!task.due_date || task.status === 'completed' || task.status === 'cancelled') return false;
+ return task.due_date < todayLocalStr();
+}
+
function renderTaskItem(task, tagsBySyncId) {
+ const overdue = isTaskOverdue(task);
const item = document.createElement('div');
- item.className = `task-item priority-${task.priority}${task.status === 'completed' ? ' completed' : ''}`;
+ item.className = `task-item priority-${task.priority}${overdue ? ' overdue' : ''}${task.status === 'completed' ? ' completed' : ''}`;
const toggleForm = document.createElement('button');
toggleForm.type = 'button';
@@ -140,13 +147,13 @@ function renderTaskItem(task, tagsBySyncId) {
const metaParts = [];
if (task.due_date) {
- metaParts.push(`📅 ${formatDueDate(task.due_date)}`);
+ metaParts.push(`📅 ${formatDueDate(task.due_date)}`);
}
const tagChips = renderTagChips(task, tagsBySyncId);
if (metaParts.length || tagChips) {
const meta = document.createElement('div');
meta.className = 'task-meta';
- meta.innerHTML = metaParts.map((p) => `${p}`).join(' ') + tagChips;
+ meta.innerHTML = metaParts.join(' ') + tagChips;
content.appendChild(meta);
}
diff --git a/templates/sw.js b/templates/sw.js
index 026ef13..b85a8f6 100644
--- a/templates/sw.js
+++ b/templates/sw.js
@@ -1,4 +1,4 @@
-{% load static %}const CACHE_NAME = 'keepitgoing-shell-v6';
+{% load static %}const CACHE_NAME = 'keepitgoing-shell-v7';
const OFFLINE_URL = '{% url "offline" %}';
const OFFLINE_TASKS_URL = '{% url "offline-tasks" %}';