Make Weekly Tasks a parent card with individual weeks subordinate to it

Weekly task sheets are pulled out of the flat sidebar list into their own
WEEKLY_TASKS_DATA array. "Weekly Tasks" is now one top-level card among the
track cards; selecting it drills into a breadcrumb view (Weekly Tasks >
Week of...) with a week picker on the left and the selected week's full
detail (table/notes/reports) on the right, using the same buildTaskDetail
renderer as before. Sets up for multiple weeks to coexist cleanly.
This commit is contained in:
beantownbabe committed 2026-08-21 14:15:00 +02:00
1 parent ba6c8bac1d
commit 2a5607e56e
1 file changed
+71 -4
+71 -4
View File
@@ -6314,6 +6314,9 @@
],
reports: []
},
];
var WEEKLY_TASKS_DATA = [
{
id: "week-2026-08-17",
label: "Week of 17–21 Aug 2026",
@@ -6334,7 +6337,10 @@
]
}
];
var WEEKLY_TASKS_PARENT_ID = "weekly-tasks-parent";
var tasksSelectedId = null;
var weeklySelectedId = null;
function tasksEsc(s) {
return String(s == null ? "" : s).replace(/[&<>"]/g, function (c) {
@@ -6344,8 +6350,8 @@
function renderTasksBoard() {
var sorted = TASKS_DATA; // newest-first order is authored order for now
if (!tasksSelectedId || !sorted.some(function (t) { return t.id === tasksSelectedId; })) {
tasksSelectedId = sorted.length ? sorted[0].id : null;
if (!tasksSelectedId || (tasksSelectedId !== WEEKLY_TASKS_PARENT_ID && !sorted.some(function (t) { return t.id === tasksSelectedId; }))) {
tasksSelectedId = sorted.length ? sorted[0].id : WEEKLY_TASKS_PARENT_ID;
}
var list = document.getElementById("tasks-list");
@@ -6353,10 +6359,71 @@
sorted.forEach(function (entry) {
list.appendChild(buildTaskSidebarCard(entry, entry.id === tasksSelectedId));
});
list.appendChild(buildWeeklyParentSidebarCard(tasksSelectedId === WEEKLY_TASKS_PARENT_ID));
var detail = document.getElementById("tasks-detail");
var selected = sorted.filter(function (t) { return t.id === tasksSelectedId; })[0];
detail.innerHTML = selected ? buildTaskDetail(selected) : "<div class=\"ab-outreach-empty\">No tasks yet.</div>";
if (tasksSelectedId === WEEKLY_TASKS_PARENT_ID) {
detail.innerHTML = buildWeeklyTasksDrilldown();
wireWeeklyDrilldown();
} else {
var selected = sorted.filter(function (t) { return t.id === tasksSelectedId; })[0];
detail.innerHTML = selected ? buildTaskDetail(selected) : "<div class=\"ab-outreach-empty\">No tasks yet.</div>";
}
}
function buildWeeklyParentSidebarCard(isSelected) {
var card = document.createElement("div");
card.className = "ab-card" + (isSelected ? " selected" : "");
card.dataset.id = WEEKLY_TASKS_PARENT_ID;
card.innerHTML =
"<div class=\"ab-card-top\">" +
"<div class=\"ab-card-company\">Weekly Tasks</div>" +
"<span class=\"ab-source-chip boss\">" + WEEKLY_TASKS_DATA.length + (WEEKLY_TASKS_DATA.length === 1 ? " week" : " weeks") + "</span>" +
"</div>" +
"<div class=\"ab-card-name\">Peter's weekly task sheets</div>";
card.addEventListener("click", function () {
tasksSelectedId = WEEKLY_TASKS_PARENT_ID;
renderTasksBoard();
});
return card;
}
function buildWeeklyTasksDrilldown() {
if (!weeklySelectedId || !WEEKLY_TASKS_DATA.some(function (w) { return w.id === weeklySelectedId; })) {
weeklySelectedId = WEEKLY_TASKS_DATA.length ? WEEKLY_TASKS_DATA[0].id : null;
}
var selectedWeek = WEEKLY_TASKS_DATA.filter(function (w) { return w.id === weeklySelectedId; })[0];
var crumbs =
"<div class=\"drill-crumbs\">" +
"<span class=\"crumb\">Weekly Tasks</span>" +
(selectedWeek ? "<span class=\"sep\">/</span><span class=\"crumb current\">" + tasksEsc(selectedWeek.label) + "</span>" : "") +
"</div>";
var weekListHtml = WEEKLY_TASKS_DATA.map(function (w) {
return "<div class=\"ab-card" + (w.id === weeklySelectedId ? " selected" : "") + "\" data-week-id=\"" + w.id + "\">" +
"<div class=\"ab-card-company\">" + tasksEsc(w.label) + "</div>" +
"</div>";
}).join("");
var weekDetailHtml = selectedWeek ? buildTaskDetail(selectedWeek) : "<div class=\"ab-outreach-empty\">No weekly sheets yet.</div>";
return (
crumbs +
"<div class=\"ab-outreach\" style=\"display:flex; margin-top:12px;\">" +
"<div class=\"ab-outreach-list\" style=\"width:260px;\">" + weekListHtml + "</div>" +
"<div class=\"ab-outreach-detail\">" + weekDetailHtml + "</div>" +
"</div>"
);
}
function wireWeeklyDrilldown() {
document.querySelectorAll("#tasks-detail [data-week-id]").forEach(function (el) {
el.addEventListener("click", function () {
weeklySelectedId = el.getAttribute("data-week-id");
renderTasksBoard();
});
});
}
function buildTaskSidebarCard(entry, isSelected) {